diff --git a/README.md b/README.md index 8091762a3777bcba0afa50958f319166ce53120a..cb4632fd27561de756107d5fd5ca66a7a2946e0b 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,11 @@ coderMaker 立足于低代码平台,致力于解决软件开发过程中的效 0. 所建即所得,文档即代码的代码生成服务理念 1. 提供便捷且所建即所得的代码生成服务 2. 提供便捷的sql脚本(支持分库分表)生成服务 -3. 提供一键式的数据库e-r图生成服务 +3. 提供一键式的数据库e-r图生成服务,以及从plantUML-er图中解析还原到sql脚本的能力 4. 提供基于springboot,cola,dubbo应用框架和架构下的应用级代码生成服务 5. 提供基于plantuml类图的dynamic-ddd模块级的代码生成服务 6. 支持基于数据库表的代码生成和支持plantuml领域文档的代码生成服务 +7. 支持基于数据库表+DDD+plantUML类图文档+plantUML调用时序文档的代码生成服务 #### 软件架构 1. 整个项目分为多个工程模块 @@ -59,13 +60,80 @@ codemaker-cola:基于cola应用框架生成的代码会放在这里 #### 版本变更 -1. 实现codermaker-core代码生成功能 1.0.0 -2. 实现数据库表sql生成功能 1.0.0 -3. 实现数据库表e-r图生成功能 1.0.1 -4. 实现代码生成极速模式 1.0.2 -5. 实现dubbo应用的代码生成 1.0.3,详情见changeList文件 -6. 实现ddd业务模型的代码生成 1.0.4,详情见changeList文件 -7. 实现springboot,cola,dubbo+ddd的代码生成 1.1.0,详情见changeList文件 +##### 版本-1.0.0 + +简介: 实现codermaker-core代码生成功能 + +##### 版本-1.0.1 +简介: 实现数据库表e-r图生成功能 + +##### 版本-1.0.2 +简介: 实现代码生成极速模式 + +##### 版本-1.0.3 +简介: 实现dubbo应用的代码生成 + +##### 版本-1.0.4 +简介: 实现ddd业务模型的代码生成 + +1. 基于plantUML文档生成代码,基于ddd思想和模式生成模块级的代码内容 +2. 增加makeddd接口,支持生成dynamicddd模块的代码 +3. 引入支持ddd代码生成的配置(projecttemplate-dynamicddd.properties)和代码模板(template/dynamicddd) +4. codemaker-core模块resources目录增加ddd-plantuml目录存放plantUML类图 +5. 支持ddd的一些模式代码生成:实体模式,值对象模式,聚合根模式,工厂模式,仓库模式,防腐层模式,服务模式,模块模式,CQE模式,领域网关 +6. 产出部分公共代码生成服务方法 +7. 优化代码生成核心链路代码模型,针对ddd代码生成做了分层处理 +8. 修复若干其他bug + +##### 版本-0.0.2 +简介: 本次版本新增codemaker-dberparse模块,支持plantuml er图解析为sql ddl create语句,已集成到codemaker-dbops + 模块中。 +##### 版本-1.1.0 +简介: 实现springboot,cola,dubbo+ddd的代码生成 + +1. 支持cola应用架构代码生成,增加cola应用的template代码模板 +2. 增加基于plantuml类图的领域服务代码生成接口 + /getproject/valueobject + /getproject/msgbody + /getproject/gataway + /getproject/acladapter + /getproject/command + /getproject/executor + /getproject/factory + /getproject/dtoboconvert + /getproject/voboconvert + /getproject/doboconvert +3. 精简不同应用框架的代码生成配置 + 在每个应用框架配置下增加dubbo.domain.plantuml配置项,配置plantuml类图文件名称,支持基于类图-ddd的代码生成 + 如果不配置则不能借助plantuml类图生成基于领域服务ddd的代码,而是生成基于数据库表的常规代码 + 去除以下三个配置,集中到application.properties文件中 + *.global.package + *.global.author + *.global.applicationName + +4. 在springboot,cola,dubbo的代码模板目录下增加ddd元素的tempalte代码模板 +5. 将dynamic-ddd的代码生成服务整合到springboot,cola,dubbo的代码生成服务中,支持基于DDD思想的代码生成 +6. 扩展plantuml中类图标签,基于BO派生多个代码生成对象(vo,dto,facade,doboconvert,controller,voboconvert,dtoboconvert) +7. 整合底层代码支持一套api,一套服务支撑springboot,cola,dubbo应用级代码生成和dynamic-ddd模块级代码生成 +8. 修复多个兼容性bug +9. 整体上支持基于数据库表结构的代码生成和基于plantUML类图文档的代码生成 + +##### 版本-1.2.0-alpha +简介: 实现springboot,cola,dubbo+ddd的代码生成的基础上增加解析调用时序图的逻辑,将调用时序代码逻辑融入到生成的代码方法里 +1. 支持event模型生成, +2. 支持mqconsumer,applistener,mqproducer,mqhandler生成 +3. 屏蔽扩展类dto带有bo属性的字段 +4. 增加对plantuml domain类图内容的校验,比如重复字段和重复方法 +5. 扩展动态ddd的代码生成能力,比如一个BO下出现多个facade,controller的接口 +6. 提高plantuml内容的解析兼容性和稳定性 +7. 增加解析plantUML调用时序文档的能力,并将调用逻辑融入代码生成的方法里 +8. 支持读写分离的dubbo,restController接口调用 +9. 支持将领域值对象枚举类暴露到rpc client端 +10. 优化convert代码生成 +11. gatawayimpl 与 repositoryimpl分开生成 +12. 优化包路径生成模式 +13. 优化访问描述符和代码注释 +14. 读取plantuml文件对于方法的解析将方法参数独立解析出来 #### 配置文件说明 1.application.properties:代码生成服务的核心配置 diff --git a/changeList b/changeList index b9707e74063a1fde000401523214c01c816b7842..169e108ee3198bc2e5d81e1375954d64f0eda48a 100644 --- a/changeList +++ b/changeList @@ -61,3 +61,31 @@ 模块中。 +9. verison 1.2.0-alpha 变更 + 1.支持event模型生成, + 2.支持mqconsumer,applistener,mqproducer,mqhandler生成 + 3.屏蔽扩展类dto带有bo属性的字段 + 4.增加对plantuml domain类图内容的校验,比如重复字段和重复方法 + 5.扩展动态ddd的代码生成能力,比如一个BO下出现多个facade,controller的接口 + 6.提高plantuml内容的解析兼容性和稳定性 + 7.支持动态链路调用plantuml-调用链路图解析 + 8.支持读写分离的dubbo,restController接口调用 + 9.支持将领域值对象枚举类暴露到dubbo client端 + 10.优化convert代码生成 + 11.gatawayimpl 与 repositoryimpl分开生成 + 12.优化包路径生成模式 + 13.优化访问描述符和代码注释 + 14.读取plantuml文件对于方法的解析将方法参数独立解析出来 + + + +10. verison 1.2.1-beta 变更(todo) + 1.支持默认带工具类SpringEventPublisher帮助事件发布与消费异步化 + 2.支持事件发布异步化的代码绘制(产生事件->发布->消费事件) + 3.重构读取plantUML文件的相关逻辑降低复杂度 + 4.重新梳理读取plantUML文件的相关路径,优化为按项目维度分别存放 + 5.支持复杂场景下的代码绘制能力,进行精细化控制(如listbo,listvo的转换,代码参数动态绘制引用等) + 6.支持Page对象生成到代码里 + 7.支持通过时序图的调用方法列表补充构建接口和类的方法,辅助完善业务调用流程(如xxMapper.getByCode不在XXMapper里,则通过时序图里的信息进行动态补充) + 8.根据动态调用方法绘制内容将return body也进行动态化绘制 + 9.增加对基础设施层-适配层的调用绘制 \ No newline at end of file diff --git a/codemaker-cola/cola-app/pom.xml b/codemaker-cola/cola-app/pom.xml index f3b15d6aba96960b2e5dd60d6b3a8a512ce65e18..8e220c1a22d1d1623801507f36f9cd5ef8f7473b 100644 --- a/codemaker-cola/cola-app/pom.xml +++ b/codemaker-cola/cola-app/pom.xml @@ -55,20 +55,6 @@ 1.0.2-SNAPSHOT - - com.codemaker.dubbo - dubbo-api - 1.0-SNAPSHOT - - - - - - - com.codemaker.dubbo - dubbo-common - 1.0-SNAPSHOT - diff --git a/codemaker-cola/cola-infrast/pom.xml b/codemaker-cola/cola-infrast/pom.xml index df2696b46093f95c0608cf83548d7e0223a70a49..5d141910db19e9b0b0298da9c720e4a5d9c52eb6 100644 --- a/codemaker-cola/cola-infrast/pom.xml +++ b/codemaker-cola/cola-infrast/pom.xml @@ -10,8 +10,8 @@ 1.0-SNAPSHOT - org.example - codemaker-cola + com.codemaker.cola + cola-infrast 1.0-SNAPSHOT cola-infrast diff --git a/codemaker-core/pom.xml b/codemaker-core/pom.xml index e2ff729a6672c15bf8ee1e889877b9f4ce6abcaa..74b169ce6d5176341ab043bd17750d1a560e1da3 100644 --- a/codemaker-core/pom.xml +++ b/codemaker-core/pom.xml @@ -11,7 +11,7 @@ com.coderman.codemaker codemaker-core - 1.1.0-SNAPSHOT + 1.2.0-- codemaker-core @@ -161,17 +161,12 @@ spring-boot-test test - - org.springframework.boot - spring-boot-test - test - com.coderman.codermaker.dbergenerator codemaker-dbergenerator - 1.0.0-SNAPSHOT + 1.0.1-SNAPSHOT diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/ImportPackageService.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/ImportPackageService.java index 952b361e0e40cf4fdc7e95554f267f7a764e14b3..827ef3ea22a5208b28ad32fc91a1f93d19acc3cd 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/ImportPackageService.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/ImportPackageService.java @@ -42,59 +42,61 @@ public class ImportPackageService { importClassSet.addAll(abstractClassBean.getImportClassList()); } - //对方法进行探测 - abstractClassBean.getMethodBeanList().forEach(methodBean -> { - String returnClassName = methodBean.getReturnClass(); + if(CollectionUtils.isNotEmpty(abstractClassBean.getMethodBeanList())){ + //对方法进行探测 + abstractClassBean.getMethodBeanList().forEach(methodBean -> { + String returnClassName = methodBean.getReturnClass(); - String defaultPackageName = defaultPackageConfig.getPackage(returnClassName); - if(!StringUtils.isEmpty(defaultPackageName)){ - importClassSet.add(defaultPackageName); - } + String defaultPackageName = defaultPackageConfig.getPackage(returnClassName); + if(!StringUtils.isEmpty(defaultPackageName)){ + importClassSet.add(defaultPackageName); + } - String methodName = methodBean.getMethodName(); + String methodName = methodBean.getMethodName(); - //对方法参数进行探测 - String params = methodName.substring(methodName.indexOf("(")).replace("(","").replace(")","").trim(); - if(StringUtils.isNotEmpty(params) && params.length() > 3){ - String [] arr = params.split(","); - for (String param : arr){ - String importPackage = defaultPackageConfig.getPackage(param.trim()); - if(!StringUtils.isEmpty(importPackage)){ - importClassSet.add(importPackage); + //对方法参数进行探测 + String params = methodName.substring(methodName.indexOf("(")).replace("(","").replace(")","").trim(); + if(StringUtils.isNotEmpty(params) && params.length() > 3){ + String [] arr = params.split(","); + for (String param : arr){ + String importPackage = defaultPackageConfig.getPackage(param.trim()); + if(!StringUtils.isEmpty(importPackage)){ + importClassSet.add(importPackage); + } } } - } - plantUmlContextBean.getClassBeanMap().forEach((k,v)->{ + plantUmlContextBean.getClassBeanMap().forEach((k,v)->{ - if(!abstractClassBean.getPackageName().equals(v.getPackageName())){ - //返回参数匹配 - if(returnClassName.toLowerCase().contains(k.toLowerCase())){ + if(!abstractClassBean.getPackageName().equals(v.getPackageName())){ + //返回参数匹配 + if(returnClassName.toLowerCase().contains(k.toLowerCase())){ + importClassSet.add(v.getPackageName()+"."+v.getClassName()); + } + /** + * 方法参数匹配 + */ + if(methodBean.getMethodName().toLowerCase().contains(k.toLowerCase())){ + importClassSet.add(v.getPackageName()+"."+v.getClassName()); + } + } + + }); + + plantUmlContextBean.getEnumBeanMap().forEach((k,v)->{ + if(k.toLowerCase().equals(returnClassName.toLowerCase())){ importClassSet.add(v.getPackageName()+"."+v.getClassName()); } - /** - * 方法参数匹配 - */ if(methodBean.getMethodName().toLowerCase().contains(k.toLowerCase())){ importClassSet.add(v.getPackageName()+"."+v.getClassName()); } - } - - }); - - plantUmlContextBean.getEnumBeanMap().forEach((k,v)->{ - if(k.toLowerCase().equals(returnClassName.toLowerCase())){ - importClassSet.add(v.getPackageName()+"."+v.getClassName()); - } - if(methodBean.getMethodName().toLowerCase().contains(k.toLowerCase())){ - importClassSet.add(v.getPackageName()+"."+v.getClassName()); - } + }); }); - }); + } //对属性进行探测 if (CollectionUtils.isNotEmpty(abstractClassBean.getFieldBeanList())) { - abstractClassBean.getFieldBeanList().forEach(fieldBean -> { + abstractClassBean.getFieldBeanList().stream().filter(fieldBean -> !fieldBean.getFieldName().contains("*")).forEach(fieldBean -> { String fieldClass = fieldBean.getFieldName().trim().toLowerCase(); String defaultPackageName = defaultPackageConfig.getPackage(fieldClass); @@ -117,6 +119,13 @@ public class ImportPackageService { importClassSet.add(v.getPackageName()+"."+v.getClassName()); } }); + + + plantUmlContextBean.getInterfaceBeanMap().forEach((k,v)->{ + if(fieldClass.contains(k.toLowerCase())){ + importClassSet.add(v.getPackageName()+"."+v.getClassName()); + } + }); }); } @@ -178,7 +187,7 @@ public class ImportPackageService { //对属性进行探测 if (CollectionUtils.isNotEmpty(abstractClassBean.getFieldBeanList())) { - abstractClassBean.getFieldBeanList().forEach(fieldBean -> { + abstractClassBean.getFieldBeanList().stream().filter(fieldBean -> !fieldBean.getFieldName().contains("*")).forEach(fieldBean -> { String fieldClass = fieldBean.getFieldName().trim().toLowerCase(); String defaultPackageName = defaultPackageConfig.getPackage(fieldClass); @@ -202,6 +211,12 @@ public class ImportPackageService { importClassSet.add(v.getPackageName()+"."+v.getClassName()); } }); + + plantUmlContextBean.getDerivedPlantUmlContextBean().getInterfaceBeanMap().forEach((k,v)->{ + if(fieldClass.contains(k.toLowerCase())){ + importClassSet.add(v.getPackageName()+"."+v.getClassName()); + } + }); } }); @@ -214,16 +229,22 @@ public class ImportPackageService { String implClass = abstractClassBean.getRelationClassStr().replace("implements","").trim(); plantUmlContextBean.getDerivedPlantUmlContextBean().getInterfaceBeanMap().forEach((k,v)->{ if(!abstractClassBean.getPackageName().equals(v.getPackageName())){ - //返回参数匹配 if(implClass.toLowerCase().contains(k.toLowerCase())){ importClassSet.add(v.getPackageName()+"."+v.getClassName()); } } }); } - } - + String implClass = abstractClassBean.getRelationClassStr().replace("implements","").trim(); + plantUmlContextBean.getInterfaceBeanMap().forEach((k,v)->{ + if(!abstractClassBean.getPackageName().equals(v.getPackageName())){ + if(implClass.toLowerCase().contains(k.toLowerCase())){ + importClassSet.add(v.getPackageName()+"."+v.getClassName()); + } + } + }); + } if(importClassSet.isEmpty()){ @@ -291,6 +312,24 @@ public class ImportPackageService { } + /** + * 设置包名 + * @param abstractClassBean + * @param moduleTag 当前类元素所在模块 + * 返回的包路径简化为 + * 全局包路径+模块标示+plantUMLPackage + */ + public void setPackageNameWithModule(AbstractClassBean abstractClassBean, String moduleTag){ + if(org.apache.commons.lang3.StringUtils.isEmpty(abstractClassBean.getPlantUMLPackage())){ + String packageName = appServiceConfig.getPackage()+"."+moduleTag; + abstractClassBean.setPackageName(packageName); + }else { + String packageName = appServiceConfig.getPackage()+"."+moduleTag+"."+abstractClassBean.getPlantUMLPackage(); + abstractClassBean.setPackageName(packageName); + } + } + + } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/WriteService.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/WriteService.java index c18e00f360f625c590fdf7f9aa5a0005077af6ba..f72a7b8fb05c7425b60f8aeeff1a7c2546d9676e 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/WriteService.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/WriteService.java @@ -57,12 +57,11 @@ public abstract class WriteService { * @param classContentBean */ public void writeClassFileV2(ClassContentBean classContentBean) { - log.info("classContentBean = "+ JSON.toJSONString(classContentBean)); String filePath = getClassPackageFilePath(classContentBean); try { FileUtils.write(new File(filePath), classContentBean.getClassContent(), "UTF-8"); } catch (IOException e) { - e.printStackTrace(); + log.error("error",e); } } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaAppWriteServiceImpl.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaAppWriteServiceImpl.java index 7441427a4087b755c1f2b438e8f623b47384df55..228676785c3e1bc8d7b57bbf58ddcee2c17baa09 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaAppWriteServiceImpl.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaAppWriteServiceImpl.java @@ -40,7 +40,7 @@ public class ColaAppWriteServiceImpl extends WriteService implements IWriteFileS ClassContentBean classContentBean = new ClassContentBean(); classContentBean.setClassContent(writeContentBean.getContent()); classContentBean.setHumpClassName(writeContentBean.getHumpClassName().toLowerCase().endsWith("facadeimpl") ? writeContentBean.getHumpClassName() : writeContentBean.getHumpClassName()+"FacadeImpl"); - classContentBean.setChildPackageName("app.facade.impl"); + classContentBean.setChildPackageName("app.facadeimpl"); classContentBean.setModulePath(projectTemplateColaConfig.getModuleAppPath()); writeClassFile(classContentBean); @@ -48,6 +48,7 @@ public class ColaAppWriteServiceImpl extends WriteService implements IWriteFileS if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ writeClassFile(classContentBean); }else { + //lassContentBean.setClassPackageName(appServiceConfig.getPackage()+"/app/facadeimpl"); //走文档里的package包生成方式 writeClassFileV2(classContentBean); } @@ -94,11 +95,32 @@ public class ColaAppWriteServiceImpl extends WriteService implements IWriteFileS ClassContentBean classContentBean = new ClassContentBean(); classContentBean.setClassContent(writeContentBean.getContent()); classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); - classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); classContentBean.setModulePath(projectTemplateColaConfig.getModuleAppPath()); + classContentBean.setClassPackageName(appServiceConfig.getPackage()+".app.convert"); + writeClassFileV2(classContentBean); } + //写app.listener + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.MQ_LISTENER.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("app.listener"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateColaConfig.getModuleAppPath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + writeClassFileV2(classContentBean); + } + } + + //指定服务类 or 工具类 if(writeContentBean.getTemplateName().equals(TemplateFileEnum.SPRING_APPLICATION_CONTEXT.getTempFileName())){ diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaClientWriteServiceImpl.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaClientWriteServiceImpl.java index 3db8da34a8cc6cb1e4ffba30517f83eab5215f90..621d24b800055b7b2bf9de4c7cdf6ea107b75cfc 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaClientWriteServiceImpl.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaClientWriteServiceImpl.java @@ -85,6 +85,24 @@ public class ColaClientWriteServiceImpl extends WriteService implements IWriteFi } } + //写domain.enum + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.ENUM.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("api.enums"); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateColaConfig.getModuleClientPath()); + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + classContentBean.setClassPackageName(appServiceConfig.getPackage()+".api.enums"); + //走文档里的package包生成方式 + writeClassFileV2(classContentBean); + } + } + } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaDomainWriteServiceImpl.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaDomainWriteServiceImpl.java index 41b0a466dcd2084a5bafdfac95780def85234766..7c0a7256f2676c8c0b15bec149f4bd415f9bb485 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaDomainWriteServiceImpl.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaDomainWriteServiceImpl.java @@ -118,6 +118,28 @@ public class ColaDomainWriteServiceImpl extends WriteService implements IWriteFi } } + + //写domain.event + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.EVENT_BODY.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("domain.event"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateColaConfig.getModuleDomainPath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + writeClassFileV2(classContentBean); + } + + } + + //写domain.gataway if(writeContentBean.getTemplateName().equals(TemplateFileEnum.GATAWAY.getTempFileName())){ ClassContentBean classContentBean = new ClassContentBean(); @@ -153,6 +175,7 @@ public class ColaDomainWriteServiceImpl extends WriteService implements IWriteFi writeClassFileV2(classContentBean); } } + //写service if(writeContentBean.getTemplateName().equals(TemplateFileEnum.SERVICE.getTempFileName())){ ClassContentBean classContentBean = new ClassContentBean(); diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaInfrastWriteServiceImpl.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaInfrastWriteServiceImpl.java index d4fbc08c4feb97176af5eadd460ea72ba64a0420..d330c535bf92386d36fb254b33cbae2ed0e6f56a 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaInfrastWriteServiceImpl.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/cola/ColaInfrastWriteServiceImpl.java @@ -65,15 +65,32 @@ public class ColaInfrastWriteServiceImpl extends WriteService implements IWriteF writeMapperXml(classContentBean); } - - //写domain.gataway.impl if(writeContentBean.getTemplateName().equals(TemplateFileEnum.GATAWAY_IMPL.getTempFileName())){ ClassContentBean classContentBean = new ClassContentBean(); classContentBean.setClassContent(writeContentBean.getContent()); - classContentBean.setHumpClassName(writeContentBean.getHumpClassName()+"Impl"); - classContentBean.setChildPackageName("gataway.impl"); - classContentBean.setClassPackageName(writeContentBean.getClassPackageName()+".impl"); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("gatawayimpl"); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()+".gatawayimpl"); + classContentBean.setModulePath(projectTemplateColaConfig.getModuleInfrastPath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + classContentBean.setClassPackageName(appServiceConfig.getPackage()+".infrast.gatawayimpl"); + writeClassFileV2(classContentBean); + } + } + + //写domain.repository.impl + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.REPOSITORY_IMPL.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("repositoryimpl"); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()+".repositoryimpl"); classContentBean.setModulePath(projectTemplateColaConfig.getModuleInfrastPath()); //走默认的包生成方式 @@ -81,10 +98,12 @@ public class ColaInfrastWriteServiceImpl extends WriteService implements IWriteF writeClassFile(classContentBean); }else { //走文档里的package包生成方式 + classContentBean.setClassPackageName(appServiceConfig.getPackage()+".infrast.repositoryimpl"); writeClassFileV2(classContentBean); } } + //写infrast.acl if(writeContentBean.getTemplateName().equals(TemplateFileEnum.ACL.getTempFileName())){ ClassContentBean classContentBean = new ClassContentBean(); @@ -124,12 +143,6 @@ public class ColaInfrastWriteServiceImpl extends WriteService implements IWriteF if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ writeClassFile(classContentBean); }else { - if(!classContentBean.getClassPackageName().endsWith("impl") || !classContentBean.getClassPackageName().contains("impl")){ - classContentBean.setClassPackageName(classContentBean.getClassPackageName()+".impl"); - } - if(!classContentBean.getHumpClassName().endsWith("impl") || !classContentBean.getHumpClassName().contains("impl")){ - classContentBean.setHumpClassName(classContentBean.getHumpClassName()+"Impl"); - } //走文档里的package包生成方式 writeClassFileV2(classContentBean); } @@ -152,6 +165,8 @@ public class ColaInfrastWriteServiceImpl extends WriteService implements IWriteF classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); classContentBean.setModulePath(projectTemplateColaConfig.getModuleInfrastPath()); + classContentBean.setClassPackageName(appServiceConfig.getPackage()+".infrast.dataconvert"); + writeClassFileV2(classContentBean); } @@ -169,6 +184,69 @@ public class ColaInfrastWriteServiceImpl extends WriteService implements IWriteF writeClassFile(classContentBean); } + + //写infras.mq.consumer + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.MQ_CONSUMER.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("mq.consumer"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateColaConfig.getModuleInfrastPath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + classContentBean.setClassPackageName(appServiceConfig.getPackage()+".infrast.mq.consumer"); + + writeClassFileV2(classContentBean); + } + } + + //写infras.mq.handler + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.MQ_HANDLER.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("mq.handler"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateColaConfig.getModuleInfrastPath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + classContentBean.setClassPackageName(appServiceConfig.getPackage()+".infrast.mq.handler"); + writeClassFileV2(classContentBean); + } + } + + //写infras.mq.producer + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.MQ_PRODUCER.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("mq.producer"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateColaConfig.getModuleInfrastPath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + classContentBean.setClassPackageName(appServiceConfig.getPackage()+".infrast.mq.producer"); + writeClassFileV2(classContentBean); + } + } + + } @Override @@ -229,7 +307,7 @@ public class ColaInfrastWriteServiceImpl extends WriteService implements IWriteF */ private String getFilePath(String childPackageName, String humpClassName, String classSuffix) { String packageName = appServiceConfig.getPackage(); - String packagePath = packageName.replace(".", "/") + "/dao"; + String packagePath = packageName.replace(".", "/") + "/infrast/dao"; packagePath = Constant.JAVA + "/" + packagePath + "/" + childPackageName; String fileName = humpClassName + classSuffix; return projectTemplateColaConfig.getModuleInfrastPath() + packagePath + "/" + fileName; diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dubbo/DubboApiWriteServiceImpl.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dubbo/DubboApiWriteServiceImpl.java index 7bf93a80792154819d4213335d5265c54a56cefe..20ce8b3d0efdfecec6f086e92fa67a9bfd2a0f05 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dubbo/DubboApiWriteServiceImpl.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dubbo/DubboApiWriteServiceImpl.java @@ -65,7 +65,7 @@ public class DubboApiWriteServiceImpl extends WriteService implements IWriteFile writeClassFileV2(classContentBean); } } - + //写facade if(writeContentBean.getTemplateName().equals(TemplateFileEnum.FACADE.getTempFileName())){ ClassContentBean classContentBean = new ClassContentBean(); classContentBean.setClassContent(writeContentBean.getContent()); @@ -75,6 +75,23 @@ public class DubboApiWriteServiceImpl extends WriteService implements IWriteFile classContentBean.setClassSuffix("Facade.java"); classContentBean.setModulePath(projectTemplateDubboConfig.getModuleApiPath()); + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + writeClassFileV2(classContentBean); + } + } + //写domain.enum + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.ENUM.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("enums"); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateDubboConfig.getModuleApiPath()); + //走默认的包生成方式 if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ writeClassFile(classContentBean); diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dubbo/DubboCoreWriteServiceImpl.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dubbo/DubboCoreWriteServiceImpl.java index 6aa99c6a34715b212a815d8c371236f6e2dc83f8..de0dfc286b73806501cbc811611af55d841f0eee 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dubbo/DubboCoreWriteServiceImpl.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dubbo/DubboCoreWriteServiceImpl.java @@ -209,6 +209,27 @@ public class DubboCoreWriteServiceImpl extends WriteService implements IWriteFi } + + //写domain.event + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.EVENT_BODY.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("domain.event"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateDubboConfig.getModuleCorePath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + writeClassFileV2(classContentBean); + } + + } + //写domain.gataway if(writeContentBean.getTemplateName().equals(TemplateFileEnum.GATAWAY.getTempFileName())){ ClassContentBean classContentBean = new ClassContentBean(); @@ -231,9 +252,9 @@ public class DubboCoreWriteServiceImpl extends WriteService implements IWriteFi if(writeContentBean.getTemplateName().equals(TemplateFileEnum.GATAWAY_IMPL.getTempFileName())){ ClassContentBean classContentBean = new ClassContentBean(); classContentBean.setClassContent(writeContentBean.getContent()); - classContentBean.setHumpClassName(writeContentBean.getHumpClassName()+"Impl"); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); classContentBean.setChildPackageName("gataway.impl"); - classContentBean.setClassPackageName(writeContentBean.getClassPackageName()+".impl"); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); classContentBean.setModulePath(projectTemplateDubboConfig.getModuleCorePath()); //走默认的包生成方式 @@ -284,12 +305,6 @@ public class DubboCoreWriteServiceImpl extends WriteService implements IWriteFi if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ writeClassFile(classContentBean); }else { - if(!classContentBean.getClassPackageName().endsWith("impl") || !classContentBean.getClassPackageName().contains("impl")){ - classContentBean.setClassPackageName(classContentBean.getClassPackageName()+".impl"); - } - if(!classContentBean.getHumpClassName().endsWith("impl") || !classContentBean.getHumpClassName().contains("impl")){ - classContentBean.setHumpClassName(classContentBean.getHumpClassName()+"Impl"); - } //走文档里的package包生成方式 writeClassFileV2(classContentBean); } @@ -357,6 +372,85 @@ public class DubboCoreWriteServiceImpl extends WriteService implements IWriteFi writeClassFileV2(classContentBean); } } + //写app.listener + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.MQ_LISTENER.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("app.listener"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateDubboConfig.getModuleCorePath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + writeClassFileV2(classContentBean); + } + } + + //写infras.mq.consumer + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.MQ_CONSUMER.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("infrast.mq.consumer"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateDubboConfig.getModuleCorePath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + classContentBean.setClassPackageName(appServiceConfig.getPackage()+".infrast.mq.consumer"); + writeClassFileV2(classContentBean); + } + } + + //写infras.mq.handler + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.MQ_HANDLER.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("infrast.mq.handler"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateDubboConfig.getModuleCorePath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + classContentBean.setClassPackageName(appServiceConfig.getPackage()+".infrast.mq.handler"); + writeClassFileV2(classContentBean); + } + } + + //写infras.mq.producer + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.MQ_PRODUCER.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("infrast.mq.producer"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateDubboConfig.getModuleCorePath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + classContentBean.setClassPackageName(appServiceConfig.getPackage()+".infrast.mq.producer"); + writeClassFileV2(classContentBean); + } + } + } @Override diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/ClassConvertFactory.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/ClassConvertFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..b0463140bcf5f945636de8f635396486220533cf --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/ClassConvertFactory.java @@ -0,0 +1,752 @@ +package com.coderman.codemaker.app.dynamicddd; + +import com.coderman.codemaker.bean.plantuml.*; +import com.coderman.codemaker.config.AppServiceConfig; +import com.coderman.codemaker.enums.DomainDerivedElementEnum; +import com.coderman.codemaker.enums.DomainElementEnum; +import com.coderman.codemaker.utils.StringHelperUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.assertj.core.util.Lists; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * Description:类转换构建工厂 + * date: 2021/10/18 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class ClassConvertFactory { + + @Autowired + private AppServiceConfig appServiceConfig; + + /** + * 处理派生类bo->dto + * + * @param domainBOClassList + * @return + */ + public List getDTOClassList(List domainBOClassList) { + List dtoClassList = new ArrayList<>(); + + for (ClassBean classBean : domainBOClassList) { + List fieldBeanList = classBean.buildSimpleFieldList(); + String[] classNameArr = classBean.getExtendFieldBean().getDtoKeyList(); + for (String className : classNameArr) { + ClassBean dtoClassBean = new ClassBean(); + if (!className.toLowerCase().endsWith("dto")) { + dtoClassBean.setClassName(className + "DTO"); + } else { + dtoClassBean.setClassName(className); + } + dtoClassBean.setFieldBeanList(fieldBeanList); + dtoClassBean.setClassDesc(classBean.getClassDesc()); + dtoClassBean.setMethodBeanList(Lists.newArrayList()); + dtoClassBean.setPlantUMLPackage("api.dto"); + dtoClassBean.setDerivedChainClassList(Lists.newArrayList(classBean.getClassName())); + dtoClassList.add(dtoClassBean); + } + } + return dtoClassList; + } + + /** + * 处理派生类bo->dto + * + * @param domainBOClassList + * @return + */ + public List getVOClassList(List domainBOClassList) { + List dtoClassList = new ArrayList<>(); + + for (ClassBean classBean : domainBOClassList) { + List fieldBeanList = classBean.buildSimpleFieldList(); + String[] classNameArr = classBean.getExtendFieldBean().getVoKeyList(); + if (classNameArr == null || classNameArr.length == 0) { + continue; + } + for (String className : classNameArr) { + ClassBean dtoClassBean = new ClassBean(); + if (!className.toLowerCase().endsWith("vo")) { + dtoClassBean.setClassName(className + "VO"); + } else { + dtoClassBean.setClassName(className); + } + dtoClassBean.setFieldBeanList(fieldBeanList); + dtoClassBean.setClassDesc(classBean.getClassDesc()); + dtoClassBean.setMethodBeanList(Lists.newArrayList()); + dtoClassBean.setPlantUMLPackage("adapter.vo"); + dtoClassList.add(dtoClassBean); + } + } + + return dtoClassList; + } + + + /** + * 处理派生类dto->facade + * + * @param dtoClassList + * @return + */ + public List getFacadeInterfaceList(List dtoClassList) { + List facadeInterfaceList = new ArrayList<>(); + + for (ClassBean classBean : dtoClassList) { + InterfaceBean interfaceBean = new InterfaceBean(); + int x = classBean.getClassName().toLowerCase().lastIndexOf(DomainDerivedElementEnum.DTO.getElement()); + if (x >= 0) { + String className = classBean.getClassName().substring(0, x) + "Facade"; + interfaceBean.setClassName(className); + interfaceBean.setPlantUMLPackage("api.facade"); + interfaceBean.setClassDesc(classBean.getClassDesc()); + interfaceBean.setMethodBeanList(Lists.newArrayList()); + facadeInterfaceList.add(interfaceBean); + } + } + return facadeInterfaceList; + } + + /** + * 处理派生类dto-bo convert + * + * @param dtoClassList + * @return + */ + public List getDTOBOConvertInterfaceList(List dtoClassList) { + List facadeInterfaceList = new ArrayList<>(); + for (ClassBean classBean : dtoClassList) { + InterfaceBean interfaceBean = new InterfaceBean(); + int x = classBean.getClassName().toLowerCase().lastIndexOf(DomainDerivedElementEnum.DTO.getElement()); + if (x >= 0) { + String className = classBean.getClassName().substring(0, x) + "Convert"; + interfaceBean.setClassName(className); + interfaceBean.setPlantUMLPackage("model.convert"); + interfaceBean.setClassDesc(classBean.getClassDesc()); + interfaceBean.setMethodBeanList(getDTOBOConvertMethodList(classBean)); + List importList = new ArrayList<>(); + importList.add(classBean.getPackageName() + "." + classBean.getClassName()); + interfaceBean.setImportClassList(importList); + facadeInterfaceList.add(interfaceBean); + } + } + return facadeInterfaceList; + } + + + /** + * 处理派生类dto-bo convert + * + * @param boElementBeanList + * @return + */ + public Map getDOBOConvertInterfaceList(List boElementBeanList) { + + Map convertMap = new HashMap<>(); + Map boConvertRelationMap = new HashMap<>(); + + List doboConvertInterfaceList = new ArrayList<>(); + for (ClassBean classBean : boElementBeanList) { + InterfaceBean interfaceBean = new InterfaceBean(); + int x = classBean.getClassName().toLowerCase().lastIndexOf(DomainElementEnum.BO.getElement()); + if (x >= 0) { + String className = classBean.getClassName().substring(0, x) + "Converter"; + interfaceBean.setClassName(className); + interfaceBean.setPlantUMLPackage("data.convert"); + interfaceBean.setClassDesc(classBean.getClassDesc()); + interfaceBean.setMethodBeanList(getDOBOConvertMethodList(classBean)); + interfaceBean.setImportClassList(Lists.newArrayList()); + doboConvertInterfaceList.add(interfaceBean); + boConvertRelationMap.put(classBean.getClassName(), className); + } + } + convertMap.put("doboConvertList", doboConvertInterfaceList); + convertMap.put("doboConvertRelationMap", boConvertRelationMap); + return convertMap; + } + + /** + * 处理派生类dto-bo convert + * + * @param classBean + * @return + */ + public List getDOBOConvertMethodList(ClassBean classBean) { + Optional fieldBean = classBean.getFieldBeanList().stream().filter(v -> v.isTableKey()).findFirst(); + if (!fieldBean.isPresent()) { + return Lists.newArrayList(); + } + + String tableName = fieldBean.get().getFieldName().replace("String", "").replace("string", "").trim(); + if (StringUtils.isEmpty(tableName)) { + return Lists.newArrayList(); + } + String classDOName = StringHelperUtils.getClassDOName(tableName) + "DO"; + + + List methodBeanList = new ArrayList<>(); + MethodBean do2bo = new MethodBean(); + String boClassName = classBean.getClassName(); + String varClassName = classDOName.substring(0, 1).toLowerCase().concat(classDOName.substring(1)); + do2bo.setMethodName("do2bo(" + classDOName + " " + varClassName + ")"); + do2bo.setReturnClass(boClassName); + methodBeanList.add(do2bo); + + MethodBean dtoList2boList = new MethodBean(); + dtoList2boList.setMethodName("doList2boList(List<" + classDOName + "> " + varClassName + "List)"); + dtoList2boList.setReturnClass("List<" + boClassName + ">"); + methodBeanList.add(dtoList2boList); + + + MethodBean bo2to = new MethodBean(); + varClassName = boClassName.substring(0, 1).toLowerCase().concat(classBean.getClassName().substring(1)); + bo2to.setMethodName("bo2do(" + boClassName + " " + varClassName + ")"); + bo2to.setReturnClass(classDOName); + methodBeanList.add(bo2to); + + MethodBean boList2dtoList = new MethodBean(); + boList2dtoList.setMethodName("boList2doList(List<" + boClassName + "> " + varClassName + "List)"); + boList2dtoList.setReturnClass("List<" + classDOName + ">"); + methodBeanList.add(boList2dtoList); + + methodBeanList.forEach(methodBean -> methodBean.buildParamArr()); + return methodBeanList; + } + + + /** + * 处理派生类dto-bo convert + * + * @param classBean + * @return + */ + public List getDTOBOConvertMethodList(ClassBean classBean) { + List methodBeanList = new ArrayList<>(); + MethodBean dto2bo = new MethodBean(); + String boClassName = classBean.getClassName().replace("DTO", "BO"); + String varClassName = classBean.getClassName().substring(0, 1).toLowerCase().concat(classBean.getClassName().substring(1)); + dto2bo.setMethodName("dto2bo(" + classBean.getClassName() + " " + varClassName + ")"); + dto2bo.setReturnClass(boClassName); + methodBeanList.add(dto2bo); + + MethodBean dtoList2boList = new MethodBean(); + dtoList2boList.setMethodName("dtoList2boList(List<" + classBean.getClassName() + "> " + varClassName + "List)"); + dtoList2boList.setReturnClass("List<" + boClassName + ">"); + methodBeanList.add(dtoList2boList); + + + MethodBean bo2to = new MethodBean(); + varClassName = boClassName.substring(0, 1).toLowerCase().concat(classBean.getClassName().substring(1)); + bo2to.setMethodName("bo2dto(" + boClassName + " " + varClassName + ")"); + bo2to.setReturnClass(classBean.getClassName().replace("DTO", "BO")); + methodBeanList.add(bo2to); + + MethodBean boList2dtoList = new MethodBean(); + boList2dtoList.setMethodName("boList2dtoList(List<" + boClassName + "> " + varClassName + "List)"); + boList2dtoList.setReturnClass("List<" + classBean.getClassName() + ">"); + methodBeanList.add(boList2dtoList); + + return methodBeanList; + } + + + /** + * 处理派生类facade->facadeimpl + * + * @param facadeInterfaceList + * @return + */ + public List getFacadeImplList(List facadeInterfaceList) { + List facadeImplList = new ArrayList<>(); + + for (InterfaceBean interfaceBean : facadeInterfaceList) { + ClassBean classBean = new ClassBean(); + String className = interfaceBean.getClassName() + "Impl"; + classBean.setClassName(className); + classBean.setClassDesc(classBean.getClassDesc()); + classBean.setPlantUMLPackage("app.facadeimpl"); + List methodBeanList = new ArrayList<>(interfaceBean.getMethodBeanList()); + + List fieldBeanList = new ArrayList<>(interfaceBean.getFieldBeanList()); + + classBean.setMethodBeanList(methodBeanList); + classBean.setFieldBeanList(fieldBeanList); + classBean.setImportClassList(interfaceBean.getImportClassList()); + classBean.setRelationClassStr(" implements " + interfaceBean.getClassName()); + facadeImplList.add(classBean); + } + return facadeImplList; + } + + /** + * 处理派生类bo->facade + * + * @param domainBOClassList + * @return + */ + public List getFacadeClassList(List domainBOClassList) { + Map> facadeBOmap = new HashMap<>(); + domainBOClassList.forEach(classBean -> { + Optional fieldBeanOptional = classBean.getFieldBeanList().stream().filter(fieldBean -> fieldBean.isFacadeKey()).findFirst(); + if (fieldBeanOptional.isPresent()) { + String facadeClassName = fieldBeanOptional.get().getFieldName().replace("String", "") + .replace("string", "").trim(); + List classBeanList = facadeBOmap.get(facadeClassName); + if (CollectionUtils.isEmpty(classBeanList)) { + classBeanList = Lists.newArrayList(); + } + classBeanList.add(classBean); + facadeBOmap.put(facadeClassName, classBeanList); + } + }); + + List interfaceBeanList = new ArrayList<>(); + facadeBOmap.forEach((k, v) -> { + InterfaceBean facadeInterfaceBean = new InterfaceBean(); + if (k.toLowerCase().endsWith("facade")) { + facadeInterfaceBean.setClassName(k); + } else { + facadeInterfaceBean.setClassName(k + "Facade"); + } + facadeInterfaceBean.setPlantUMLPackage("api.facade"); + + List facadeMethodList = new ArrayList<>(); + + v.stream().forEach(classBean -> { + List classMethodList = classBean.getMethodBeanList(); + if (CollectionUtils.isNotEmpty(classMethodList)) { + //通过特定字符过滤facade方法 + List newMethodList = classMethodList.stream().filter(methodBean -> + methodBean.getReturnClass().toLowerCase().contains("dto") + || methodBean.getReturnClass().toLowerCase().contains("result") + || methodBean.getMethodName().toLowerCase().contains("facade") + || methodBean.getMethodName().toLowerCase().contains("dto") + ).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(newMethodList)) { + facadeMethodList.addAll(newMethodList); + } + } + }); + facadeMethodList.forEach(methodBean -> methodBean.buildParamArr()); + facadeInterfaceBean.setMethodBeanList(facadeMethodList); + facadeInterfaceBean.setFieldBeanList(new ArrayList<>()); + interfaceBeanList.add(facadeInterfaceBean); + }); + + return interfaceBeanList; + + } + + + /** + * 处理派生类bo->controller + * + * @param domainBOClassList + * @return + */ + public List getControllerClassList(List domainBOClassList) { + Map> controllermap = new HashMap<>(); + domainBOClassList.forEach(classBean -> { + Optional fieldBeanOptional = classBean.getFieldBeanList().stream().filter(fieldBean -> fieldBean.isControllerKey()).findFirst(); + if (fieldBeanOptional.isPresent()) { + String controllerClassName = fieldBeanOptional.get().getFieldName().replace("String", "") + .replace("string", "").trim(); + List classBeanList = controllermap.get(controllerClassName); + if (CollectionUtils.isEmpty(classBeanList)) { + classBeanList = Lists.newArrayList(); + } + classBeanList.add(classBean); + controllermap.put(controllerClassName, classBeanList); + } + }); + + List controllerBeanList = new ArrayList<>(); + controllermap.forEach((k, v) -> { + ClassBean controllerBean = new ClassBean(); + if (k.toLowerCase().endsWith("controller")) { + controllerBean.setClassName(k); + } else { + controllerBean.setClassName(k + "Controller"); + } + controllerBean.setPlantUMLPackage("adapter.controller"); + + List controllerMethodList = new ArrayList<>(); + + v.stream().forEach(classBean -> { + List classMethodList = classBean.getMethodBeanList(); + if (CollectionUtils.isNotEmpty(classMethodList)) { + //通过特定字符过滤facade方法 + List newMethodList = classMethodList.stream().filter(methodBean -> methodBean.getDesc().contains("/") + ).collect(Collectors.toList()); + + + if (CollectionUtils.isNotEmpty(newMethodList)) { + newMethodList.forEach(methodBean -> { + String pathValue = methodBean.getDesc().substring(methodBean.getDesc().indexOf("/")); + methodBean.setPathValue(pathValue); + methodBean.setDesc(methodBean.getDesc().replace(methodBean.getPathValue(), "")); + }); + + controllerMethodList.addAll(newMethodList); + } + } + }); + controllerMethodList.forEach(methodBean -> methodBean.buildParamArr()); + controllerBean.setMethodBeanList(controllerMethodList); + + controllerBeanList.add(controllerBean); + }); + + return controllerBeanList; + + } + + + /** + * 对bo类进行解析 + * + * @param domainBOList + * @return + */ + public Map getConvertInterfaceBeanList(List domainBOList) { + + Map> facadeBOmap = new HashMap<>(); + + Map convertMap = new HashMap<>(); + + domainBOList.forEach(classBean -> { + Optional fieldBeanOptional = classBean.getFieldBeanList().stream().filter(fieldBean -> fieldBean.isFacadeKey()).findFirst(); + if (fieldBeanOptional.isPresent()) { + String facadeClassName = fieldBeanOptional.get().getFieldName().replace("String", "") + .replace("string", "").trim(); + if (facadeClassName.contains(",")) { + facadeClassName = classBean.getClassName().replace("BO", "").replace("Bo", "").replace("bo", "").trim(); + } + List classBeanList = facadeBOmap.get(facadeClassName); + if (CollectionUtils.isEmpty(classBeanList)) { + classBeanList = Lists.newArrayList(); + } + classBeanList.add(classBean); + facadeBOmap.put(facadeClassName, classBeanList); + } + }); + + List interfaceConvertBeanList = new ArrayList<>(); + + Map facadeConvertRelationMap = new HashMap<>(); + + facadeBOmap.forEach((k, v) -> { + InterfaceBean convertInterfaceBean = new InterfaceBean(); + String convertClassName = k.replace("Facade", "").replace("facade", "") + "Convert"; + convertInterfaceBean.setClassName(convertClassName); + convertInterfaceBean.setPlantUMLPackage("model.convert"); + convertInterfaceBean.setClassDesc(convertClassName); + facadeConvertRelationMap.put(k, convertClassName); + Set importClassSet = new HashSet<>(); + List classMethodList = new ArrayList<>(); + + v.stream().forEach(classBean -> { + + List methodBeanList = new ArrayList<>(); + Optional fieldBeanOptional = classBean.getFieldBeanList().stream().filter(f -> f.isDtoKey()).findFirst(); + if (fieldBeanOptional.isPresent()) { + String dtoClassNameStr = fieldBeanOptional.get().getFieldName() + .replace("String", "") + .replace("string", "") + .trim(); + + + String[] arr = dtoClassNameStr.split(","); + for (String dtoClassName : arr) { + importClassSet.add(appServiceConfig.getPackage() + ".api.dto." + dtoClassName); + MethodBean dto2bo = new MethodBean(); + String vardtoName = dtoClassName.substring(0, 1).toLowerCase().concat(dtoClassName.substring(1)); + dto2bo.setMethodName("dto2bo(" + dtoClassName + " " + vardtoName + ")"); + dto2bo.setReturnClass(classBean.getClassName()); + methodBeanList.add(dto2bo); + + MethodBean dtoList2boList = new MethodBean(); + dtoList2boList.setMethodName(vardtoName + "s2boList(List<" + dtoClassName + "> " + vardtoName + "List)"); + dtoList2boList.setReturnClass("List<" + classBean.getClassName() + ">"); + methodBeanList.add(dtoList2boList); + + MethodBean bo2to = new MethodBean(); + String varBOClassName = classBean.getClassName().substring(0, 1).toLowerCase().concat(classBean.getClassName().substring(1)); + bo2to.setMethodName("bo2dto(" + classBean.getClassName() + " " + varBOClassName + ")"); + bo2to.setReturnClass(dtoClassName); + methodBeanList.add(bo2to); + + MethodBean boList2dtoList = new MethodBean(); + boList2dtoList.setMethodName(varBOClassName + "s2dtoList(List<" + classBean.getClassName() + "> " + varBOClassName + "List)"); + boList2dtoList.setReturnClass("List<" + dtoClassName + ">"); + methodBeanList.add(boList2dtoList); + } + classMethodList.addAll(methodBeanList); + } + }); + + convertInterfaceBean.setImportClassList(Lists.newArrayList(importClassSet)); + + Map map = new HashMap<>(); + classMethodList + .stream().filter(methodBean -> + !methodBean.getMethodName().toLowerCase().contains("response") && + !methodBean.getMethodName().toLowerCase().contains("responsedto") && + !methodBean.getReturnClass().toLowerCase().contains("request") && + !methodBean.getReturnClass().toLowerCase().contains("requestdto") || + methodBean.getReturnClass().toLowerCase().contains("requestbo") + ).collect(Collectors.toList()).forEach(methodBean -> map.putIfAbsent(methodBean.getReturnClass() + methodBean.getMethodName(), methodBean)); + convertInterfaceBean.setMethodBeanList(map.values().stream().collect(Collectors.toList())); + convertInterfaceBean.getMethodBeanList().forEach(methodBean -> methodBean.buildParamArr()); + interfaceConvertBeanList.add(convertInterfaceBean); + }); + + + convertMap.put("interfaceList", interfaceConvertBeanList); + convertMap.put("facadeconvertrelation", facadeConvertRelationMap); + + return convertMap; + + } + + + /** + * 对bo类进行解析 + * + * @param domainBOList + * @return + */ + public Map getConvertBOVOInterfaceBeanList(List domainBOList) { + Map convertMap = new HashMap<>(); + Map boConvertRelationMap = new HashMap<>(); + + Map> contrllerBOmap = new HashMap<>(); + domainBOList.forEach(classBean -> { + Optional fieldBeanOptional = classBean.getFieldBeanList().stream().filter(fieldBean -> fieldBean.isControllerKey()).findFirst(); + if (fieldBeanOptional.isPresent()) { + String controllerClassName = fieldBeanOptional.get().getFieldName().replace("String", "") + .replace("string", "").trim(); + if (controllerClassName.contains(",")) { + controllerClassName = classBean.getClassName().replace("BO", "").replace("Bo", "").replace("bo", "").trim(); + } + List classBeanList = contrllerBOmap.get(controllerClassName); + if (CollectionUtils.isEmpty(classBeanList)) { + classBeanList = Lists.newArrayList(); + } + classBeanList.add(classBean); + contrllerBOmap.put(controllerClassName, classBeanList); + } + }); + + List interfaceConvertBeanList = new ArrayList<>(); + contrllerBOmap.forEach((k, v) -> { + InterfaceBean convertInterfaceBean = new InterfaceBean(); + String convertClassName = k.replace("Controller", "").replace("controller", "") + "Convertervobo"; + convertInterfaceBean.setClassName(convertClassName); + convertInterfaceBean.setPlantUMLPackage("model.convert"); + convertInterfaceBean.setClassDesc(convertClassName); + Set importClassSet = new HashSet<>(); + List classMethodList = new ArrayList<>(); + + + v.stream().forEach(classBean -> { + + List methodBeanList = new ArrayList<>(); + Optional fieldBeanOptional = classBean.getFieldBeanList().stream().filter(f -> f.isVoKey()).findFirst(); + if (fieldBeanOptional.isPresent()) { + String voClassNameStr = fieldBeanOptional.get().getFieldName() + .replace("String", "") + .replace("string", "") + .trim(); + + + String[] arr = voClassNameStr.split(","); + for (String voClassName : arr) { + String varBOClassName = classBean.getClassName().substring(0, 1).toLowerCase().concat(classBean.getClassName().substring(1)); + + importClassSet.add(appServiceConfig.getPackage() + ".adapter.vo." + voClassName); + MethodBean dto2bo = new MethodBean(); + String varVoName = voClassName.substring(0, 1).toLowerCase().concat(voClassName.substring(1)); + dto2bo.setMethodName("vo2bo(" + voClassName + " " + varVoName + ")"); + dto2bo.setReturnClass(classBean.getClassName()); + methodBeanList.add(dto2bo); + + MethodBean dtoList2boList = new MethodBean(); + String tmpVar = varVoName.replace(varBOClassName.replace("BO", "").replace("Bo", ""), ""); + varVoName = tmpVar.substring(0, 1).toLowerCase().concat(tmpVar.substring(1)); + if (StringUtils.isEmpty(varVoName)) { + varVoName = "vo"; + } + + dtoList2boList.setMethodName(varVoName + "List2boList(List<" + voClassName + "> " + varVoName + "List)"); + dtoList2boList.setReturnClass("List<" + classBean.getClassName() + ">"); + methodBeanList.add(dtoList2boList); + + MethodBean bo2to = new MethodBean(); + tmpVar = voClassName.replace(classBean.getClassName().replace("BO", "").replace("Bo", ""), ""); + + bo2to.setMethodName("bo2" + tmpVar + "(" + classBean.getClassName() + " " + varBOClassName + ")"); + bo2to.setReturnClass(voClassName); + methodBeanList.add(bo2to); + + MethodBean boList2dtoList = new MethodBean(); + boList2dtoList.setMethodName(varBOClassName + "List2" + tmpVar + "List(List<" + classBean.getClassName() + "> " + varBOClassName + "List)"); + boList2dtoList.setReturnClass("List<" + voClassName + ">"); + methodBeanList.add(boList2dtoList); + } + classMethodList.addAll(methodBeanList); + } + boConvertRelationMap.put(classBean.getClassName(), convertInterfaceBean.getClassName()); + }); + + convertInterfaceBean.setImportClassList(Lists.newArrayList(importClassSet)); + + Map map = new HashMap<>(); + classMethodList + .stream().filter(methodBean -> + !methodBean.getMethodName().toLowerCase().contains("response") && + !methodBean.getMethodName().toLowerCase().contains("responsevo") && + !methodBean.getReturnClass().toLowerCase().contains("request") && + !methodBean.getReturnClass().toLowerCase().contains("requestvo") || + methodBean.getReturnClass().toLowerCase().contains("requestbo") + ).collect(Collectors.toList()).forEach(methodBean -> map.putIfAbsent(methodBean.getReturnClass() + methodBean.getMethodName(), methodBean)); + convertInterfaceBean.setMethodBeanList(map.values().stream().collect(Collectors.toList())); + convertInterfaceBean.getMethodBeanList().forEach(methodBean -> methodBean.buildParamArr()); + interfaceConvertBeanList.add(convertInterfaceBean); + + + }); + convertMap.put("voboconvertlist", interfaceConvertBeanList); + convertMap.put("voboconvertrelation", boConvertRelationMap); + + return convertMap; + + } + + + /** + * 构建方法内容 + * + * @param methodBeanList + * @return + */ + private List getMethodBeanList(List methodBeanList) { + for (MethodBean methodBean : methodBeanList) { + methodBean.buildMethodContent(); + } + return methodBeanList; + } + + /** + * 处理派生类gataway->gatawayimpl + * + * @param gatawayInterfaceList + * @return + */ + public List getGatawayImplList(List gatawayInterfaceList) { + List gatawayImplList = new ArrayList<>(); + + for (InterfaceBean interfaceBean : gatawayInterfaceList) { + ClassBean classBean = new ClassBean(); + String className = interfaceBean.getClassName() + "Impl"; + classBean.setClassName(className); + classBean.setClassDesc(classBean.getClassDesc()); + classBean.setPlantUMLPackage("infrast.gatawayimpl"); + classBean.setPackageName(appServiceConfig.getPackage() + "." + classBean.getPlantUMLPackage()); + if (CollectionUtils.isNotEmpty(interfaceBean.getMethodBeanList())) { + classBean.setMethodBeanList(getMethodBeanList(interfaceBean.getMethodBeanList())); + classBean.setFieldBeanList(interfaceBean.getFieldBeanList()); + } else { + classBean.setMethodBeanList(Lists.newArrayList()); + } + classBean.setImportClassList(interfaceBean.getImportClassList()); + classBean.setRelationClassStr(" implements " + interfaceBean.getClassName()); + gatawayImplList.add(classBean); + } + return gatawayImplList; + } + + + /** + * 处理派生类infrastacl->infrastaclimpl + * + * @param InfrastAclInterfaceList + * @return + */ + public List getInfrastAclImplList(List InfrastAclInterfaceList) { + List infrastAclImplList = new ArrayList<>(); + + for (InterfaceBean interfaceBean : InfrastAclInterfaceList) { + ClassBean classBean = new ClassBean(); + String className = interfaceBean.getClassName() + "Impl"; + classBean.setClassName(className); + classBean.setClassDesc(classBean.getClassDesc()); + classBean.setPlantUMLPackage("infrast.acl.impl"); + classBean.setPackageName(appServiceConfig.getPackage() + "." + classBean.getPlantUMLPackage()); + if (CollectionUtils.isNotEmpty(interfaceBean.getMethodBeanList())) { + classBean.setMethodBeanList(getMethodBeanList(interfaceBean.getMethodBeanList())); + classBean.setFieldBeanList(interfaceBean.getFieldBeanList()); + } else { + classBean.setMethodBeanList(Lists.newArrayList()); + } + classBean.setImportClassList(interfaceBean.getImportClassList()); + classBean.setRelationClassStr(" implements " + interfaceBean.getClassName()); + infrastAclImplList.add(classBean); + } + return infrastAclImplList; + } + + /** + * 处理派生类repository->repositoryimpl + * + * @param repositoryInterfaceList + * @return + */ + public List getRepositoryImplList(List repositoryInterfaceList) { + List repositoryImplList = new ArrayList<>(); + + for (InterfaceBean interfaceBean : repositoryInterfaceList) { + ClassBean classBean = new ClassBean(); + String className = interfaceBean.getClassName() + "Impl"; + classBean.setClassName(className); + classBean.setClassDesc(classBean.getClassDesc()); + classBean.setPlantUMLPackage("infrast.repositoryimpl"); + if (CollectionUtils.isNotEmpty(interfaceBean.getMethodBeanList())) { + classBean.setMethodBeanList(getMethodBeanList(interfaceBean.getMethodBeanList())); + classBean.setFieldBeanList(interfaceBean.getFieldBeanList()); + } else { + classBean.setMethodBeanList(Lists.newArrayList()); + } + classBean.setPackageName(appServiceConfig.getPackage() + "." + classBean.getPlantUMLPackage()); + classBean.setImportClassList(interfaceBean.getImportClassList()); + classBean.setRelationClassStr(" implements " + interfaceBean.getClassName()); + repositoryImplList.add(classBean); + } + return repositoryImplList; + } + + + /** + * 构建api的枚举数据 + * @param enumBeanList + * @return + */ + public List getApiEnumBeanList(List enumBeanList){ + List apiEnumBeanList = new ArrayList<>(); + enumBeanList.forEach(enumBean -> apiEnumBeanList.add(enumBean.copySelf())); + apiEnumBeanList.forEach(enumBean -> enumBean.setPackageName(appServiceConfig.getPackage()+".api.enums")); + return apiEnumBeanList; + } + + + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/DerivedClassFactory.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/DerivedClassFactory.java index c68c053e29b8c7ec06ffdc6f9d9a9d179013e459..7e08f6decda90c484d578b0fcce650aca8556d32 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/DerivedClassFactory.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/DerivedClassFactory.java @@ -1,18 +1,13 @@ package com.coderman.codemaker.app.dynamicddd; import com.coderman.codemaker.bean.plantuml.*; -import com.coderman.codemaker.config.AppServiceConfig; -import com.coderman.codemaker.enums.DomainDerivedElementEnum; -import com.coderman.codemaker.enums.DomainElementEnum; -import com.coderman.codemaker.service.TemlateVarService; +import com.coderman.codemaker.service.ReadInvokePlantUMLFileService; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import org.assertj.core.util.Lists; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; -import java.util.stream.Collectors; /** * Description: @@ -27,17 +22,14 @@ import java.util.stream.Collectors; public class DerivedClassFactory { @Autowired - private TemlateVarService temlateVarService; - - @Autowired - private AppServiceConfig appServiceConfig; + private ClassConvertFactory classConvertFactory; /** * 处理bo到dto的派生 * @param domainBoElementBeanList * @param plantUmlContextBean */ public void deriveBo2DTO(List domainBoElementBeanList, PlantUmlContextBean plantUmlContextBean){ - List dtoList = getDTOClassList(domainBoElementBeanList); + List dtoList = classConvertFactory.getDTOClassList(domainBoElementBeanList); if(plantUmlContextBean.getDerivedPlantUmlContextBean() == null){ PlantUmlContextBean derivedPlantUmlContextBean = new PlantUmlContextBean(); //将派生类放到派生类上下文里面 @@ -49,13 +41,36 @@ public class DerivedClassFactory { } } + + + /** + * 处理enum到enum的派生 + * @param domainEnumElementBeanList + * @param plantUmlContextBean + */ + public void deriveEnum2Enum(List domainEnumElementBeanList, PlantUmlContextBean plantUmlContextBean){ + + List enumBeanList = classConvertFactory.getApiEnumBeanList(domainEnumElementBeanList); + if(plantUmlContextBean.getDerivedPlantUmlContextBean() == null){ + PlantUmlContextBean derivedPlantUmlContextBean = new PlantUmlContextBean(); + //将派生类放到派生类上下文里面 + enumBeanList.forEach(v->derivedPlantUmlContextBean.addEnumBean(v)); + plantUmlContextBean.setDerivedPlantUmlContextBean(derivedPlantUmlContextBean); + }else { + //将派生类放到派生类上下文里面 + enumBeanList.forEach(v->plantUmlContextBean.getDerivedPlantUmlContextBean().addEnumBean(v)); + } + } + + + /** * 处理dto到facade的派生 * @param dtoElementBeanList * @param plantUmlContextBean */ public void deriveDTO2Facade(List dtoElementBeanList, PlantUmlContextBean plantUmlContextBean){ - List dtoList = getFacadeInterfaceList(dtoElementBeanList); + List dtoList = classConvertFactory.getFacadeInterfaceList(dtoElementBeanList); if(plantUmlContextBean.getDerivedPlantUmlContextBean() == null){ PlantUmlContextBean derivedPlantUmlContextBean = new PlantUmlContextBean(); //将派生类放到派生类上下文里面 @@ -74,7 +89,7 @@ public class DerivedClassFactory { * @param plantUmlContextBean */ public void deriveDTOBOConvert(List dtoElementBeanList, PlantUmlContextBean plantUmlContextBean){ - List dtoboConvertList = getDTOBOConvertInterfaceList(dtoElementBeanList); + List dtoboConvertList = classConvertFactory.getDTOBOConvertInterfaceList(dtoElementBeanList); if(plantUmlContextBean.getDerivedPlantUmlContextBean() == null){ PlantUmlContextBean derivedPlantUmlContextBean = new PlantUmlContextBean(); //将派生类放到派生类上下文里面 @@ -91,16 +106,26 @@ public class DerivedClassFactory { * @param plantUmlContextBean */ public void deriveDOBOConvert(List boElementBeanList, PlantUmlContextBean plantUmlContextBean){ - List dtoboConvertList = getDOBOConvertInterfaceList(boElementBeanList); + Map convertMap = classConvertFactory.getDOBOConvertInterfaceList(boElementBeanList); + List doboConvertInterfaceList = (List)convertMap.get("doboConvertList"); + Map BoConvertRelationMap = (Map)convertMap.get("doboConvertRelationMap"); if(plantUmlContextBean.getDerivedPlantUmlContextBean() == null){ PlantUmlContextBean derivedPlantUmlContextBean = new PlantUmlContextBean(); //将派生类放到派生类上下文里面 - dtoboConvertList.forEach(v->derivedPlantUmlContextBean.addInterfaceBean(v)); + doboConvertInterfaceList.forEach(v->derivedPlantUmlContextBean.addInterfaceBean(v)); plantUmlContextBean.setDerivedPlantUmlContextBean(derivedPlantUmlContextBean); }else { //将派生类放到派生类上下文里面 - dtoboConvertList.forEach(v->plantUmlContextBean.getDerivedPlantUmlContextBean().addInterfaceBean(v)); + doboConvertInterfaceList.forEach(v->plantUmlContextBean.getDerivedPlantUmlContextBean().addInterfaceBean(v)); } + + //将dobo转换接口挂到BO类上 + boElementBeanList.forEach(classBean -> { + ClassBean boClassBean = plantUmlContextBean.getClassBeanMap().get(classBean.getClassName()); + boClassBean.setBodoConvertInterface(BoConvertRelationMap.get(classBean.getClassName())); + }); + + } @@ -110,7 +135,7 @@ public class DerivedClassFactory { * @param plantUmlContextBean */ public void deriveBo2VO(List domainBoElementBeanList, PlantUmlContextBean plantUmlContextBean){ - List dtoList = getVOClassList(domainBoElementBeanList); + List dtoList = classConvertFactory.getVOClassList(domainBoElementBeanList); if(plantUmlContextBean.getDerivedPlantUmlContextBean() == null){ PlantUmlContextBean derivedPlantUmlContextBean = new PlantUmlContextBean(); //将派生类放到派生类上下文里面 @@ -129,15 +154,36 @@ public class DerivedClassFactory { * @param plantUmlContextBean */ public void deriveBo2Facade(List domainBoElementBeanList, PlantUmlContextBean plantUmlContextBean){ - List facadeList = getFacadeClassList(domainBoElementBeanList); + List facadeList = classConvertFactory.getFacadeClassList(domainBoElementBeanList); if(plantUmlContextBean.getDerivedPlantUmlContextBean() == null){ PlantUmlContextBean derivedPlantUmlContextBean = new PlantUmlContextBean(); - //将派生类放到派生类上下文里面 facadeList.forEach(v->derivedPlantUmlContextBean.addInterfaceBean(v)); plantUmlContextBean.setDerivedPlantUmlContextBean(derivedPlantUmlContextBean); }else { //将派生类放到派生类上下文里面 - facadeList.forEach(v->plantUmlContextBean.getDerivedPlantUmlContextBean().addInterfaceBean(v)); + facadeList.forEach(v-> { + + if(v.getClassName().contains(",")){ + String [] classNameArr = v.getClassName().split(","); + for (String className : classNameArr){ + InterfaceBean interfaceBean = new InterfaceBean(); + + interfaceBean.setClassName(className); + interfaceBean.setImportClassList(v.getImportClassList()); + interfaceBean.setPackageName(v.getPackageName()); + interfaceBean.setMethodBeanList(v.getMethodBeanList()); + interfaceBean.setPlantUMLPackage(v.getPlantUMLPackage()); + interfaceBean.setRelationClassStr(v.getRelationClassStr()); + interfaceBean.setFieldBeanList(v.getFieldBeanList()); + interfaceBean.setImplInterfaceBean(v.getImplInterfaceBean()); + interfaceBean.setAuthor(v.getAuthor()); + interfaceBean.setDerived(v.isDerived()); + plantUmlContextBean.getDerivedPlantUmlContextBean().addInterfaceBean(interfaceBean); + } + }else { + plantUmlContextBean.getDerivedPlantUmlContextBean().addInterfaceBean(v); + } + }); } } @@ -148,15 +194,36 @@ public class DerivedClassFactory { * @param plantUmlContextBean */ public void deriveBo2Controller(List domainBoElementBeanList, PlantUmlContextBean plantUmlContextBean){ - List controllerBeanList = getControllerClassList(domainBoElementBeanList); + List controllerBeanList = classConvertFactory.getControllerClassList(domainBoElementBeanList); if(plantUmlContextBean.getDerivedPlantUmlContextBean() == null){ PlantUmlContextBean derivedPlantUmlContextBean = new PlantUmlContextBean(); - //将派生类放到派生类上下文里面 controllerBeanList.forEach(v->derivedPlantUmlContextBean.addClassBean(v)); plantUmlContextBean.setDerivedPlantUmlContextBean(derivedPlantUmlContextBean); }else { + //将派生类放到派生类上下文里面 - controllerBeanList.forEach(v->plantUmlContextBean.getDerivedPlantUmlContextBean().addClassBean(v)); + controllerBeanList.forEach(v-> { + + if(v.getClassName().contains(",")){ + String [] classNameArr = v.getClassName().split(","); + for (String className : classNameArr){ + ClassBean classBean = new ClassBean(); + classBean.setClassName(className); + classBean.setImportClassList(v.getImportClassList()); + classBean.setPackageName(v.getPackageName()); + classBean.setMethodBeanList(v.getMethodBeanList()); + classBean.setPlantUMLPackage(v.getPlantUMLPackage()); + classBean.setRelationClassStr(v.getRelationClassStr()); + classBean.setFieldBeanList(v.getFieldBeanList()); + classBean.setImplInterfaceBean(v.getImplInterfaceBean()); + classBean.setAuthor(v.getAuthor()); + classBean.setDerived(v.isDerived()); + plantUmlContextBean.getDerivedPlantUmlContextBean().addClassBean(classBean); + } + }else { + plantUmlContextBean.getDerivedPlantUmlContextBean().addClassBean(v); + } + }); } } @@ -167,7 +234,11 @@ public class DerivedClassFactory { * @param plantUmlContextBean */ public void deriveBoDTO2Convert(List domainBoElementBeanList, PlantUmlContextBean plantUmlContextBean){ - List convertList = getConvertInterfaceBeanList(domainBoElementBeanList); + Map convertMap = classConvertFactory.getConvertInterfaceBeanList(domainBoElementBeanList); + + List convertList = (List)convertMap.get("interfaceList"); + Map facadeConvertRelationMap = (Map)convertMap.get("facadeconvertrelation"); + if(plantUmlContextBean.getDerivedPlantUmlContextBean() == null){ PlantUmlContextBean derivedPlantUmlContextBean = new PlantUmlContextBean(); //将派生类放到派生类上下文里面 @@ -177,6 +248,13 @@ public class DerivedClassFactory { //将派生类放到派生类上下文里面 convertList.forEach(v->plantUmlContextBean.getDerivedPlantUmlContextBean().addInterfaceBean(v)); } + + //facade接口关联对应的convert接口 + plantUmlContextBean.getDerivedPlantUmlContextBean().getInterfaceBeanMap().forEach((k,v)->{ + if(k.toLowerCase().endsWith("facade")){ + v.setBodtoConvertInterface(facadeConvertRelationMap.get(k)); + } + }); } /** @@ -185,21 +263,45 @@ public class DerivedClassFactory { * @param plantUmlContextBean */ public void deriveBoVO2Convert(List domainBoElementBeanList, PlantUmlContextBean plantUmlContextBean){ - List convertList = getConvertBOVOInterfaceBeanList(domainBoElementBeanList); + Map convertMap = classConvertFactory.getConvertBOVOInterfaceBeanList(domainBoElementBeanList); + List bovoConvertInterfaceList = (List)convertMap.get("voboconvertlist"); + Map BoConvertRelationMap = (Map)convertMap.get("voboconvertrelation"); + + if(plantUmlContextBean.getDerivedPlantUmlContextBean() == null){ PlantUmlContextBean derivedPlantUmlContextBean = new PlantUmlContextBean(); //将派生类放到派生类上下文里面 - convertList.forEach(v->derivedPlantUmlContextBean.addInterfaceBean(v)); + bovoConvertInterfaceList.forEach(v->derivedPlantUmlContextBean.addInterfaceBean(v)); plantUmlContextBean.setDerivedPlantUmlContextBean(derivedPlantUmlContextBean); }else { //将派生类放到派生类上下文里面 - convertList.forEach(v->plantUmlContextBean.getDerivedPlantUmlContextBean().addInterfaceBean(v)); + bovoConvertInterfaceList.forEach(v->plantUmlContextBean.getDerivedPlantUmlContextBean().addInterfaceBean(v)); } - } - - + //将dobo转换接口挂到BO类上,也挂到VO类上便于调用链路绘制 + domainBoElementBeanList.forEach(classBean -> { + ClassBean boClassBean = plantUmlContextBean.getClassBeanMap().get(classBean.getClassName()); + boClassBean.setBovoConvertInterface(BoConvertRelationMap.get(classBean.getClassName())); + Optional optionalFieldBean = classBean.getFieldBeanList().stream().filter(fieldBean -> fieldBean.isVoKey()).findFirst(); + if(optionalFieldBean.isPresent()){ + FieldBean fieldBean = optionalFieldBean.get(); + String [] classNameArr = fieldBean.getFieldName() + .replace("String","") + .replace("string","") + .trim() + .split(","); + for (String voClassname : classNameArr){ + String voClassName = voClassname.endsWith("VO") ? voClassname : voClassname+"VO"; + ClassBean voClassBean = plantUmlContextBean.getDerivedPlantUmlContextBean().getClassBeanMap().get(voClassName); + if(voClassBean == null){ + continue; + } + voClassBean.setBovoConvertInterface(BoConvertRelationMap.get(classBean.getClassName())); + } + } + }); + } /** @@ -208,7 +310,7 @@ public class DerivedClassFactory { * @param plantUmlContextBean */ public void deriveFacade2FacadeImpl(List dtoElementBeanList, PlantUmlContextBean plantUmlContextBean){ - List facadeImplList = getFacadeImplList(dtoElementBeanList); + List facadeImplList = classConvertFactory.getFacadeImplList(dtoElementBeanList); if(plantUmlContextBean.getDerivedPlantUmlContextBean() == null){ PlantUmlContextBean derivedPlantUmlContextBean = new PlantUmlContextBean(); //将派生类放到派生类上下文里面 @@ -222,611 +324,63 @@ public class DerivedClassFactory { /** - * 处理派生类bo->facade - * @param domainBOClassList - * @return - */ - private List getFacadeClassList(List domainBOClassList){ - Map> facadeBOmap = new HashMap<>(); - domainBOClassList.forEach(classBean -> { - Optional fieldBeanOptional = classBean.getFieldBeanList().stream().filter(fieldBean -> fieldBean.isFacadeKey()).findFirst(); - if(fieldBeanOptional.isPresent()){ - String facadeClassName = fieldBeanOptional.get().getFieldName().replace("String","") - .replace("string","").trim(); - List classBeanList = facadeBOmap.get(facadeClassName); - if(CollectionUtils.isEmpty(classBeanList)){ - classBeanList = Lists.newArrayList(); - } - classBeanList.add(classBean); - facadeBOmap.put(facadeClassName,classBeanList); - } - }); - - List interfaceBeanList = new ArrayList<>(); - facadeBOmap.forEach((k,v)->{ - InterfaceBean facadeInterfaceBean = new InterfaceBean(); - if(k.toLowerCase().endsWith("facade")){ - facadeInterfaceBean.setClassName(k); - }else { - facadeInterfaceBean.setClassName(k+"Facade"); - } - facadeInterfaceBean.setPlantUMLPackage("api.facade"); - - List facadeMethodList = new ArrayList<>(); - - v.stream().forEach(classBean -> { - List classMethodList = classBean.getMethodBeanList(); - if(CollectionUtils.isNotEmpty(classMethodList)){ - //通过特定字符过滤facade方法 - List newMethodList = classMethodList.stream().filter(methodBean -> - methodBean.getReturnClass().toLowerCase().contains("dto") - || methodBean.getReturnClass().toLowerCase().contains("result") - || methodBean.getMethodName().toLowerCase().contains("facade") - || methodBean.getMethodName().toLowerCase().contains("dto") - ).collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(newMethodList)){ - facadeMethodList.addAll(newMethodList); - } - } - }); - - facadeInterfaceBean.setMethodBeanList(facadeMethodList); - - interfaceBeanList.add(facadeInterfaceBean); - }); - - return interfaceBeanList; - - } - - /** - * 处理派生类bo->controller - * @param domainBOClassList - * @return + * 处理gataway到gatawayimpl的派生 + * @param dtoElementBeanList + * @param plantUmlContextBean */ - private List getControllerClassList(List domainBOClassList){ - Map> controllermap = new HashMap<>(); - domainBOClassList.forEach(classBean -> { - Optional fieldBeanOptional = classBean.getFieldBeanList().stream().filter(fieldBean -> fieldBean.isControllerKey()).findFirst(); - if(fieldBeanOptional.isPresent()){ - String controllerClassName = fieldBeanOptional.get().getFieldName().replace("String","") - .replace("string","").trim(); - List classBeanList = controllermap.get(controllerClassName); - if(CollectionUtils.isEmpty(classBeanList)){ - classBeanList = Lists.newArrayList(); - } - classBeanList.add(classBean); - controllermap.put(controllerClassName,classBeanList); - } - }); - - List controllerBeanList = new ArrayList<>(); - controllermap.forEach((k,v)->{ - ClassBean controllerBean = new ClassBean(); - if(k.toLowerCase().endsWith("controller")){ - controllerBean.setClassName(k); - }else { - controllerBean.setClassName(k+"Controller"); - } - controllerBean.setPlantUMLPackage("adapter.controller"); - - List controllerMethodList = new ArrayList<>(); - - v.stream().forEach(classBean -> { - List classMethodList = classBean.getMethodBeanList(); - if(CollectionUtils.isNotEmpty(classMethodList)){ - //通过特定字符过滤facade方法 - List newMethodList = classMethodList.stream().filter(methodBean -> methodBean.getDesc().contains("/") - ).collect(Collectors.toList()); - + public List deriveGataway2GatawayImpl(List dtoElementBeanList, PlantUmlContextBean plantUmlContextBean){ + List gatawayImplList = classConvertFactory.getGatawayImplList(dtoElementBeanList); - if (CollectionUtils.isNotEmpty(newMethodList)){ - newMethodList.forEach(methodBean -> { - String pathValue = methodBean.getDesc().substring(methodBean.getDesc().indexOf("/")); - methodBean.setPathValue(pathValue); - methodBean.setDesc(methodBean.getDesc().replace(methodBean.getPathValue(),"")); - }); - - controllerMethodList.addAll(newMethodList); - } - } + if(CollectionUtils.isNotEmpty(gatawayImplList)){ + gatawayImplList.forEach(classBean -> { + plantUmlContextBean.getClassBeanMap().put(classBean.getClassName(),classBean); }); - - controllerBean.setMethodBeanList(controllerMethodList); - - controllerBeanList.add(controllerBean); - }); - - return controllerBeanList; - - } - - - - /** - * 处理派生类bo->dto - * @param domainBOClassList - * @return - */ - private List getDTOClassList(List domainBOClassList){ - List dtoClassList = new ArrayList<>(); - - for (ClassBean classBean : domainBOClassList){ - //dto没有bo那么多的丰富信息,需要去掉 - List fieldBeanList = classBean.getFieldBeanList().stream().filter(fieldBean -> !fieldBean - .getFieldName().trim().toLowerCase().endsWith(DomainElementEnum.BO.getElement()) && !fieldBean.isTableKey() && !fieldBean.isDtoKey()).collect(Collectors.toList()); - Optional fieldBeanOptional = classBean.getFieldBeanList().stream().filter(f -> f.isDtoKey()).findFirst(); - if(fieldBeanOptional.isPresent()){ - String [] classNameArr = fieldBeanOptional.get().getFieldName() - .replace("String","") - .replace("string","") - .trim() - .split(","); - for (String className : classNameArr){ - ClassBean dtoClassBean = new ClassBean(); - if(!className.toLowerCase().endsWith("dto")){ - dtoClassBean.setClassName(className+"DTO"); - }else { - dtoClassBean.setClassName(className); - } - dtoClassBean.setFieldBeanList(fieldBeanList); - dtoClassBean.setClassDesc(classBean.getClassDesc()); - dtoClassBean.setMethodBeanList(Lists.newArrayList()); - dtoClassBean.setPlantUMLPackage("api.dto"); - dtoClassList.add(dtoClassBean); - } - - }else { - ClassBean dtoClassBean = new ClassBean(); - int x = classBean.getClassName().toLowerCase().lastIndexOf(DomainElementEnum.BO.getElement()); - if(x >= 0){ - String className = classBean.getClassName().substring(0,x)+"DTO"; - dtoClassBean.setClassName(className); - } - dtoClassBean.setFieldBeanList(fieldBeanList); - dtoClassBean.setMethodBeanList(Lists.newArrayList()); - dtoClassBean.setPlantUMLPackage("api.dto"); - dtoClassList.add(dtoClassBean); - } } - return dtoClassList; + return gatawayImplList; } /** - * 处理派生类bo->dto - * @param domainBOClassList - * @return - */ - private List getVOClassList(List domainBOClassList){ - List dtoClassList = new ArrayList<>(); - - for (ClassBean classBean : domainBOClassList){ - //vo没有bo那么多的丰富信息,需要去掉 - List fieldBeanList = classBean.getFieldBeanList().stream().filter(fieldBean -> !fieldBean - .getFieldName().trim().toLowerCase().endsWith(DomainElementEnum.BO.getElement()) - && !fieldBean.isTableKey() - && !fieldBean.isDtoKey() - && !fieldBean.isFacadeKey() - && !fieldBean.isVoKey() - ).collect(Collectors.toList()); - Optional fieldBeanOptional = classBean.getFieldBeanList().stream().filter(f -> f.isVoKey()).findFirst(); - if(fieldBeanOptional.isPresent()){ - String [] classNameArr = fieldBeanOptional.get().getFieldName() - .replace("String","") - .replace("string","") - .trim() - .split(","); - for (String className : classNameArr){ - ClassBean dtoClassBean = new ClassBean(); - if(!className.toLowerCase().endsWith("vo")){ - dtoClassBean.setClassName(className+"VO"); - }else { - dtoClassBean.setClassName(className); - } - dtoClassBean.setFieldBeanList(fieldBeanList); - dtoClassBean.setClassDesc(classBean.getClassDesc()); - dtoClassBean.setMethodBeanList(Lists.newArrayList()); - dtoClassBean.setPlantUMLPackage("adapter.vo"); - dtoClassList.add(dtoClassBean); - } - - }else { - ClassBean dtoClassBean = new ClassBean(); - int x = classBean.getClassName().toLowerCase().lastIndexOf(DomainElementEnum.BO.getElement()); - if(x >= 0){ - String className = classBean.getClassName().substring(0,x)+"VO"; - dtoClassBean.setClassName(className); - } - dtoClassBean.setFieldBeanList(fieldBeanList); - dtoClassBean.setMethodBeanList(Lists.newArrayList()); - dtoClassBean.setPlantUMLPackage("adapter.vo"); - dtoClassList.add(dtoClassBean); - } - } - return dtoClassList; - } - - - /** - * 处理派生类dto->facade - * @param dtoClassList - * @return + * 处理infrast acl到infrastaclimpl的派生 + * @param infrastAclElementBeanList + * @param plantUmlContextBean */ - private List getFacadeInterfaceList(List dtoClassList){ - List facadeInterfaceList = new ArrayList<>(); - - for (ClassBean classBean : dtoClassList){ - InterfaceBean interfaceBean = new InterfaceBean(); - int x = classBean.getClassName().toLowerCase().lastIndexOf(DomainDerivedElementEnum.DTO.getElement()); - if(x >= 0){ - String className = classBean.getClassName().substring(0,x)+"Facade"; - interfaceBean.setClassName(className); - interfaceBean.setPlantUMLPackage("api.facade"); - interfaceBean.setClassDesc(classBean.getClassDesc()); - interfaceBean.setMethodBeanList(Lists.newArrayList()); - facadeInterfaceList.add(interfaceBean); - } - } - return facadeInterfaceList; - } - + public List deriveInfrastAcl2InfrastImpl(List infrastAclElementBeanList, PlantUmlContextBean plantUmlContextBean){ + List gatawayImplList = classConvertFactory.getInfrastAclImplList(infrastAclElementBeanList); - /** - * 处理派生类dto-bo convert - * @param dtoClassList - * @return - */ - private List getDTOBOConvertInterfaceList(List dtoClassList){ - List facadeInterfaceList = new ArrayList<>(); - for (ClassBean classBean : dtoClassList){ - InterfaceBean interfaceBean = new InterfaceBean(); - int x = classBean.getClassName().toLowerCase().lastIndexOf(DomainDerivedElementEnum.DTO.getElement()); - if(x >= 0){ - String className = classBean.getClassName().substring(0,x)+"Convert"; - interfaceBean.setClassName(className); - interfaceBean.setPlantUMLPackage("model.convert"); - interfaceBean.setClassDesc(classBean.getClassDesc()); - interfaceBean.setMethodBeanList(getDTOBOConvertMethodList(classBean)); - List importList = new ArrayList<>(); - importList.add(classBean.getPackageName()+"."+classBean.getClassName()); - interfaceBean.setImportClassList(importList); - facadeInterfaceList.add(interfaceBean); - } + if(CollectionUtils.isNotEmpty(gatawayImplList)){ + gatawayImplList.forEach(classBean -> { + plantUmlContextBean.getClassBeanMap().put(classBean.getClassName(),classBean); + }); } - return facadeInterfaceList; + return gatawayImplList; } - /** - * 处理派生类dto-bo convert - * @param dtoClassList - * @return + * 处理Repository到Repositoryimpl的派生 + * @param dtoElementBeanList + * @param plantUmlContextBean */ - private List getDOBOConvertInterfaceList(List dtoClassList){ - - List facadeInterfaceList = new ArrayList<>(); - for (ClassBean classBean : dtoClassList){ - InterfaceBean interfaceBean = new InterfaceBean(); - int x = classBean.getClassName().toLowerCase().lastIndexOf(DomainElementEnum.BO.getElement()); - if(x >= 0){ - String className = classBean.getClassName().substring(0,x)+"Converter"; - interfaceBean.setClassName(className); - interfaceBean.setPlantUMLPackage("data.convert"); - interfaceBean.setClassDesc(classBean.getClassDesc()); - interfaceBean.setMethodBeanList(getDOBOConvertMethodList(classBean)); - interfaceBean.setImportClassList(Lists.newArrayList()); - facadeInterfaceList.add(interfaceBean); - } + public List deriveRepository2RepositoryImpl(List dtoElementBeanList, PlantUmlContextBean plantUmlContextBean){ + List repositoryImplList = classConvertFactory.getRepositoryImplList(dtoElementBeanList); + if(CollectionUtils.isNotEmpty(repositoryImplList)){ + repositoryImplList.forEach(classBean -> { + plantUmlContextBean.getClassBeanMap().put(classBean.getClassName(),classBean); + }); } - return facadeInterfaceList; + return repositoryImplList; } /** - * 处理派生类dto-bo convert - * @param classBean + * 构建方法内容 + * @param methodBeanList * @return */ - private List getDOBOConvertMethodList(ClassBean classBean){ - Optional fieldBean = classBean.getFieldBeanList().stream().filter(v->v.isTableKey()).findFirst(); - if(!fieldBean.isPresent()){ - return Lists.newArrayList(); - } - - String tableName = fieldBean.get().getFieldName().replace("String","").replace("string","").trim(); - if(StringUtils.isEmpty(tableName)){ - return Lists.newArrayList(); + private List getMethodBeanList(List methodBeanList){ + for (MethodBean methodBean : methodBeanList){ + methodBean.buildMethodContent(); } - String classDOName = temlateVarService.getClassDOName(tableName)+"DO"; - - - List methodBeanList = new ArrayList<>(); - MethodBean do2bo = new MethodBean(); - String boClassName = classBean.getClassName(); - String varClassName = classDOName.substring(0,1).toLowerCase().concat(classDOName.substring(1)); - do2bo.setMethodName("do2bo("+classDOName+" "+varClassName+")"); - do2bo.setReturnClass(boClassName); - methodBeanList.add(do2bo); - - MethodBean dtoList2boList = new MethodBean(); - dtoList2boList.setMethodName("doList2boList(List<"+classDOName+"> "+varClassName+"List)"); - dtoList2boList.setReturnClass("List<"+boClassName+">"); - methodBeanList.add(dtoList2boList); - - - - MethodBean bo2to = new MethodBean(); - varClassName = boClassName.substring(0,1).toLowerCase().concat(classBean.getClassName().substring(1)); - bo2to.setMethodName("bo2do("+boClassName+" "+varClassName+")"); - bo2to.setReturnClass(classDOName); - methodBeanList.add(bo2to); - - MethodBean boList2dtoList = new MethodBean(); - boList2dtoList.setMethodName("boList2doList(List<"+boClassName+"> "+varClassName+"List)"); - boList2dtoList.setReturnClass("List<"+classDOName+">"); - methodBeanList.add(boList2dtoList); - return methodBeanList; } - - - /** - * 处理派生类dto-bo convert - * @param classBean - * @return - */ - private List getDTOBOConvertMethodList(ClassBean classBean){ - List methodBeanList = new ArrayList<>(); - MethodBean dto2bo = new MethodBean(); - String boClassName = classBean.getClassName().replace("DTO","BO"); - String varClassName = classBean.getClassName().substring(0,1).toLowerCase().concat(classBean.getClassName().substring(1)); - dto2bo.setMethodName("dto2bo("+classBean.getClassName()+" "+varClassName+")"); - dto2bo.setReturnClass(boClassName); - methodBeanList.add(dto2bo); - - MethodBean dtoList2boList = new MethodBean(); - dtoList2boList.setMethodName("dtoList2boList(List<"+classBean.getClassName()+"> "+varClassName+"List)"); - dtoList2boList.setReturnClass("List<"+boClassName+">"); - methodBeanList.add(dtoList2boList); - - - - MethodBean bo2to = new MethodBean(); - varClassName = boClassName.substring(0,1).toLowerCase().concat(classBean.getClassName().substring(1)); - bo2to.setMethodName("bo2dto("+boClassName+" "+varClassName+")"); - bo2to.setReturnClass(classBean.getClassName().replace("DTO","BO")); - methodBeanList.add(bo2to); - - MethodBean boList2dtoList = new MethodBean(); - boList2dtoList.setMethodName("boList2dtoList(List<"+boClassName+"> "+varClassName+"List)"); - boList2dtoList.setReturnClass("List<"+classBean.getClassName()+">"); - methodBeanList.add(boList2dtoList); - - return methodBeanList; - } - - - - - - /** - * 处理派生类facade->facadeimpl - * @param facadeInterfaceList - * @return - */ - private List getFacadeImplList(List facadeInterfaceList){ - List facadeImplList = new ArrayList<>(); - - for (InterfaceBean interfaceBean : facadeInterfaceList){ - ClassBean classBean = new ClassBean(); - String className = interfaceBean.getClassName()+"Impl"; - classBean.setClassName(className); - classBean.setClassDesc(classBean.getClassDesc()); - classBean.setPlantUMLPackage("app.facadeimpl"); - if(CollectionUtils.isNotEmpty(interfaceBean.getMethodBeanList())){ - classBean.setMethodBeanList(interfaceBean.getMethodBeanList()); - }else { - classBean.setMethodBeanList(Lists.newArrayList()); - } - classBean.setImportClassList(interfaceBean.getImportClassList()); - classBean.setRelationClassStr(" implements "+interfaceBean.getClassName()); - facadeImplList.add(classBean); - } - return facadeImplList; - } - - /** - * 对bo类进行解析 - * @param domainBOList - * @return - */ - private List getConvertInterfaceBeanList(List domainBOList){ - - Map> facadeBOmap = new HashMap<>(); - domainBOList.forEach(classBean -> { - Optional fieldBeanOptional = classBean.getFieldBeanList().stream().filter(fieldBean -> fieldBean.isFacadeKey()).findFirst(); - if(fieldBeanOptional.isPresent()){ - String facadeClassName = fieldBeanOptional.get().getFieldName().replace("String","") - .replace("string","").trim(); - List classBeanList = facadeBOmap.get(facadeClassName); - if(CollectionUtils.isEmpty(classBeanList)){ - classBeanList = Lists.newArrayList(); - } - classBeanList.add(classBean); - facadeBOmap.put(facadeClassName,classBeanList); - } - }); - - List interfaceConvertBeanList = new ArrayList<>(); - facadeBOmap.forEach((k,v)->{ - InterfaceBean convertInterfaceBean = new InterfaceBean(); - String convertClassName = k.replace("Facade","").replace("facade","")+"Convert"; - convertInterfaceBean.setClassName(convertClassName); - convertInterfaceBean.setPlantUMLPackage("model.convert"); - convertInterfaceBean.setClassDesc(convertClassName); - Set importClassSet = new HashSet<>(); - List classMethodList = new ArrayList<>(); - - - v.stream().forEach(classBean -> { - - List methodBeanList = new ArrayList<>(); - Optional fieldBeanOptional = classBean.getFieldBeanList().stream().filter(f -> f.isDtoKey()).findFirst(); - if(fieldBeanOptional.isPresent()){ - String dtoClassNameStr = fieldBeanOptional.get().getFieldName() - .replace("String","") - .replace("string","") - .trim(); - - - String [] arr = dtoClassNameStr.split(","); - for (String dtoClassName : arr){ - importClassSet.add(appServiceConfig.getPackage()+".api.dto."+dtoClassName); - MethodBean dto2bo = new MethodBean(); - String vardtoName = dtoClassName.substring(0,1).toLowerCase().concat(dtoClassName.substring(1)); - dto2bo.setMethodName("dto2bo("+dtoClassName+" "+vardtoName+")"); - dto2bo.setReturnClass(classBean.getClassName()); - methodBeanList.add(dto2bo); - - MethodBean dtoList2boList = new MethodBean(); - dtoList2boList.setMethodName(vardtoName+"s2boList(List<"+dtoClassName+"> "+vardtoName+"List)"); - dtoList2boList.setReturnClass("List<"+classBean.getClassName()+">"); - methodBeanList.add(dtoList2boList); - - MethodBean bo2to = new MethodBean(); - String varBOClassName = classBean.getClassName().substring(0,1).toLowerCase().concat(classBean.getClassName().substring(1)); - bo2to.setMethodName("bo2dto("+classBean.getClassName()+" "+varBOClassName+")"); - bo2to.setReturnClass(dtoClassName); - methodBeanList.add(bo2to); - - MethodBean boList2dtoList = new MethodBean(); - boList2dtoList.setMethodName(varBOClassName+"s2dtoList(List<"+classBean.getClassName()+"> "+varBOClassName+"List)"); - boList2dtoList.setReturnClass("List<"+dtoClassName+">"); - methodBeanList.add(boList2dtoList); - } - classMethodList.addAll(methodBeanList); - } - }); - - convertInterfaceBean.setImportClassList(Lists.newArrayList(importClassSet)); - - Map map = new HashMap<>(); - classMethodList - .stream().filter(methodBean -> - !methodBean.getMethodName().toLowerCase().contains("response") && - !methodBean.getMethodName().toLowerCase().contains("responsedto") && - !methodBean.getReturnClass().toLowerCase().contains("request") && - !methodBean.getReturnClass().toLowerCase().contains("requestdto") || - methodBean.getReturnClass().toLowerCase().contains("requestbo") - ).collect(Collectors.toList()).forEach(methodBean -> map.putIfAbsent(methodBean.getReturnClass()+methodBean.getMethodName(),methodBean)); - convertInterfaceBean.setMethodBeanList(map.values().stream().collect(Collectors.toList())); - interfaceConvertBeanList.add(convertInterfaceBean); - }); - - return interfaceConvertBeanList; - - } - - - /** - * 对bo类进行解析 - * @param domainBOList - * @return - */ - private List getConvertBOVOInterfaceBeanList(List domainBOList){ - - Map> contrllerBOmap = new HashMap<>(); - domainBOList.forEach(classBean -> { - Optional fieldBeanOptional = classBean.getFieldBeanList().stream().filter(fieldBean -> fieldBean.isControllerKey()).findFirst(); - if(fieldBeanOptional.isPresent()){ - String controllerClassName = fieldBeanOptional.get().getFieldName().replace("String","") - .replace("string","").trim(); - List classBeanList = contrllerBOmap.get(controllerClassName); - if(CollectionUtils.isEmpty(classBeanList)){ - classBeanList = Lists.newArrayList(); - } - classBeanList.add(classBean); - contrllerBOmap.put(controllerClassName,classBeanList); - } - }); - - List interfaceConvertBeanList = new ArrayList<>(); - contrllerBOmap.forEach((k,v)->{ - InterfaceBean convertInterfaceBean = new InterfaceBean(); - String convertClassName = k.replace("Controller","").replace("controller","")+"Convertervobo"; - convertInterfaceBean.setClassName(convertClassName); - convertInterfaceBean.setPlantUMLPackage("model.convert"); - convertInterfaceBean.setClassDesc(convertClassName); - Set importClassSet = new HashSet<>(); - List classMethodList = new ArrayList<>(); - - - v.stream().forEach(classBean -> { - - List methodBeanList = new ArrayList<>(); - Optional fieldBeanOptional = classBean.getFieldBeanList().stream().filter(f -> f.isVoKey()).findFirst(); - if(fieldBeanOptional.isPresent()){ - String voClassNameStr = fieldBeanOptional.get().getFieldName() - .replace("String","") - .replace("string","") - .trim(); - - - String [] arr = voClassNameStr.split(","); - for (String voClassName : arr){ - String varBOClassName = classBean.getClassName().substring(0,1).toLowerCase().concat(classBean.getClassName().substring(1)); - - importClassSet.add(appServiceConfig.getPackage()+".adapter.vo."+voClassName); - MethodBean dto2bo = new MethodBean(); - String varVoName = voClassName.substring(0,1).toLowerCase().concat(voClassName.substring(1)); - dto2bo.setMethodName("vo2bo("+voClassName+" "+varVoName+")"); - dto2bo.setReturnClass(classBean.getClassName()); - methodBeanList.add(dto2bo); - - MethodBean dtoList2boList = new MethodBean(); - String tmpVar = varVoName.replace(varBOClassName.replace("BO","").replace("Bo",""),""); - varVoName = tmpVar.substring(0,1).toLowerCase().concat(tmpVar.substring(1)); - if(StringUtils.isEmpty(varVoName)){ - varVoName = "vo"; - } - - dtoList2boList.setMethodName(varVoName+"List2boList(List<"+voClassName+"> "+varVoName+"List)"); - dtoList2boList.setReturnClass("List<"+classBean.getClassName()+">"); - methodBeanList.add(dtoList2boList); - - MethodBean bo2to = new MethodBean(); - tmpVar = voClassName.replace(classBean.getClassName().replace("BO","").replace("Bo",""),""); - - bo2to.setMethodName("bo2"+tmpVar+"("+classBean.getClassName()+" "+varBOClassName+")"); - bo2to.setReturnClass(voClassName); - methodBeanList.add(bo2to); - - MethodBean boList2dtoList = new MethodBean(); - boList2dtoList.setMethodName(varBOClassName+"List2"+tmpVar+"List(List<"+classBean.getClassName()+"> "+varBOClassName+"List)"); - boList2dtoList.setReturnClass("List<"+voClassName+">"); - methodBeanList.add(boList2dtoList); - } - classMethodList.addAll(methodBeanList); - } - }); - - convertInterfaceBean.setImportClassList(Lists.newArrayList(importClassSet)); - - Map map = new HashMap<>(); - classMethodList - .stream().filter(methodBean -> - !methodBean.getMethodName().toLowerCase().contains("response") && - !methodBean.getMethodName().toLowerCase().contains("responsevo") && - !methodBean.getReturnClass().toLowerCase().contains("request") && - !methodBean.getReturnClass().toLowerCase().contains("requestvo") || - methodBean.getReturnClass().toLowerCase().contains("requestbo") - ).collect(Collectors.toList()).forEach(methodBean -> map.putIfAbsent(methodBean.getReturnClass()+methodBean.getMethodName(),methodBean)); - convertInterfaceBean.setMethodBeanList(map.values().stream().collect(Collectors.toList())); - interfaceConvertBeanList.add(convertInterfaceBean); - }); - - return interfaceConvertBeanList; - - } } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/DynamicDDDWriteServiceImpl.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/DynamicDDDWriteServiceImpl.java index 805dc73ef27dee6e63c4183c0077948d8217a87f..f830d786d329e2db8ecc367fe64535266cdffd14 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/DynamicDDDWriteServiceImpl.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/DynamicDDDWriteServiceImpl.java @@ -93,6 +93,26 @@ public class DynamicDDDWriteServiceImpl extends WriteService implements IWriteFi } + //写domain.event + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.EVENT_BODY.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("domain.event"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateDynamicDDDConfig.getOutPath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + writeClassFileV2(classContentBean); + } + + } + //写domain.gataway if(writeContentBean.getTemplateName().equals(TemplateFileEnum.GATAWAY.getTempFileName())){ ClassContentBean classContentBean = new ClassContentBean(); @@ -114,9 +134,9 @@ public class DynamicDDDWriteServiceImpl extends WriteService implements IWriteFi if(writeContentBean.getTemplateName().equals(TemplateFileEnum.GATAWAY_IMPL.getTempFileName())){ ClassContentBean classContentBean = new ClassContentBean(); classContentBean.setClassContent(writeContentBean.getContent()); - classContentBean.setHumpClassName(writeContentBean.getHumpClassName()+"Impl"); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); classContentBean.setChildPackageName("domain.gataway.impl"); - classContentBean.setClassPackageName(writeContentBean.getClassPackageName()+".impl"); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); classContentBean.setModulePath(projectTemplateDynamicDDDConfig.getOutPath()); //走默认的包生成方式 @@ -191,8 +211,8 @@ public class DynamicDDDWriteServiceImpl extends WriteService implements IWriteFi if(writeContentBean.getTemplateName().equals(TemplateFileEnum.ACL_IMPL.getTempFileName())){ ClassContentBean classContentBean = new ClassContentBean(); classContentBean.setClassContent(writeContentBean.getContent()); - classContentBean.setHumpClassName(writeContentBean.getHumpClassName()+"Impl"); - classContentBean.setClassPackageName(writeContentBean.getClassPackageName()+".impl"); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); if(writeContentBean.getHumpClassName().toLowerCase().contains(TemplateFileEnum.ACL.getTempFileName())){ classContentBean.setChildPackageName("infrast.acl.impl"); }else { diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/DynamicInvokeHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/DynamicInvokeHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..96c3253efc5f394bbaa27cb256beef7bed55f584 --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/DynamicInvokeHandler.java @@ -0,0 +1,37 @@ +package com.coderman.codemaker.app.dynamicddd; + +import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; +import com.coderman.codemaker.service.ReadInvokePlantUMLFileService; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * Description: + * date: 2021/10/19 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class DynamicInvokeHandler { + + @Autowired + private ReadInvokePlantUMLFileService readInvokePlantUMLFileService; + + /** + * 进行动态调用的入口 + * @param plantUmlContextBean + */ + public void exeDynamicInvoke(PlantUmlContextBean plantUmlContextBean){ + if(CollectionUtils.isNotEmpty(plantUmlContextBean.getDynamicInvokeFileList())){ + plantUmlContextBean.getDynamicInvokeFileList().forEach(plantUmlFile->{ + readInvokePlantUMLFileService.parseInvokeChainList(plantUmlContextBean,plantUmlFile); + }); + } + } + + + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedControllerElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedControllerElementHandler.java index f9a41663b08b11913ead5a80152479c749c77de2..45c234e9f34cfb950cade98c97c5d02ae115cece 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedControllerElementHandler.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedControllerElementHandler.java @@ -4,13 +4,16 @@ import com.coderman.codemaker.app.ImportPackageService; import com.coderman.codemaker.app.dynamicddd.DomainElementHandler; import com.coderman.codemaker.bean.dddelementderive.ControllerElementBean; import com.coderman.codemaker.bean.plantuml.ClassBean; +import com.coderman.codemaker.bean.plantuml.MethodBean; import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; import com.coderman.codemaker.enums.DomainDerivedElementEnum; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; /** * Description: @@ -41,6 +44,16 @@ public class DerivedControllerElementHandler implements DomainElementHandler methodBeanFilterList = v.getMethodBeanList().stream().filter(methodBean -> + methodBean.getMethodName().toLowerCase().contains(v.getClassName().toLowerCase()) + ).collect(Collectors.toList()); + //如果有多个facade则覆盖默认的方法列表 + if(CollectionUtils.isNotEmpty(methodBeanFilterList)){ + methodBeanFilterList.stream().forEach(methodBean -> methodBean.setMethodName(methodBean.getMethodName().split("\\.")[1])); + v.setMethodBeanList(methodBeanFilterList); + } + v.getMethodBeanList().forEach(methodBean -> methodBean.buildDoc()); classBeanList.add(v); } }); diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedDOBOConvertElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedDOBOConvertElementHandler.java index b938f3e3e0cc7a43946eb7bda3befd9d347beb91..68bf68d13b1a7f505e64ebb4e05ee7b2d92e4b00 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedDOBOConvertElementHandler.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedDOBOConvertElementHandler.java @@ -37,7 +37,8 @@ public class DerivedDOBOConvertElementHandler implements DomainElementHandler convertElementBeanList = new ArrayList<>(); plantUmlContextBean.getDerivedPlantUmlContextBean().getInterfaceBeanMap().forEach((k,v)->{ if(v.getClassName().toLowerCase().endsWith(DomainDerivedElementEnum.DOBO_CONVERT.getElement())){ - importPackageService.setPackageName(v,"data.convert"); + v.setPlantUMLPackage(null); + importPackageService.setPackageName(v,"infrast.dataconvert"); String className = v.getClassName().substring(0,1).toUpperCase().concat(v.getClassName().substring(1)); v.setClassName(className.substring(0,className.lastIndexOf("er"))); convertElementBeanList.add(v); diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedDTOBOConvertElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedDTOBOConvertElementHandler.java index 92a31d61d702e3095de87b77b52d5c63b42c4d14..a82394183750d0506cdff589fc78898002a00250 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedDTOBOConvertElementHandler.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedDTOBOConvertElementHandler.java @@ -39,7 +39,8 @@ public class DerivedDTOBOConvertElementHandler implements DomainElementHandler convertElementBeanList = new ArrayList<>(); plantUmlContextBean.getDerivedPlantUmlContextBean().getInterfaceBeanMap().forEach((k,v)->{ if(v.getClassName().toLowerCase().endsWith(DomainDerivedElementEnum.DTOBO_CONVERT.getElement())){ - importPackageService.setPackageName(v,"model.convert"); + v.setPlantUMLPackage(null); + importPackageService.setPackageName(v,"app.convert"); String className = v.getClassName().substring(0,1).toUpperCase().concat(v.getClassName().substring(1)); v.setClassName(className); convertElementBeanList.add(v); diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedEnumElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedEnumElementHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..99e633ca8a8332c8f04c258dab4162a78ff560e6 --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedEnumElementHandler.java @@ -0,0 +1,54 @@ +package com.coderman.codemaker.app.dynamicddd.derivedhandler; + +import com.coderman.codemaker.app.ImportPackageService; +import com.coderman.codemaker.app.dynamicddd.DerivedClassFactory; +import com.coderman.codemaker.app.dynamicddd.DomainElementHandler; +import com.coderman.codemaker.bean.dddelementderive.DtoElementBean; +import com.coderman.codemaker.bean.dddelementderive.EnumElementBean; +import com.coderman.codemaker.bean.plantuml.*; +import com.coderman.codemaker.enums.DomainDerivedElementEnum; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Description: + * date: 2021/7/8 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + * 处理派生类domain.enum->rpc.client.enum + */ +@Component(value = "derivedEnumElementHandler") +public class DerivedEnumElementHandler implements DomainElementHandler { + + @Autowired + private ImportPackageService importPackageService; + + @Override + public EnumElementBean getElementBeanList(PlantUmlContextBean plantUmlContextBean) { + if(plantUmlContextBean.getDerivedPlantUmlContextBean() == null){ + return null; + } + EnumElementBean enumElementBean = new EnumElementBean(); + List enumElementBeanList = new ArrayList<>(); + plantUmlContextBean.getDerivedPlantUmlContextBean().getEnumBeanMap().forEach((k,v)->{ + if(v.getClassName().toLowerCase().endsWith(DomainDerivedElementEnum.ENUM.getElement())){ + String className = v.getClassName().substring(0,1).toUpperCase().concat(v.getClassName().substring(1)); + v.setClassName(className); + List beanList = v.getFieldBeanList().stream().filter(f -> !f.isCopyToRpcClientKey()) + .collect(Collectors.toList()); + v.setFieldBeanList(beanList); + enumElementBeanList.add(v); + } + }); + enumElementBean.setEnumBeanList(enumElementBeanList); + + return enumElementBean; + } +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedFacadeElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedFacadeElementHandler.java index 3c58c2dc376c393ec8229f76597601741c2b6f8f..1c2aeea14dacc5a17ea5edd09193c93023a56728 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedFacadeElementHandler.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedFacadeElementHandler.java @@ -12,6 +12,7 @@ import com.coderman.codemaker.bean.plantuml.MethodBean; import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; import com.coderman.codemaker.enums.DomainDerivedElementEnum; import com.coderman.codemaker.enums.DomainElementEnum; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -54,8 +55,19 @@ public class DerivedFacadeElementHandler implements DomainElementHandler methodBeanFilterList = methodBeanList.stream().filter(methodBean -> + methodBean.getMethodName().toLowerCase().contains(v.getClassName().toLowerCase()) + ).collect(Collectors.toList()); + //如果有多个facade则覆盖默认的方法列表 + if(CollectionUtils.isNotEmpty(methodBeanFilterList)){ + methodBeanFilterList.stream().forEach(methodBean -> methodBean.setMethodName(methodBean.getMethodName().split("\\.")[1])); + v.setMethodBeanList(methodBeanFilterList); + } + v.getMethodBeanList().forEach(methodBean -> methodBean.buildDoc()); + facadeElementBeanList.add(v); } }); diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedGatawayImplElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedGatawayImplElementHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..5c5d4a628f0ffe03ff47a6aae79f6b4b2760939f --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedGatawayImplElementHandler.java @@ -0,0 +1,64 @@ +package com.coderman.codemaker.app.dynamicddd.derivedhandler; + +import com.coderman.codemaker.app.ImportPackageService; +import com.coderman.codemaker.app.dynamicddd.DerivedClassFactory; +import com.coderman.codemaker.app.dynamicddd.DomainElementHandler; +import com.coderman.codemaker.bean.dddelementderive.FacadeImplElementBean; +import com.coderman.codemaker.bean.dddelementderive.GatawayImplElementBean; +import com.coderman.codemaker.bean.plantuml.ClassBean; +import com.coderman.codemaker.bean.plantuml.InterfaceBean; +import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; +import com.coderman.codemaker.enums.DomainDerivedElementEnum; +import com.coderman.codemaker.enums.DomainElementEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description: + * date: 2021/7/8 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + * 处理gatawayimpl + */ +@Component(value = "derivedGatawayImplElementHandler") +public class DerivedGatawayImplElementHandler implements DomainElementHandler { + @Autowired + private DerivedClassFactory derivedClassFactory; + + @Autowired + private ImportPackageService importPackageService; + + @Override + public GatawayImplElementBean getElementBeanList(PlantUmlContextBean plantUmlContextBean) { + if(plantUmlContextBean.getDerivedPlantUmlContextBean() == null){ + return null; + } + GatawayImplElementBean gatawayImplElementBean = new GatawayImplElementBean(); + + List interfaceBeanList = new ArrayList<>(); + plantUmlContextBean.getInterfaceBeanMap().forEach((k,v)->{ + if(v.getClassName().toLowerCase().endsWith(DomainElementEnum.GATAWAY.getElement())){ + importPackageService.setPackageName(v,"app.facadeimpl"); + String className = v.getClassName().substring(0,1).toUpperCase().concat(v.getClassName().substring(1)); + v.setClassName(className); + interfaceBeanList.add(v); + } + }); + + + List gatawayImplElementBeanList = derivedClassFactory.deriveGataway2GatawayImpl(interfaceBeanList,plantUmlContextBean); + + gatawayImplElementBeanList.stream().forEach(v-> importPackageService.dealImportClass(v,plantUmlContextBean)); + + gatawayImplElementBean.setClassBeanList(gatawayImplElementBeanList); + + + return gatawayImplElementBean; + + } +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedInfrastAclImplElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedInfrastAclImplElementHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..90ceea6e17f758b303467e571ada786168e12add --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedInfrastAclImplElementHandler.java @@ -0,0 +1,59 @@ +package com.coderman.codemaker.app.dynamicddd.derivedhandler; + +import com.coderman.codemaker.app.ImportPackageService; +import com.coderman.codemaker.app.dynamicddd.DerivedClassFactory; +import com.coderman.codemaker.app.dynamicddd.DomainElementHandler; +import com.coderman.codemaker.bean.dddelementderive.GatawayImplElementBean; +import com.coderman.codemaker.bean.dddelementderive.InfrastAclImplElementBean; +import com.coderman.codemaker.bean.plantuml.ClassBean; +import com.coderman.codemaker.bean.plantuml.InterfaceBean; +import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; +import com.coderman.codemaker.enums.DomainElementEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description: + * date: 2021/7/8 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + * 处理infrastaclImpl + */ +@Component(value = "derivedInfrastAclImplElementHandler") +public class DerivedInfrastAclImplElementHandler implements DomainElementHandler { + @Autowired + private DerivedClassFactory derivedClassFactory; + + @Autowired + private ImportPackageService importPackageService; + + @Override + public InfrastAclImplElementBean getElementBeanList(PlantUmlContextBean plantUmlContextBean) { + + InfrastAclImplElementBean infrastAclImplElementBean = new InfrastAclImplElementBean(); + + List interfaceBeanList = new ArrayList<>(); + plantUmlContextBean.getInterfaceBeanMap().forEach((k,v)->{ + if(v.getClassName().toLowerCase().endsWith(DomainElementEnum.ACL.getElement()) + || v.getClassName().toLowerCase().endsWith(DomainElementEnum.ADAPTER.getElement())){ + interfaceBeanList.add(v); + } + }); + + + List infrastAclImplElementBeanList = derivedClassFactory.deriveInfrastAcl2InfrastImpl(interfaceBeanList,plantUmlContextBean); + + infrastAclImplElementBeanList.stream().forEach(v-> importPackageService.dealImportClass(v,plantUmlContextBean)); + + infrastAclImplElementBean.setClassBeanList(infrastAclImplElementBeanList); + + + return infrastAclImplElementBean; + + } +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedRepositoryImplElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedRepositoryImplElementHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..589fa323f356cdf663d4ad38d912c0ae1d0f4e35 --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedRepositoryImplElementHandler.java @@ -0,0 +1,63 @@ +package com.coderman.codemaker.app.dynamicddd.derivedhandler; + +import com.coderman.codemaker.app.ImportPackageService; +import com.coderman.codemaker.app.dynamicddd.DerivedClassFactory; +import com.coderman.codemaker.app.dynamicddd.DomainElementHandler; +import com.coderman.codemaker.bean.dddelementderive.FacadeImplElementBean; +import com.coderman.codemaker.bean.dddelementderive.GatawayImplElementBean; +import com.coderman.codemaker.bean.dddelementderive.RepositoryImplElementBean; +import com.coderman.codemaker.bean.plantuml.ClassBean; +import com.coderman.codemaker.bean.plantuml.InterfaceBean; +import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; +import com.coderman.codemaker.enums.DomainDerivedElementEnum; +import com.coderman.codemaker.enums.DomainElementEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description: + * date: 2021/7/8 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + * 处理repositoryimpl + */ +@Component(value = "derivedRepositoryImplElementHandler") +public class DerivedRepositoryImplElementHandler implements DomainElementHandler { + @Autowired + private DerivedClassFactory derivedClassFactory; + + @Autowired + private ImportPackageService importPackageService; + + @Override + public RepositoryImplElementBean getElementBeanList(PlantUmlContextBean plantUmlContextBean) { + if(plantUmlContextBean.getDerivedPlantUmlContextBean() == null){ + return null; + } + RepositoryImplElementBean repositoryImplElementBean = new RepositoryImplElementBean(); + List repositoryElementBeanList = new ArrayList<>(); + plantUmlContextBean.getInterfaceBeanMap().forEach((k,v)->{ + if(v.getClassName().toLowerCase().endsWith(DomainElementEnum.REPOSITORY.getElement())){ + importPackageService.setPackageName(v,"app.facadeimpl"); + String className = v.getClassName().substring(0,1).toUpperCase().concat(v.getClassName().substring(1)); + v.setClassName(className); + repositoryElementBeanList.add(v); + } + }); + + List repositoryImplElementBeanList = derivedClassFactory.deriveRepository2RepositoryImpl(repositoryElementBeanList,plantUmlContextBean); + + + repositoryImplElementBeanList.stream().forEach(v-> importPackageService.dealImportClass(v,plantUmlContextBean)); + + repositoryImplElementBean.setClassBeanList(repositoryImplElementBeanList); + + return repositoryImplElementBean; + + } +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedVOElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedVOElementHandler.java index aef1819fe881a9a45962f993aa4572279ef129d2..cf99ec051853e4ce7065024efe29b8d3969a3334 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedVOElementHandler.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/derivedhandler/DerivedVOElementHandler.java @@ -51,6 +51,7 @@ public class DerivedVOElementHandler implements DomainElementHandler methodBean.buildDoc()); interfaceBeanList.add(v); } }); @@ -52,6 +53,7 @@ public class AppExeElementHandler implements DomainElementHandler methodBean.buildDoc()); classBeanList.add(v); } }); diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/AppListenerElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/AppListenerElementHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..6ab4d620e4fda6c9cbafee2d569df72b112b14ca --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/AppListenerElementHandler.java @@ -0,0 +1,48 @@ +package com.coderman.codemaker.app.dynamicddd.handler; + +import com.coderman.codemaker.app.ImportPackageService; +import com.coderman.codemaker.app.dynamicddd.DomainElementHandler; +import com.coderman.codemaker.bean.dddelement.AppListenerElementBean; +import com.coderman.codemaker.bean.dddelement.FactoryElementBean; +import com.coderman.codemaker.bean.plantuml.ClassBean; +import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; +import com.coderman.codemaker.enums.DomainElementEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description: + * date: 2021/6/29 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Component(value = "appListenerElementHandler") +public class AppListenerElementHandler implements DomainElementHandler { + + @Autowired + private ImportPackageService importPackageService; + + @Override + public AppListenerElementBean getElementBeanList(PlantUmlContextBean plantUmlContextBean) { + AppListenerElementBean appListenerElementBean = new AppListenerElementBean(); + List appListenerElementBeanList = new ArrayList<>(); + plantUmlContextBean.getClassBeanMap().forEach((k,v)->{ + if(v.getClassName().toLowerCase().endsWith(DomainElementEnum.APP_LISTENER.getElement())){ + importPackageService.setPackageName(v,"app.listener"); + String className = v.getClassName().substring(0,1).toUpperCase().concat(v.getClassName().substring(1)); + v.setClassName(className); + importPackageService.dealImportClass(v,plantUmlContextBean); + appListenerElementBeanList.add(v); + } + }); + appListenerElementBean.setClassBeanList(appListenerElementBeanList); + return appListenerElementBean; + } + +} + diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/DomainBoElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/DomainBoElementHandler.java index bf6c650bdcb90513f1cfea3c07ee45b4f12b6a7b..e7af09010db487a16213f8f292b56b632ba7c8ba 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/DomainBoElementHandler.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/DomainBoElementHandler.java @@ -1,5 +1,6 @@ package com.coderman.codemaker.app.dynamicddd.handler; +import com.alibaba.fastjson.JSON; import com.coderman.codemaker.app.ImportPackageService; import com.coderman.codemaker.app.dynamicddd.DerivedClassFactory; import com.coderman.codemaker.app.dynamicddd.DomainElementHandler; @@ -46,31 +47,46 @@ public class DomainBoElementHandler implements DomainElementHandler boWithVoKeyList = new ArrayList<>(); List boWithControllerKeyList = new ArrayList<>(); - //过滤带有数据库表映射的bo plantUmlContextBean.getClassBeanMap().forEach((k, v) -> { - importPackageService.setPackageName(v, "domain.bo"); + if (v.getClassName().toLowerCase().endsWith(DomainElementEnum.BO.getElement())) { + importPackageService.setPackageName(v, "domain.bo"); Optional optionalFieldBean = v.getFieldBeanList().stream().filter(f -> f.isTableKey()).findFirst(); if (optionalFieldBean.isPresent()) { boWithTableKeyList.add(v); + v.getExtendFieldBean().buildTableKey(optionalFieldBean.get().getFieldName()); } Optional optionalFieldBeanDtoKey = v.getFieldBeanList().stream().filter(f -> f.isDtoKey()).findFirst(); if (optionalFieldBeanDtoKey.isPresent()) { boWithDtoKeyList.add(v); + v.getExtendFieldBean().buildDtoKeyArr(optionalFieldBeanDtoKey.get().getFieldName()); } Optional optionalFieldBeanFacadeKey = v.getFieldBeanList().stream().filter(f -> f.isFacadeKey()).findFirst(); if (optionalFieldBeanFacadeKey.isPresent()) { boWithFacadeKeyList.add(v); + v.getExtendFieldBean().buildFacadeKeyArr(optionalFieldBeanFacadeKey.get().getFieldName()); } Optional optionalFieldBeanVOKey = v.getFieldBeanList().stream().filter(f -> f.isVoKey()).findFirst(); if (optionalFieldBeanVOKey.isPresent()) { boWithVoKeyList.add(v); + v.getExtendFieldBean().buildVoKeyArr(optionalFieldBeanVOKey.get().getFieldName()); + } Optional optionalFieldBeanControllerKey = v.getFieldBeanList().stream().filter(f -> f.isControllerKey()).findFirst(); if (optionalFieldBeanControllerKey.isPresent()) { boWithControllerKeyList.add(v); + v.getExtendFieldBean().buildControllerKeyArr(optionalFieldBeanControllerKey.get().getFieldName()); + + } + + Optional optionalFieldBeanInvokeFileKey= v.getFieldBeanList().stream().filter(f -> f.isInvokeFileKey()).findFirst(); + if (optionalFieldBeanInvokeFileKey.isPresent()) { + v.getExtendFieldBean().buildInvokeFileKeyArr(optionalFieldBeanInvokeFileKey.get().getFieldName()); + + String invokeFileName = optionalFieldBeanInvokeFileKey.get().getFieldName().replace("String","").replace("string","").trim(); + plantUmlContextBean.addDynamicInvokeFile(invokeFileName); } } }); @@ -89,9 +105,9 @@ public class DomainBoElementHandler implements DomainElementHandler { if (v.getClassName().toLowerCase().endsWith(DomainElementEnum.BO.getElement())) { //过滤扩展属性 @@ -116,6 +130,7 @@ public class DomainBoElementHandler implements DomainElementHandler importPackageService.dealImportClass(v, plantUmlContextBean)); domainBoElementBean.setClassBeanList(domainBoElementBeanList); - - - return domainBoElementBean; } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/DomainFactoryElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/DomainFactoryElementHandler.java index c8da338873e0b4c4491daba58872508837758fd2..ce78bf21578a7b4421d21be8b659c1f2fd4ca772 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/DomainFactoryElementHandler.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/DomainFactoryElementHandler.java @@ -37,6 +37,7 @@ public class DomainFactoryElementHandler implements DomainElementHandler methodBean.buildDoc()); } }); factoryElementBean.setClassBeanList(domainBoElementBeanList); diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/DomainGatawayElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/DomainGatawayElementHandler.java index a141be79f9b0ec8a5f45572b838508eeb75a7d82..ccef099aa01216529a37abaaec5b3f88694e6661 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/DomainGatawayElementHandler.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/DomainGatawayElementHandler.java @@ -3,9 +3,12 @@ package com.coderman.codemaker.app.dynamicddd.handler; import com.coderman.codemaker.app.ImportPackageService; import com.coderman.codemaker.app.dynamicddd.DomainElementHandler; import com.coderman.codemaker.bean.dddelement.GatawayElementBean; +import com.coderman.codemaker.bean.plantuml.ClassBean; import com.coderman.codemaker.bean.plantuml.InterfaceBean; +import com.coderman.codemaker.bean.plantuml.MethodBean; import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; import com.coderman.codemaker.enums.DomainElementEnum; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -37,6 +40,8 @@ public class DomainGatawayElementHandler implements DomainElementHandler methodBean.buildDoc()); + } }); gatawayElementBean.setInterfaceBeanList(gatawInterfaceBeanList); diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/EventElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/EventElementHandler.java index 3147ee0df32b29582020d4d8e56e74a2390eae51..1d5f5076ec536e7d39624dd7a44f0e33c75bdeaf 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/EventElementHandler.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/EventElementHandler.java @@ -1,5 +1,18 @@ package com.coderman.codemaker.app.dynamicddd.handler; +import com.coderman.codemaker.app.ImportPackageService; +import com.coderman.codemaker.app.dynamicddd.DomainElementHandler; +import com.coderman.codemaker.bean.dddelement.DomainEventElementBean; +import com.coderman.codemaker.bean.dddelement.DomainMsgBodyElementBean; +import com.coderman.codemaker.bean.plantuml.ClassBean; +import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; +import com.coderman.codemaker.enums.DomainElementEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + /** * Description: * date: 2021/6/30 @@ -8,5 +21,28 @@ package com.coderman.codemaker.app.dynamicddd.handler; * @version 1.0.0 * @since JDK 1.8 */ -public class EventElementHandler { +@Component(value = "eventElementHandler") +public class EventElementHandler implements DomainElementHandler { + + @Autowired + private ImportPackageService importPackageService; + + + @Override + public DomainEventElementBean getElementBeanList(PlantUmlContextBean plantUmlContextBean) { + DomainEventElementBean domainEventElementBean = new DomainEventElementBean(); + List domainmsgBodyBeanList = new ArrayList<>(); + plantUmlContextBean.getClassBeanMap().forEach((k,v)->{ + if(v.getClassName().toLowerCase().endsWith(DomainElementEnum.EVENT.getElement())){ + importPackageService.setPackageName(v,"domain.event"); + + String className = v.getClassName().substring(0,1).toUpperCase().concat(v.getClassName().substring(1)); + v.setClassName(className); + importPackageService.dealImportClass(v,plantUmlContextBean); + domainmsgBodyBeanList.add(v); + } + }); + domainEventElementBean.setClassBeanList(domainmsgBodyBeanList); + return domainEventElementBean; + } } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/InfrastAclElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/InfrastAclElementHandler.java index afec55325000ef9f1799d6ed40698ef1d22366b5..b5c7a86b25b71a5fda7d5d3ca77244384c44fdc1 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/InfrastAclElementHandler.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/InfrastAclElementHandler.java @@ -31,8 +31,7 @@ import java.util.Set; @Component(value = "infrastAclElementHandler") public class InfrastAclElementHandler implements DomainElementHandler { - @Autowired - private ProjectTemplateDynamicDDDConfig projectTemplateDynamicDDDConfig; + @Autowired private ImportPackageService importPackageService; @@ -104,7 +103,6 @@ public class InfrastAclElementHandler implements DomainElementHandler { + + @Autowired + private ImportPackageService importPackageService; + + @Override + public MqConsumerElementBean getElementBeanList(PlantUmlContextBean plantUmlContextBean) { + MqConsumerElementBean mqConsumerElementBean = new MqConsumerElementBean(); + List appListenerElementBeanList = new ArrayList<>(); + plantUmlContextBean.getClassBeanMap().forEach((k,v)->{ + if(v.getClassName().toLowerCase().endsWith(DomainElementEnum.MQ_CONSUMER.getElement())){ + String moduleTag = "infrast"; + if(StringUtils.isEmpty(v.getPlantUMLPackage())){ + moduleTag = moduleTag+".mq.consumer"; + } + importPackageService.setPackageNameWithModule(v,moduleTag); + String className = v.getClassName().substring(0,1).toUpperCase().concat(v.getClassName().substring(1)); + v.setClassName(className); + importPackageService.dealImportClass(v,plantUmlContextBean); + appListenerElementBeanList.add(v); + } + }); + mqConsumerElementBean.setClassBeanList(appListenerElementBeanList); + return mqConsumerElementBean; + } + +} + diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/MqHandlerElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/MqHandlerElementHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..6247b926a90cc6a58e28f69d585ba9c3d00a47f4 --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/MqHandlerElementHandler.java @@ -0,0 +1,53 @@ +package com.coderman.codemaker.app.dynamicddd.handler; + +import com.coderman.codemaker.app.ImportPackageService; +import com.coderman.codemaker.app.dynamicddd.DomainElementHandler; +import com.coderman.codemaker.bean.dddelement.AppListenerElementBean; +import com.coderman.codemaker.bean.dddelement.MqHandlerElementBean; +import com.coderman.codemaker.bean.plantuml.ClassBean; +import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; +import com.coderman.codemaker.enums.DomainElementEnum; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description: + * date: 2021/6/29 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Component(value = "mqHandlerElementHandler") +public class MqHandlerElementHandler implements DomainElementHandler { + + @Autowired + private ImportPackageService importPackageService; + + @Override + public MqHandlerElementBean getElementBeanList(PlantUmlContextBean plantUmlContextBean) { + MqHandlerElementBean mqHandlerElementBean = new MqHandlerElementBean(); + List appListenerElementBeanList = new ArrayList<>(); + plantUmlContextBean.getClassBeanMap().forEach((k,v)->{ + if(v.getClassName().toLowerCase().endsWith(DomainElementEnum.MQ_HANDLER.getElement())){ + String moduleTag = "infrast"; + if(StringUtils.isEmpty(v.getPlantUMLPackage())){ + moduleTag = moduleTag+".mq.handler"; + } + importPackageService.setPackageNameWithModule(v,moduleTag); + String className = v.getClassName().substring(0,1).toUpperCase().concat(v.getClassName().substring(1)); + v.setClassName(className); + importPackageService.dealImportClass(v,plantUmlContextBean); + appListenerElementBeanList.add(v); + } + }); + mqHandlerElementBean.setClassBeanList(appListenerElementBeanList); + return mqHandlerElementBean; + } + +} + diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/MqProducerElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/MqProducerElementHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..1014de216e3c32144fbb055ecb8e9c978c0d9783 --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/MqProducerElementHandler.java @@ -0,0 +1,54 @@ +package com.coderman.codemaker.app.dynamicddd.handler; + +import com.coderman.codemaker.app.ImportPackageService; +import com.coderman.codemaker.app.dynamicddd.DomainElementHandler; +import com.coderman.codemaker.bean.dddelement.AppListenerElementBean; +import com.coderman.codemaker.bean.dddelement.MqProducerElementBean; +import com.coderman.codemaker.bean.plantuml.ClassBean; +import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; +import com.coderman.codemaker.enums.DomainElementEnum; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description: + * date: 2021/6/29 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Component(value = "mqProducerElementHandler") +public class MqProducerElementHandler implements DomainElementHandler { + + @Autowired + private ImportPackageService importPackageService; + + @Override + public MqProducerElementBean getElementBeanList(PlantUmlContextBean plantUmlContextBean) { + MqProducerElementBean mqProducerElementBean = new MqProducerElementBean(); + List appListenerElementBeanList = new ArrayList<>(); + plantUmlContextBean.getClassBeanMap().forEach((k,v)->{ + if(v.getClassName().toLowerCase().endsWith(DomainElementEnum.MQ_PRODUCER.getElement())){ + String moduleTag = "infrast"; + if(StringUtils.isEmpty(v.getPlantUMLPackage())){ + moduleTag = moduleTag+".mq.producer"; + } + importPackageService.setPackageNameWithModule(v,moduleTag); + + String className = v.getClassName().substring(0,1).toUpperCase().concat(v.getClassName().substring(1)); + v.setClassName(className); + importPackageService.dealImportClass(v,plantUmlContextBean); + appListenerElementBeanList.add(v); + } + }); + mqProducerElementBean.setClassBeanList(appListenerElementBeanList); + return mqProducerElementBean; + } + +} + diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/RepositoryElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/RepositoryElementHandler.java index 578ca4e0f8fd5f5ed718ed3c1d799f77d462f42b..afe28d964eebb0accb83a709772b9b1d29930a81 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/RepositoryElementHandler.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/RepositoryElementHandler.java @@ -6,6 +6,7 @@ import com.coderman.codemaker.bean.dddelement.RepositoryElementBean; import com.coderman.codemaker.bean.plantuml.InterfaceBean; import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; import com.coderman.codemaker.enums.DomainElementEnum; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -37,6 +38,7 @@ public class RepositoryElementHandler implements DomainElementHandler methodBean.buildDoc()); } }); repositoryElementBean.setInterfaceBeanList(repositoryInterfaceBeanList); diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/ValueObjectElementHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/ValueObjectElementHandler.java index 54dd77ebfd04827582f396e6dd1f87d3dc7902e0..14b6837a068bf85189af4c9e953b01234f02f4f8 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/ValueObjectElementHandler.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/dynamicddd/handler/ValueObjectElementHandler.java @@ -1,6 +1,7 @@ package com.coderman.codemaker.app.dynamicddd.handler; import com.coderman.codemaker.app.ImportPackageService; +import com.coderman.codemaker.app.dynamicddd.DerivedClassFactory; import com.coderman.codemaker.app.dynamicddd.DomainElementHandler; import com.coderman.codemaker.bean.dddelement.ValueObjectElementBean; import com.coderman.codemaker.bean.plantuml.ClassBean; @@ -9,12 +10,15 @@ import com.coderman.codemaker.bean.plantuml.FieldBean; import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; import com.coderman.codemaker.enums.DomainElementEnum; import com.coderman.codemaker.enums.VisibilityEnum; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; /** * Description: @@ -29,6 +33,8 @@ public class ValueObjectElementHandler implements DomainElementHandler enumWithToRpcClientKeyList = new ArrayList<>(); + plantUmlContextBean.getEnumBeanMap().forEach((k, v) -> { List enumValueList = new ArrayList<>(); v.getEnumValueList().forEach(value -> { @@ -63,10 +72,25 @@ public class ValueObjectElementHandler implements DomainElementHandler optionalFieldBean = v.getFieldBeanList().stream().filter(f -> f.isCopyToRpcClientKey()).findFirst(); + if (optionalFieldBean.isPresent()) { + enumWithToRpcClientKeyList.add(v); + } + + List fieldBeanList = v.getFieldBeanList().stream() + .filter(fieldBean -> !fieldBean.isCopyToRpcClientKey()) + .collect(Collectors.toList()); + v.setFieldBeanList(fieldBeanList); dealConstruct(v); enumBeanList.add(v); }); + + //将领域值对象-枚举类复制到rpc client端 + if(CollectionUtils.isNotEmpty(enumWithToRpcClientKeyList)){ + //基于plantuml.enum的扩展信息进行派生 + derivedClassFactory.deriveEnum2Enum(enumWithToRpcClientKeyList, plantUmlContextBean); + } valueObjectElementBean.setEnumBeanList(enumBeanList); valueObjectElementBean.setClassBeanList(domainBoElementBeanList); return valueObjectElementBean; diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/app/springboot/SpringBootWriteServiceImpl.java b/codemaker-core/src/main/java/com/coderman/codemaker/app/springboot/SpringBootWriteServiceImpl.java index 886e8181dc4b93b327be60fa349ad1af441799c7..259498a3d64d9f8e27bbf25404b1947cd34f5415 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/app/springboot/SpringBootWriteServiceImpl.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/app/springboot/SpringBootWriteServiceImpl.java @@ -286,6 +286,28 @@ public class SpringBootWriteServiceImpl extends WriteService implements IWriteFi writeClassFileV2(classContentBean); } } + + //写domain.event + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.EVENT_BODY.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("domain.event"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateConfig.getOutPath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + writeClassFileV2(classContentBean); + } + + } + + //写domain.msgbody if(writeContentBean.getTemplateName().equals(TemplateFileEnum.MESSAGE_BODY.getTempFileName())){ ClassContentBean classContentBean = new ClassContentBean(); @@ -328,9 +350,9 @@ public class SpringBootWriteServiceImpl extends WriteService implements IWriteFi if(writeContentBean.getTemplateName().equals(TemplateFileEnum.GATAWAY_IMPL.getTempFileName())){ ClassContentBean classContentBean = new ClassContentBean(); classContentBean.setClassContent(writeContentBean.getContent()); - classContentBean.setHumpClassName(writeContentBean.getHumpClassName()+"Impl"); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); classContentBean.setChildPackageName("gataway.impl"); - classContentBean.setClassPackageName(writeContentBean.getClassPackageName()+".impl"); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); classContentBean.setModulePath(projectTemplateConfig.getOutPath()); //走默认的包生成方式 @@ -381,12 +403,6 @@ public class SpringBootWriteServiceImpl extends WriteService implements IWriteFi if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ writeClassFile(classContentBean); }else { - if(!classContentBean.getClassPackageName().endsWith("impl") || !classContentBean.getClassPackageName().contains("impl")){ - classContentBean.setClassPackageName(classContentBean.getClassPackageName()+".impl"); - } - if(!classContentBean.getHumpClassName().endsWith("impl") || !classContentBean.getHumpClassName().contains("impl")){ - classContentBean.setHumpClassName(classContentBean.getHumpClassName()+"Impl"); - } //走文档里的package包生成方式 writeClassFileV2(classContentBean); } @@ -456,6 +472,88 @@ public class SpringBootWriteServiceImpl extends WriteService implements IWriteFi } + //写app.listener + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.MQ_LISTENER.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("app.listener"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateConfig.getOutPath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + writeClassFileV2(classContentBean); + } + } + + + + //写infras.mq.consumer + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.MQ_CONSUMER.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("infrast.mq.consumer"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateConfig.getOutPath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + classContentBean.setClassPackageName(appServiceConfig.getPackage()+".infrast.mq.consumer"); + + writeClassFileV2(classContentBean); + } + } + + //写infras.mq.handler + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.MQ_HANDLER.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("infrast.mq.handler"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateConfig.getOutPath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + classContentBean.setClassPackageName(appServiceConfig.getPackage()+".infrast.mq.handler"); + //走文档里的package包生成方式 + writeClassFileV2(classContentBean); + } + } + + //写infras.mq.producer + if(writeContentBean.getTemplateName().equals(TemplateFileEnum.MQ_PRODUCER.getTempFileName())){ + ClassContentBean classContentBean = new ClassContentBean(); + classContentBean.setClassContent(writeContentBean.getContent()); + classContentBean.setHumpClassName(writeContentBean.getHumpClassName()); + classContentBean.setChildPackageName("infrast.mq.producer"); + classContentBean.setClassSuffix(""); + classContentBean.setClassPackageName(writeContentBean.getClassPackageName()); + classContentBean.setModulePath(projectTemplateConfig.getOutPath()); + + //走默认的包生成方式 + if(StringUtils.isEmpty(classContentBean.getClassPackageName())){ + writeClassFile(classContentBean); + }else { + //走文档里的package包生成方式 + classContentBean.setClassPackageName(appServiceConfig.getPackage()+".infrast.mq.producer"); + writeClassFileV2(classContentBean); + } + } + } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/GlobalConstant.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/GlobalConstant.java index 3dd4bf83b48728026a495701afa0142359f1494e..9956420a9dc9086ead8cdbd99d7a1124b410f326 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/bean/GlobalConstant.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/GlobalConstant.java @@ -33,4 +33,23 @@ public class GlobalConstant { * plantuml bo中的特殊属性-标示controller类名 */ public static final String CONTROLLER_KEY = "controllerkey"; + + + /** + * plantuml enum中的特殊属性-标示enum要复制到rpc client模块中 + */ + public static final String COPY2RPC_CLIENT_KEY = "torpcclient"; + + + /** + * plantuml invoke动态调用流程图的链路标示 + */ + public static final String INVOKE_TAG = "invoke"; + + + + /** + * plantuml bo中的特殊属性-标示BO对应的业务方法调用流程 + */ + public static final String INVOKE_FILE_KEY = "invokefilekey"; } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/TableBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/TableBean.java index 1bda980ae7e001b1e2416f291dd6f35fac2683bd..74fbac36baa54031f9ff081038912be668c33d5a 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/bean/TableBean.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/TableBean.java @@ -1,8 +1,13 @@ package com.coderman.codemaker.bean; import com.coderman.codemaker.bean.plantuml.ClassBean; +import com.coderman.codemaker.bean.plantuml.InterfaceBean; +import com.coderman.codemaker.bean.plantuml.MethodBean; import org.assertj.core.util.Lists; +import java.util.ArrayList; +import java.util.List; + /** * Created on 2018-7-19. * @@ -81,6 +86,31 @@ public class TableBean { return classBean; } + /** + * 将mapper层整体注册到plantUmlContextBean 上下文中 + * @param packageName + * @return + */ + public InterfaceBean convertToMapperInterface(String packageName){ + InterfaceBean interfaceBean = new InterfaceBean(); + interfaceBean.setClassName(this.getHumpClassName()+"Mapper"); + interfaceBean.setPackageName(packageName); + interfaceBean.setClassDesc(tableComment); + interfaceBean.setPlantUMLPackage("dao.mapper"); + + List methodBeanList = new ArrayList<>(); + String paramType = this.getHumpClassName()+"DO"; + String varName = paramType.substring(0,1).toLowerCase()+paramType.substring(1); + methodBeanList.add(new MethodBean("insert("+paramType+" "+varName+")","int")); + methodBeanList.add(new MethodBean("update("+paramType+" "+varName+")","int")); + methodBeanList.add(new MethodBean("getAll()","Long")); + methodBeanList.add(new MethodBean("getById(Long id)","Long")); + methodBeanList.add(new MethodBean("deleteById(Long id)","int")); + + interfaceBean.setMethodBeanList(methodBeanList); + return interfaceBean; + } + public ClassBean getClassBean() { return classBean; diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/AppListenerElementBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/AppListenerElementBean.java new file mode 100644 index 0000000000000000000000000000000000000000..c743178d865c7235ad84d9f1497328b0e28c4155 --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/AppListenerElementBean.java @@ -0,0 +1,13 @@ +package com.coderman.codemaker.bean.dddelement; + +/** + * Description: + * date: 2021/6/28 + * 监听器元素 + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class AppListenerElementBean extends ElementBean { + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/ElementBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/ElementBean.java index efe66602c3931ec65ec0fc452ce52b613b9b6d9a..68850fd93ebec1beb45b63697e79984a79d75e54 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/ElementBean.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/ElementBean.java @@ -1,9 +1,10 @@ package com.coderman.codemaker.bean.dddelement; -import com.coderman.codemaker.bean.plantuml.ClassBean; -import com.coderman.codemaker.bean.plantuml.EnumBean; -import com.coderman.codemaker.bean.plantuml.InterfaceBean; +import com.coderman.codemaker.bean.plantuml.*; +import com.coderman.codemaker.enums.DomainElementEnum; +import org.apache.commons.collections4.CollectionUtils; +import java.util.ArrayList; import java.util.List; /** @@ -51,4 +52,97 @@ public abstract class ElementBean { public void setEnumBeanList(List enumBeanList) { this.enumBeanList = enumBeanList; } + + + /** + * 动态调用执行之后再次更新代码元素内容 + * @param plantUmlContextBean + * @param elementType + */ + public ElementBean refreshClass(PlantUmlContextBean plantUmlContextBean,String elementType){ + List newClassBeanList = new ArrayList<>(); + plantUmlContextBean.getClassBeanMap().forEach((k,v)->{ + if(elementType.contains(",")){ + String [] elementArr = elementType.split(","); + for (String str : elementArr){ + if(v.getClassName().toLowerCase().endsWith(str)){ + newClassBeanList.add(v); + break; + } + } + }else{ + if(v.getClassName().toLowerCase().endsWith(elementType)){ + newClassBeanList.add(v); + } + } + + }); + if(plantUmlContextBean.getDerivedPlantUmlContextBean() != null){ + plantUmlContextBean.getDerivedPlantUmlContextBean().getClassBeanMap().forEach((k,v)->{ + if(v.getClassName().toLowerCase().endsWith(elementType)){ + newClassBeanList.add(v); + } + }); + } + + + for (ClassBean classBean : newClassBeanList){ + if(!classBean.getClassName().endsWith("Impl")){ + List methodBeanList = new ArrayList<>(); + for (MethodBean oldBean : classBean.getMethodBeanList()){ + StringBuilder contentBuilder = new StringBuilder(""); + if(!CollectionUtils.isEmpty(oldBean.getInvokeMethodList())){ + for (String str : oldBean.getInvokeMethodList()){ + contentBuilder.append(" "+str+";\n"); + } + } + methodBeanList.add(oldBean.copySelf(contentBuilder.toString())); + } + classBean.setMethodBeanList(methodBeanList); + continue; + } + String interfaceName = classBean.getClassName().replace("Impl",""); + InterfaceBean interfaceBean = plantUmlContextBean.getInterfaceBeanMap().get(interfaceName); + if(interfaceBean == null){ + interfaceBean = plantUmlContextBean.getDerivedPlantUmlContextBean().getInterfaceBeanMap().get(interfaceName); + } + if(interfaceBean == null){ + continue; + } + //构建方法内容 + interfaceBean.getMethodBeanList().forEach(methodBean -> methodBean.buildMethodContent()); + classBean.mergeImportClass(interfaceBean.getImportClassList()); + classBean.mergeImportClass(interfaceBean.getDynamicImportPackageList()); + classBean.setMethodBeanList(interfaceBean.getMethodBeanList()); + classBean.setFieldBeanList(interfaceBean.getFieldBeanList()); + } + + this.setClassBeanList(newClassBeanList); + return this; + } + + /** + * 动态调用执行之后再次更新代码元素内容 + * @param plantUmlContextBean + * @param elementType + */ + public ElementBean refreshInterface(PlantUmlContextBean plantUmlContextBean,String elementType){ + List newInterfaceBeanList = new ArrayList<>(); + plantUmlContextBean.getInterfaceBeanMap().forEach((k,v)->{ + if(v.getClassName().toLowerCase().endsWith(elementType)){ + newInterfaceBeanList.add(v); + } + }); + if(plantUmlContextBean.getDerivedPlantUmlContextBean() != null){ + plantUmlContextBean.getDerivedPlantUmlContextBean().getInterfaceBeanMap().forEach((k,v)->{ + if(v.getClassName().toLowerCase().endsWith(elementType)){ + newInterfaceBeanList.add(v); + } + }); + } + this.setInterfaceBeanList(newInterfaceBeanList); + return this; + } + + } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/MqConsumerElementBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/MqConsumerElementBean.java new file mode 100644 index 0000000000000000000000000000000000000000..8abaed82bb0f96dcc5d8f0be57576a5c2e68314d --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/MqConsumerElementBean.java @@ -0,0 +1,13 @@ +package com.coderman.codemaker.bean.dddelement; + +/** + * Description: + * date: 2021/6/28 + * 监听器元素 + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class MqConsumerElementBean extends ElementBean { + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/MqHandlerElementBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/MqHandlerElementBean.java new file mode 100644 index 0000000000000000000000000000000000000000..11d18809ac3c99673db58b8b629562531dd4979a --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/MqHandlerElementBean.java @@ -0,0 +1,13 @@ +package com.coderman.codemaker.bean.dddelement; + +/** + * Description: + * date: 2021/6/28 + * 监听器元素 + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class MqHandlerElementBean extends ElementBean { + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/MqProducerElementBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/MqProducerElementBean.java new file mode 100644 index 0000000000000000000000000000000000000000..968238e69431ee369590175fc4be8b39715ff96d --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelement/MqProducerElementBean.java @@ -0,0 +1,13 @@ +package com.coderman.codemaker.bean.dddelement; + +/** + * Description: + * date: 2021/6/28 + * 监听器元素 + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class MqProducerElementBean extends ElementBean { + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelementderive/EnumElementBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelementderive/EnumElementBean.java new file mode 100644 index 0000000000000000000000000000000000000000..74e2f2f7d48774b22397120603a73dabc8ebe07f --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelementderive/EnumElementBean.java @@ -0,0 +1,16 @@ +package com.coderman.codemaker.bean.dddelementderive; + +import com.coderman.codemaker.bean.dddelement.ElementBean; + +/** + * Description: + * 派生元素,由领域实体元素valueobject.enum派生而来 + * date: 2021/6/28 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class EnumElementBean extends ElementBean { + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelementderive/GatawayImplElementBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelementderive/GatawayImplElementBean.java new file mode 100644 index 0000000000000000000000000000000000000000..5b361f37849d0c5da3e18ea68d00d5871073927b --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelementderive/GatawayImplElementBean.java @@ -0,0 +1,16 @@ +package com.coderman.codemaker.bean.dddelementderive; + +import com.coderman.codemaker.bean.dddelement.ElementBean; + +/** + * Description: + * 由gataway接口派生而来 + * date: 2021/6/28 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class GatawayImplElementBean extends ElementBean { + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelementderive/InfrastAclImplElementBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelementderive/InfrastAclImplElementBean.java new file mode 100644 index 0000000000000000000000000000000000000000..681b2b7167c6b844de08cba39d7084157d79b8ed --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelementderive/InfrastAclImplElementBean.java @@ -0,0 +1,16 @@ +package com.coderman.codemaker.bean.dddelementderive; + +import com.coderman.codemaker.bean.dddelement.ElementBean; + +/** + * Description: + * 由infrastacl接口派生而来 + * date: 2021/6/28 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class InfrastAclImplElementBean extends ElementBean { + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelementderive/RepositoryImplElementBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelementderive/RepositoryImplElementBean.java new file mode 100644 index 0000000000000000000000000000000000000000..d4b78f73775996efd6b9be8fce47af312908a21f --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/dddelementderive/RepositoryImplElementBean.java @@ -0,0 +1,16 @@ +package com.coderman.codemaker.bean.dddelementderive; + +import com.coderman.codemaker.bean.dddelement.ElementBean; + +/** + * Description: + * 由repository接口派生而来 + * date: 2021/6/28 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class RepositoryImplElementBean extends ElementBean { + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/invoke/InvokeContextBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/invoke/InvokeContextBean.java new file mode 100644 index 0000000000000000000000000000000000000000..825d227fa8fba73794f7e6bbbda21f0f9189edbe --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/invoke/InvokeContextBean.java @@ -0,0 +1,223 @@ +package com.coderman.codemaker.bean.invoke; + +import com.coderman.codemaker.bean.plantuml.AbstractClassBean; +import com.coderman.codemaker.bean.plantuml.MethodBean; +import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; +import com.coderman.codemaker.enums.dynamic.InvokeSceneTypeEnum; +import com.coderman.codemaker.enums.dynamic.ReadWriteTypeEnum; +import org.apache.commons.lang3.StringUtils; + + +/** + * Description: 调用时序上下文 + * date: 2021/10/16 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class InvokeContextBean { + /** + * 需要绘制方法内容的方法对象 + */ + private MethodBean methodBean; + + /** + * plantuml 调用流程图中的被调用类 + */ + private String providerClassName; + + /** + * plantuml 调用流程图中的被调用方法 + */ + private String providerClassMethod; + + + /** + * plantuml 调用流程图中的被调用方法返回值 + */ + private String providerClassMethodReturn; + + + /** + * plantuml 调用流程图中的调用方法 + */ + private String invokerMethod; + + + /** + * 调用方向 + * 如 应用层->领域层,应用层->基础设施层,应用层->应用层,领域层->领域层 + * + */ + private String InvokeSceneType; + + /** + * 需要绘制方法内容的方法类型 + */ + private String methodRWType; + + + /** + * 全局对象 + */ + private PlantUmlContextBean plantUmlContextBean; + + /** + * 调用类对象 + */ + private AbstractClassBean invokerClassBean; + + /** + * 当前调用方调用提供方的调用行内容 + */ + private String currentInvokeRowContent; + + + /** + * 当前调用的调用行bean + */ + private InvokeRowBean currentInvokeRowBean; + + public InvokeRowBean getCurrentInvokeRowBean() { + return currentInvokeRowBean; + } + + public void setCurrentInvokeRowBean(InvokeRowBean currentInvokeRowBean) { + this.currentInvokeRowBean = currentInvokeRowBean; + } + + public String getCurrentInvokeRowContent() { + return currentInvokeRowContent; + } + + public void setCurrentInvokeRowContent(String currentInvokeRowContent) { + this.currentInvokeRowContent = currentInvokeRowContent; + } + + public AbstractClassBean getInvokerClassBean() { + return invokerClassBean; + } + + public void setInvokerClassBean(AbstractClassBean invokerClassBean) { + this.invokerClassBean = invokerClassBean; + } + + public String getProviderClassMethodReturn() { + return providerClassMethodReturn; + } + + public void setProviderClassMethodReturn(String providerClassMethodReturn) { + this.providerClassMethodReturn = providerClassMethodReturn; + } + + public String getInvokeSceneType() { + return InvokeSceneType; + } + + public void setInvokeSceneType(String invokeSceneType) { + InvokeSceneType = invokeSceneType; + } + + public String getMethodRWType() { + return methodRWType; + } + + public void setMethodRWType(String methodRWType) { + this.methodRWType = methodRWType; + } + + public MethodBean getMethodBean() { + return methodBean; + } + + public void setMethodBean(MethodBean methodBean) { + this.methodBean = methodBean; + } + + + public String getInvokerMethod() { + return invokerMethod; + } + + public void setInvokerMethod(String invokerMethod) { + this.invokerMethod = invokerMethod; + } + + public String getProviderClassName() { + return providerClassName; + } + + public void setProviderClassName(String providerClassName) { + this.providerClassName = providerClassName; + } + + public String getProviderClassMethod() { + return providerClassMethod; + } + + public void setProviderClassMethod(String providerClassMethod) { + this.providerClassMethod = providerClassMethod; + } + + public PlantUmlContextBean getPlantUmlContextBean() { + return plantUmlContextBean; + } + + public void setPlantUmlContextBean(PlantUmlContextBean plantUmlContextBean) { + this.plantUmlContextBean = plantUmlContextBean; + } + + /** + * 根据调用者和被调用者以及当前需要绘制的方法构判断调用场景和读写类型 + * @param invokeClassName + * @param providerClassName + */ + public void buildInvokeScene(String invokeClassName,String providerClassName){ + String invokeScene = InvokeSceneTypeEnum.getInvokeScene(invokeClassName, providerClassName); + if(StringUtils.isNotEmpty(invokeScene)){ + this.setInvokeSceneType(invokeScene); + } + + if(StringUtils.isNotEmpty(this.getInvokerMethod())){ + String rwType = ReadWriteTypeEnum.getCodeByMethod(this.getInvokerMethod()); + this.setMethodRWType(rwType); + } + } + + /** + * 构建当前调用行bean + * @param currentInvokeRowContent + */ + public void buildCurrentInvokeRow(String currentInvokeRowContent){ + this.setCurrentInvokeRowContent(currentInvokeRowContent); + /** + * 如果有返回值 + */ + InvokeRowBean invokeRowBean = new InvokeRowBean(); + String invokeBody = currentInvokeRowContent; + if(currentInvokeRowContent.contains("=")){ + String [] rowContentArr = currentInvokeRowContent.split("="); + String returnBody = rowContentArr[0]; + invokeBody = rowContentArr[1]; + invokeRowBean.setReturnClassName(returnBody.trim().split(" ")[0]); + invokeRowBean.setReturnClassValue(returnBody.trim().split(" ")[1]); + } + String [] providerArr = invokeBody.split("\\."); + invokeRowBean.setProviderClassName(providerArr[0]); + String methodContent = providerArr[1]; + if(methodContent.contains("()")){ + invokeRowBean.setProviderMethodName(methodContent); + this.setCurrentInvokeRowBean(invokeRowBean); + return; + }else { + String [] methodArr = methodContent.split("\\("); + invokeRowBean.setProviderMethodName(methodArr[0]); + String [] paramValueArr = methodArr[1].replace(")","").split(","); + invokeRowBean.setProviderMethodParamValueArr(paramValueArr); + this.setCurrentInvokeRowBean(invokeRowBean); + return; + } + } + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/invoke/InvokeRowBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/invoke/InvokeRowBean.java new file mode 100644 index 0000000000000000000000000000000000000000..aaf2aaf50eabeec409475a361700ce4b0f7a1d4c --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/invoke/InvokeRowBean.java @@ -0,0 +1,108 @@ +package com.coderman.codemaker.bean.invoke; + +import java.util.Objects; + +/** + * Description:动态绘制的调用代码行 + * date: 2021/10/21 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class InvokeRowBean { + /** + * 被调用方的类名 + */ + private String providerClassName; + /** + * 被调用方的方法名 + */ + private String providerMethodName; + + /** + * 被调用方的方法参数value值 + * 如:null,xxxBo + */ + private String [] providerMethodParamValueArr; + + /** + * 被调用方的方法参数类型 + * 如:XXXBO xxxBo + */ + private String [] providerMethodParamTypeArr; + + /** + * 被调用方的方法返回值类型 + */ + private String returnClassName; + + /** + * 被调用方的方法返回值 + */ + private String returnClassValue; + + public String getProviderClassName() { + return providerClassName; + } + + public void setProviderClassName(String providerClassName) { + this.providerClassName = providerClassName; + } + + public String getProviderMethodName() { + return providerMethodName; + } + + public void setProviderMethodName(String providerMethodName) { + this.providerMethodName = providerMethodName; + } + + public String[] getProviderMethodParamValueArr() { + return providerMethodParamValueArr; + } + + public void setProviderMethodParamValueArr(String[] providerMethodParamValueArr) { + this.providerMethodParamValueArr = providerMethodParamValueArr; + } + + public String[] getProviderMethodParamTypeArr() { + return providerMethodParamTypeArr; + } + + public void setProviderMethodParamTypeArr(String[] providerMethodParamTypeArr) { + this.providerMethodParamTypeArr = providerMethodParamTypeArr; + } + + public String getReturnClassName() { + return returnClassName; + } + + public void setReturnClassName(String returnClassName) { + this.returnClassName = returnClassName; + } + + public String getReturnClassValue() { + return returnClassValue; + } + + public void setReturnClassValue(String returnClassValue) { + this.returnClassValue = returnClassValue; + } + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + InvokeRowBean that = (InvokeRowBean) o; + return Objects.equals(providerClassName, that.providerClassName) && + Objects.equals(providerMethodName, that.providerMethodName) && + Objects.equals(returnClassName, that.returnClassName); + } + + @Override + public int hashCode() { + return Objects.hash(providerClassName, providerMethodName, returnClassName); + } +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/AbstractClassBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/AbstractClassBean.java index 1c662af5ec12a88a92e6f1048635b754cf594047..3f8311a31c70a2280155d3bb82fe1196fcbfbd39 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/AbstractClassBean.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/AbstractClassBean.java @@ -1,6 +1,17 @@ package com.coderman.codemaker.bean.plantuml; +import com.coderman.codemaker.enums.DomainElementEnum; +import com.coderman.codemaker.utils.StringHelperUtils; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; /** * Description: @@ -72,6 +83,81 @@ public abstract class AbstractClassBean { */ private boolean isDerived; + + private String bodtoConvertInterface; + + private String bodoConvertInterface; + + private String bovoConvertInterface; + + /** + * 在动态调用中产生的引用包 + */ + private List dynamicImportPackageList; + + + /** + * 派生类链路 + * 如bo派生dto + * dto的派生链路里就有boclass + * 用来记录派生过程中的关联关系 + */ + private List derivedChainClassList; + + /** + * bo上的扩展属性对象 + */ + private ExtendFieldBean extendFieldBean = new ExtendFieldBean(); + + + public ExtendFieldBean getExtendFieldBean() { + return extendFieldBean; + } + + public void setExtendFieldBean(ExtendFieldBean extendFieldBean) { + this.extendFieldBean = extendFieldBean; + } + + public List getDerivedChainClassList() { + return derivedChainClassList; + } + + public void setDerivedChainClassList(List derivedChainClassList) { + this.derivedChainClassList = derivedChainClassList; + } + + public List getDynamicImportPackageList() { + return dynamicImportPackageList; + } + + public void setDynamicImportPackageList(List dynamicImportPackageList) { + this.dynamicImportPackageList = dynamicImportPackageList; + } + + public String getBodtoConvertInterface() { + return bodtoConvertInterface; + } + + public void setBodtoConvertInterface(String bodtoConvertInterface) { + this.bodtoConvertInterface = bodtoConvertInterface; + } + + public String getBodoConvertInterface() { + return bodoConvertInterface; + } + + public void setBodoConvertInterface(String bodoConvertInterface) { + this.bodoConvertInterface = bodoConvertInterface; + } + + public String getBovoConvertInterface() { + return bovoConvertInterface; + } + + public void setBovoConvertInterface(String bovoConvertInterface) { + this.bovoConvertInterface = bovoConvertInterface; + } + public boolean isDerived() { return isDerived; } @@ -170,4 +256,112 @@ public abstract class AbstractClassBean { public void setClassDesc(String classDesc) { this.classDesc = classDesc; } + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AbstractClassBean that = (AbstractClassBean) o; + return Objects.equals(className, that.className) && + Objects.equals(packageName, that.packageName); + } + + @Override + public int hashCode() { + return Objects.hash(className, packageName); + } + + + public void buildPlantUMLPackage(String plantUMLPackage){ + if(plantUMLPackage.contains("\"")){ + String content = plantUMLPackage.split("\"")[1]; + if(content.contains("-")){ + String [] arr = content.split("-"); + if(arr[1].contains(".")){ + this.setPlantUMLPackage(arr[1].trim()); + return; + } + if(arr[0].contains(".")){ + this.setPlantUMLPackage(arr[0].trim()); + return; + } + + } + } + + this.setPlantUMLPackage(plantUMLPackage.trim().trim()); + } + + + /** + * 如果是bo类的情况下可以通过bo类找到对应的DO类名 + * @return + */ + public String getDOClassFromTableKey(){ + String tableKey = this.getExtendFieldBean().getTableKey(); + if(StringUtils.isEmpty(tableKey)){ + return null; + } + return StringHelperUtils.getClassDOName(tableKey); + } + + /** + * 合并引用包, + * 接口的引用包与实现的引用包合并 + * @param importClassList + */ + public void mergeImportClass(List importClassList){ + if(CollectionUtils.isEmpty(importClassList)){ + return; + } + if(CollectionUtils.isEmpty(this.getImportClassList())){ + this.setImportClassList(importClassList); + }else { + Set newHashSet = Sets.newHashSet(importClassList); + for (String importClassName : this.getImportClassList()){ + newHashSet.remove(importClassName); + } + this.getImportClassList().addAll(Lists.newArrayList(newHashSet)); + } + } + /** + * 构建简化版的field,去除扩展字段属性内容,对dto,vo屏蔽bo属性之间的关联关系,但是bo本身保留 + * @return + */ + public List buildSimpleFieldList(){ + + List fieldBeanList = new ArrayList<>(); + if(CollectionUtils.isEmpty(this.getFieldBeanList())){ + return fieldBeanList; + } + for (FieldBean oldBean : this.getFieldBeanList()){ + fieldBeanList.add(oldBean.copySelf()); + } + + //dto没有bo那么多的丰富信息,需要去掉 + List newFieldBeanList = fieldBeanList.stream().filter(fieldBean -> + !fieldBean.getFieldName().trim().toLowerCase().endsWith(DomainElementEnum.BO.getElement()) + && !fieldBean.isTableKey() + && !fieldBean.isDtoKey() + && !fieldBean.isInvokeFileKey() + && !fieldBean.getFieldName().trim().toLowerCase().contains(DomainElementEnum.BO.getElement()+">")) + .collect(Collectors.toList()); + + List fieldBeanFilterList = fieldBeanList.stream().filter(fieldBean -> + fieldBean.getFieldName().trim().toLowerCase().endsWith(DomainElementEnum.BO.getElement()) + && !fieldBean.isTableKey() + && !fieldBean.isDtoKey() + && !fieldBean.isInvokeFileKey() + || fieldBean.getFieldName().trim().toLowerCase().contains(DomainElementEnum.BO.getElement()+">")) + .collect(Collectors.toList()); + + fieldBeanFilterList.forEach(fieldBean -> { + fieldBean.setVisibility("/** "+fieldBean.getVisibility()); + fieldBean.setFieldName(fieldBean.getFieldName()+" **/"); + }); + + newFieldBeanList.addAll(fieldBeanFilterList); + return newFieldBeanList; + } } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/ClassBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/ClassBean.java index ac95395eac9cf2d72cf802ad7593e29a847ade34..36484d1c50504bb2ff251692857d3b1bfe4c01ca 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/ClassBean.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/ClassBean.java @@ -1,5 +1,8 @@ package com.coderman.codemaker.bean.plantuml; +import java.util.HashMap; +import java.util.Map; + /** * Description: * class 类信息 @@ -11,4 +14,12 @@ package com.coderman.codemaker.bean.plantuml; */ public class ClassBean extends AbstractClassBean { + public Map buildVarMap(){ + Map varMap = new HashMap<>(); + varMap.put("class",this); + varMap.put("fields",this.getFieldBeanList()); + varMap.put("methods",this.getMethodBeanList()); + varMap.put("imports",this.getImportClassList()); + return varMap; + } } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/EnumBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/EnumBean.java index 6a477e22523edbcd01e74614a4c25526b544bf90..34d6a7796b6d1decf45f830013a328ef390da62f 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/EnumBean.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/EnumBean.java @@ -1,6 +1,8 @@ package com.coderman.codemaker.bean.plantuml; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Description: 枚举类 @@ -51,4 +53,30 @@ public class EnumBean extends AbstractClassBean { this.enumValueList = enumValueList; } + + public Map buildVarMap(){ + Map varMap = new HashMap<>(); + varMap.put("class",this); + varMap.put("fields",this.getFieldBeanList()); + varMap.put("methods",this.getMethodBeanList()); + varMap.put("enums",this.getEnumValueList()); + varMap.put("methods",this.getMethodBeanList()); + varMap.put("bodys",this.getConstructMethodBodyList()); + return varMap; + } + public EnumBean copySelf(){ + EnumBean enumBean = new EnumBean(); + enumBean.setFieldBeanList(this.getFieldBeanList()); + enumBean.setPlantUMLPackage(this.getPlantUMLPackage()); + enumBean.setAuthor(this.getAuthor()); + enumBean.setEnumValueList(this.getEnumValueList()); + enumBean.setConstructMethodBodyList(this.getConstructMethodBodyList()); + enumBean.setClassDesc(this.getClassDesc()); + enumBean.setClassName(this.getClassName()); + enumBean.setMethodBeanList(this.getMethodBeanList()); + enumBean.setImportClassList(this.getImportClassList()); + enumBean.setConstructParamStr(this.getConstructParamStr()); + enumBean.setPackageName(this.getPackageName()); + return enumBean; + } } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/ExtendFieldBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/ExtendFieldBean.java new file mode 100644 index 0000000000000000000000000000000000000000..714824384a45a96571433e23079c07d668d45584 --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/ExtendFieldBean.java @@ -0,0 +1,109 @@ +package com.coderman.codemaker.bean.plantuml; + +/** + * Description:从plantUMl中解析出的扩展属性上下文 + * date: 2021/10/21 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class ExtendFieldBean { + /** + * 需要解析的调用时序图文件列表 + */ + private String[] invokeFileKey; + /** + * bo对应的表名称 + */ + private String tableKey; + /** + * bo对应的facade接口名称列表 + */ + private String[] facadeKey; + /** + * bo对应的controller接口名称列表 + */ + private String[] controllerKey; + /** + * bo对应的dto对象列表 + */ + private String[] dtoKeyList; + + /** + * bo对应的vo对象列表 + */ + private String[] voKeyList; + + public String[] getInvokeFileKey() { + return invokeFileKey; + } + + public void setInvokeFileKey(String[] invokeFileKey) { + this.invokeFileKey = invokeFileKey; + } + + public String getTableKey() { + return tableKey; + } + + public void setTableKey(String tableKey) { + this.tableKey = tableKey; + } + + public String[] getFacadeKey() { + return facadeKey; + } + + public void setFacadeKey(String[] facadeKey) { + this.facadeKey = facadeKey; + } + + public String[] getControllerKey() { + return controllerKey; + } + + public void setControllerKey(String[] controllerKey) { + this.controllerKey = controllerKey; + } + + public String[] getDtoKeyList() { + return dtoKeyList; + } + + public void setDtoKeyList(String[] dtoKeyList) { + this.dtoKeyList = dtoKeyList; + } + + public String[] getVoKeyList() { + return voKeyList; + } + + public void setVoKeyList(String[] voKeyList) { + this.voKeyList = voKeyList; + } + + public void buildTableKey(String tableKey){ + this.setTableKey(tableKey.replace("String","").replace("string","").trim()); + } + + public void buildDtoKeyArr(String dtoKey){ + this.setDtoKeyList(dtoKey.replace("String","").replace("string","").trim().split(",")); + } + + public void buildFacadeKeyArr(String facadeKey){ + this.setFacadeKey(facadeKey.replace("String","").replace("string","").trim().split(",")); + } + + public void buildVoKeyArr(String voKeyList){ + this.setVoKeyList(voKeyList.replace("String","").replace("string","").trim().split(",")); + } + + public void buildControllerKeyArr(String controllerKeyList){ + this.setControllerKey(controllerKeyList.replace("String","").replace("string","").trim().split(",")); + } + + public void buildInvokeFileKeyArr(String invokeFileKey){ + this.setInvokeFileKey(invokeFileKey.replace("String","").replace("string","").trim().split(",")); + } +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/FieldBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/FieldBean.java index 23540f565559f39f3d672b1e511225aadda78f23..9a98772d0ad1f521121407f68246c6fd98c1d477 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/FieldBean.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/FieldBean.java @@ -1,6 +1,7 @@ package com.coderman.codemaker.bean.plantuml; import com.coderman.codemaker.bean.GlobalConstant; +import com.coderman.codemaker.enums.VisibilityEnum; /** * Description: @@ -75,5 +76,37 @@ public class FieldBean { || this.fieldName.toLowerCase().contains(GlobalConstant.CONTROLLER_KEY); } + public boolean isCopyToRpcClientKey(){ + return this.desc.toLowerCase().contains(GlobalConstant.COPY2RPC_CLIENT_KEY) + || this.fieldName.toLowerCase().contains(GlobalConstant.COPY2RPC_CLIENT_KEY); + } + + public boolean isInvokeFileKey(){ + return this.desc.toLowerCase().contains(GlobalConstant.INVOKE_FILE_KEY) + || this.fieldName.toLowerCase().contains(GlobalConstant.INVOKE_FILE_KEY); + } + /** + * 构建属性注释 + * @param desc + */ + public void buildDesc(String desc){ + if(desc.startsWith(VisibilityEnum.PUBLIC.getTag()) + || desc.startsWith(VisibilityEnum.PRIVATE.getTag()) + || desc.startsWith(VisibilityEnum.PROTECT.getTag())){ + String newDesc = desc.substring(1,desc.length()-1); + this.setDesc(newDesc); + }else { + this.setDesc(desc); + } + } + + + public FieldBean copySelf(){ + FieldBean fieldBean = new FieldBean(); + fieldBean.setFieldName(this.getFieldName()); + fieldBean.setVisibility(this.getVisibility()); + fieldBean.setDesc(this.getDesc()); + return fieldBean; + } } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/InterfaceBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/InterfaceBean.java index 75bdbe3e197ab7d9abe33a74d22330c369ed890b..d8f50e18a8047706f19460f61ffffe014010f1bd 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/InterfaceBean.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/InterfaceBean.java @@ -1,5 +1,9 @@ package com.coderman.codemaker.bean.plantuml; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + /** * Description: * @@ -11,5 +15,13 @@ package com.coderman.codemaker.bean.plantuml; * @since JDK 1.8 */ public class InterfaceBean extends AbstractClassBean{ + public Map buildVarMap(){ + Map varMap = new HashMap<>(); + varMap.put("class",this); + varMap.put("fields",this.getFieldBeanList()); + varMap.put("methods",this.getMethodBeanList()); + varMap.put("imports",this.getImportClassList()); + return varMap; + } } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/MethodBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/MethodBean.java index e826286e8407c07943a4e917752cd7d4efc98438..07163ffbe1fe8c9b929141ba458289c45e090169 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/MethodBean.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/MethodBean.java @@ -1,5 +1,15 @@ package com.coderman.codemaker.bean.plantuml; +import com.coderman.codemaker.bean.invoke.InvokeRowBean; +import com.coderman.codemaker.enums.VisibilityEnum; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; + /** * Description: * date: 2021/6/28 @@ -10,6 +20,12 @@ package com.coderman.codemaker.bean.plantuml; */ public class MethodBean { + public MethodBean(){} + public MethodBean(String methodName,String returnClass){ + this.methodName = methodName; + this.returnClass = returnClass; + } + /** * 方法名称, * 包括参数,括号 @@ -40,6 +56,12 @@ public class MethodBean { */ private String returnClassPackage; + + /** + * 方法内容 + */ + private String methodContent; + /** * 方法返回体 */ @@ -50,6 +72,75 @@ public class MethodBean { */ private String pathValue; + + /** + * 方法调用内容,根据调用流程图-plantUML解析而来 + */ + private LinkedList invokeMethodList; + + /** + * 方法调用内容,根据调用流程图-plantUML解析而来 + * 与invokeMethodList保持一致 + * 帮助去除重复和进行上下文调用分析辅助动态绘制 + */ + private List invokeRowBeanList; + + + /** + * 方法文档 + */ + private String doc; + + /** + * 解析出来的方法参数列表 + */ + private String [] paramArr; + + /** + * 所属类名 + */ + private String className; + + public List getInvokeRowBeanList() { + return invokeRowBeanList; + } + + public void setInvokeRowBeanList(List invokeRowBeanList) { + this.invokeRowBeanList = invokeRowBeanList; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public String[] getParamArr() { + return paramArr; + } + + public void setParamArr(String[] paramArr) { + this.paramArr = paramArr; + } + + public String getMethodContent() { + return methodContent; + } + + public void setMethodContent(String methodContent) { + this.methodContent = methodContent; + } + + public LinkedList getInvokeMethodList() { + return invokeMethodList; + } + + public void setInvokeMethodList(LinkedList invokeMethodList) { + this.invokeMethodList = invokeMethodList; + } + public String getPathValue() { return pathValue; } @@ -114,4 +205,178 @@ public class MethodBean { public void setReturnBody(String returnBody) { this.returnBody = returnBody; } + + + public String getDoc() { + return doc; + } + + public void setDoc(String doc) { + this.doc = doc; + } + + /** + * 动态构建方法内容 + */ + public void buildMethodContent(){ + if(CollectionUtils.isEmpty(invokeMethodList)){ + return; + } + + StringBuilder contentBuilder = new StringBuilder(); + for (String str : invokeMethodList){ + contentBuilder.append(" "+str+";\n"); + } + if(StringUtils.isEmpty(this.getMethodContent())){ + this.setMethodContent( contentBuilder.toString()); + }else { + this.setMethodContent(this.getMethodContent() + contentBuilder.toString()); + } + } + + /** + * 优化方法接口注释 + * @param desc + */ + public void buildDesc(String desc){ + if(desc.startsWith(VisibilityEnum.PUBLIC.getTag()) + || desc.startsWith(VisibilityEnum.PRIVATE.getTag()) + || desc.startsWith(VisibilityEnum.PROTECT.getTag())){ + String newDesc = desc.substring(1,desc.length()-1); + this.setDesc(newDesc); + }else { + this.setDesc(desc); + } + } + + + + /** + * 构建方法接口注释 + */ + public void buildDoc(){ + StringBuilder builder = new StringBuilder("\t/**\n" + + "\t *\n"); + builder.append("\t * @Description "+this.getDesc()+"\n"); + + if (!this.getMethodName().contains("()")){ + String [] paramArr = this.getMethodName().replace(")","").split("\\(")[1].split(","); + for (String param : paramArr){ + builder.append("\t * @param "+param.trim().split(" ")[1]+"\n"); + } + } + builder.append("\t * @return "+this.getReturnClass()+"\n"); + builder.append("\t */"); + this.setDoc(builder.toString()); + } + + + /** + * 从方法名称中解析到方法参数 + */ + public void buildParamArr(){ + if (!this.getMethodName().contains("()")){ + String [] paramArr = this.getMethodName().replace(")","").split("\\(")[1].split(","); + + if(paramArr != null && paramArr.length>=1){ + this.setParamArr(paramArr); + } + } + } + + /** + * 构建返回类型 + * @return + */ + public String buildReturnClassType(){ + if(this.getReturnClass().toLowerCase().equals("void")){ + return null; + } + return this.getReturnClass() + .replace("ResultDataDto","") + .replace("ResultDto","") + .replace("<","") + .replace(">","") + .replace("Map","") + .replace("Set","") + .replace(",","") + .replace("List","").trim(); + } + + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MethodBean that = (MethodBean) o; + return Objects.equals(methodName, that.methodName) && + Objects.equals(returnClass, that.returnClass) && + Objects.equals(className, that.className); + } + + @Override + public int hashCode() { + return Objects.hash(methodName, returnClass, className); + } + + /** + * 防止由于引用问题导致的MethodBean对象修改影响其他类下的method方法内容 + * @param methodContent + * @return + */ + public MethodBean copySelf(String methodContent){ + MethodBean newBean = new MethodBean(); + newBean.setClassName(this.getClassName()); + newBean.setDoc(this.getDoc()); + newBean.setMethodContent(methodContent); + newBean.setDesc(this.getDesc()); + newBean.setReturnClass(this.getReturnClass()); + newBean.setReturnBody(this.getReturnBody()); + newBean.setVisibility(this.getVisibility()); + newBean.setParamArr(this.getParamArr()); + newBean.setStatic(this.isStatic()); + newBean.setPathValue(this.getPathValue()); + newBean.setMethodName(this.getMethodName()); + return newBean; + } + + + /** + * 将方法中的参数信息去掉,仅仅获取方法名 + * @return + */ + public String getSimplMethodName(){ + if(this.getMethodName().contains("()")){ + return this.getMethodName().replace("()",""); + } + else { + return this.getMethodName().split("\\(")[0]; + } + } + + /** + * 构建方法的调用内容 + * @param currentRowContent + * @param currentRowBean + */ + public void addInvokeRowContent(String currentRowContent,InvokeRowBean currentRowBean){ + + for (InvokeRowBean oldRowBean : this.getInvokeRowBeanList()){ + if(oldRowBean.equals(currentRowBean)){ + return; + } + } + this.getInvokeMethodList().add(currentRowContent); + this.getInvokeRowBeanList().add(currentRowBean); + } + + /** + * 初始化 + */ + public void initInvokeRowContentList(){ + this.setInvokeMethodList(new LinkedList<>()); + this.setInvokeRowBeanList(new ArrayList<>()); + } + } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/PlantUmlContextBean.java b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/PlantUmlContextBean.java index 92e490f3f34c3c02ddba1a97ee0521956f0bae45..000afb761e73574a8939d98179181549d27e621d 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/PlantUmlContextBean.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/bean/plantuml/PlantUmlContextBean.java @@ -1,7 +1,9 @@ package com.coderman.codemaker.bean.plantuml; -import java.util.HashMap; -import java.util.Map; +import com.coderman.codemaker.bean.invoke.InvokeContextBean; +import com.google.common.collect.Sets; + +import java.util.*; /** * Description: @@ -27,6 +29,22 @@ public class PlantUmlContextBean { */ private PlantUmlContextBean derivedPlantUmlContextBean; + /** + * 动态调用时序图文件 + */ + private List dynamicInvokeFileList = new ArrayList<>(); + + /** + * 记录解析调用时序中调用方的类和方法名 + * key:调用方的类名.方法名 + * value:被调用方的类名.方法名 + */ + private Map> dynamicInvokeChainMap = new HashMap<>(); + + public Map> getDynamicInvokeChainMap() { + return dynamicInvokeChainMap; + } + public PlantUmlContextBean getDerivedPlantUmlContextBean() { return derivedPlantUmlContextBean; } @@ -52,6 +70,7 @@ public class PlantUmlContextBean { } public void addInterfaceBean(InterfaceBean interfaceBean){ + this.interfaceBeanMap.put(interfaceBean.getClassName(),interfaceBean); } @@ -66,4 +85,50 @@ public class PlantUmlContextBean { public void addPacakge(PackageBean packageBean){ this.packageBeanMap.put(packageBean.getPackageName(),packageBean); } + + public List getDynamicInvokeFileList() { + return dynamicInvokeFileList; + } + + /** + * 解析多个调用时序图文件名称 + * @param plantUMLFileName + */ + public void addDynamicInvokeFile(String plantUMLFileName){ + if(plantUMLFileName.contains(",")){ + String [] arr = plantUMLFileName.split(","); + for (String fileName : arr){ + dynamicInvokeFileList.add(fileName.trim()); + } + return; + } + dynamicInvokeFileList.add(plantUMLFileName); + } + + /** + * 记录调用时序图中的调用方信息 + * @param invokeContextBean + * @return 是否保存成功 + */ + public boolean addInvokeMethod(InvokeContextBean invokeContextBean){ + + String key = invokeContextBean.getInvokerClassBean().getClassName()+"."+invokeContextBean.getMethodBean().getMethodName(); + + Set providerMethodSet = this.dynamicInvokeChainMap.get(key); + if(providerMethodSet == null){ + providerMethodSet = Sets.newHashSet(); + } + String value = invokeContextBean.getProviderClassName()+invokeContextBean.getProviderClassMethod(); + + if(providerMethodSet.contains(value)){ + return false; + } + providerMethodSet.add(value); + + this.getDynamicInvokeChainMap().put(key,providerMethodSet); + + return true; + } + + } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/config/AppServiceConfig.java b/codemaker-core/src/main/java/com/coderman/codemaker/config/AppServiceConfig.java index 41d465c53bf12a56ea3a495c21961b3e599d556b..82745f225f72aa126b06e92fa819bbe157436348 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/config/AppServiceConfig.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/config/AppServiceConfig.java @@ -94,7 +94,7 @@ public class AppServiceConfig { String moduleName = getModuleName(templateName); return appService.getModelAppService(moduleName); } catch (Exception e) { - logger.error("get WriteFileService impl error."); + logger.error("get WriteFileService impl error.templateName={}",templateName); } return null; } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/controller/GeneratorController.java b/codemaker-core/src/main/java/com/coderman/codemaker/controller/GeneratorController.java index 607803f929dd0bfc17fa1477ad257bdeb7fc10b3..659901de748c3ff3e6e8577ad2ecd01d18eaeb57 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/controller/GeneratorController.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/controller/GeneratorController.java @@ -396,7 +396,12 @@ public class GeneratorController { List repositoryBeanList = (List)map.get("repository"); gatawayBeanList.addAll(repositoryBeanList); writeFileService.writeDomainGataway(gatawayBeanList); - writeFileService.writeGatawayImpl(gatawayBeanList); + + List gatawayImplBeanList = (List)map.get("gatawayimpl"); + writeFileService.writeGatawayImpl(gatawayImplBeanList); + + List repositoryImplBeanList = (List)map.get("repositoryimpl"); + writeFileService.writeRepositoryImpl(repositoryImplBeanList); }else { //gataway需要依赖plantUML类图标示,否则基于数据库表生成会显得不伦不类 log.warn("gataway class generation depends on plantuml..........!!!!!!!"); @@ -414,8 +419,11 @@ public class GeneratorController { Map map = entityVarRegistry.getTemplateVar(); if(map.containsKey("dynamicddd")){ List aclBeanList = (List)map.get("infrastacl"); + List aclImplBeanList = (List)map.get("infrastaclimpl"); + List aclParamBeanList = (List)map.get("infrastaclparam"); - writeFileService.writeAclInterfaceAndImpl(aclBeanList); + writeFileService.writeAclInterface(aclBeanList); + writeFileService.writeAclInterfaceImpl(aclImplBeanList); writeFileService.writeAclInterfaceParam(aclParamBeanList); }else { //gataway需要依赖plantUML类图标示,否则基于数据库表生成会显得不伦不类 diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/enums/DomainDerivedElementEnum.java b/codemaker-core/src/main/java/com/coderman/codemaker/enums/DomainDerivedElementEnum.java index cf909ee9a87a809d6a109e99cbdeda2fa43d42d1..02beeead182a99d9467d106268658f5bc7528ea8 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/enums/DomainDerivedElementEnum.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/enums/DomainDerivedElementEnum.java @@ -11,6 +11,7 @@ package com.coderman.codemaker.enums; public enum DomainDerivedElementEnum { DTO("dto","数据传输对象"), FACADE("facade","api门面接口"), + ENUM("enum","api 枚举包"), FACADE_IMPL("facadeimpl","api门面接口实现"), DTOBO_CONVERT("convert","dto-bo相互转换mapstruct接口"), DOBO_CONVERT("converter","do-bo相互转换mapstruct接口"), diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/enums/DomainElementEnum.java b/codemaker-core/src/main/java/com/coderman/codemaker/enums/DomainElementEnum.java index b08c3b5f4cd9757eba15d08778d359295742a6eb..2a8842c494d7b334e9ee2a00c5ba19a80a828267 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/enums/DomainElementEnum.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/enums/DomainElementEnum.java @@ -24,7 +24,16 @@ public enum DomainElementEnum { ADAPTER_SERVICE("adapterservice","适配器防腐层"), COMMAND("command,cmd","命令"), EXECUTOR("executor,exe,exeservice,exehandler","执行器"), + APP_LISTENER("mqlistener","监听器"), + MQ_CONSUMER("mqconsumer","消息消费者"), + MQ_PRODUCER("mqproducer","消息生产者"), + MQ_HANDLER("mqhandler","消息处理器"), + GATAWAY_IMPL("gatawayimpl","领域网关服务实现"), + REPOSITORY_IMPL("repositoryimpl","领域仓库实现"), + ACL_IMPL("aclimpl","适配器防腐层实现"), + ADAPTER_IMPL("aclimpl","适配器防腐层实现"), + ADAPTER_ACL_IMPL("adapterimpl,aclimpl","适配器防腐层实现"), ; private String element; diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/enums/ModuleEnum.java b/codemaker-core/src/main/java/com/coderman/codemaker/enums/ModuleEnum.java index 5a93182914de34dcc560fdc4ba418dc93fef5fee..0a4f8ddc45814d08d4c4636c9af5d5aac02e82f5 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/enums/ModuleEnum.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/enums/ModuleEnum.java @@ -53,9 +53,15 @@ public enum ModuleEnum { TemplateFileEnum.VOBO_CONVERT.getTempFileName(), TemplateFileEnum.FACTORY.getTempFileName(), TemplateFileEnum.MESSAGE_BODY.getTempFileName(), + TemplateFileEnum.EVENT_BODY.getTempFileName(), TemplateFileEnum.CONVERT.getTempFileName(), TemplateFileEnum.DOBO_CONVERT.getTempFileName(), + TemplateFileEnum.MQ_CONSUMER.getTempFileName(), + TemplateFileEnum.MQ_PRODUCER.getTempFileName(), + TemplateFileEnum.MQ_LISTENER.getTempFileName(), + TemplateFileEnum.MQ_HANDLER.getTempFileName(), + TemplateFileEnum.SPRING_APPLICATION_CONTEXT.getTempFileName())), /** * @@ -64,7 +70,8 @@ public enum ModuleEnum { TemplateFileEnum.FACADE.getTempFileName(), TemplateFileEnum.FACADE_DDD.getTempFileName(), TemplateFileEnum.DTO_DDD.getTempFileName(), - TemplateFileEnum.DTO.getTempFileName() + TemplateFileEnum.DTO.getTempFileName(), + TemplateFileEnum.API_ENUM.getTempFileName() )), /** * @@ -107,8 +114,13 @@ public enum ModuleEnum { TemplateFileEnum.DTOBO_CONVERT.getTempFileName(), TemplateFileEnum.DOBO_CONVERT.getTempFileName(), TemplateFileEnum.MESSAGE_BODY.getTempFileName(), - TemplateFileEnum.ACL_PARAM.getTempFileName() + TemplateFileEnum.EVENT_BODY.getTempFileName(), + TemplateFileEnum.ACL_PARAM.getTempFileName(), + TemplateFileEnum.MQ_CONSUMER.getTempFileName(), + TemplateFileEnum.MQ_PRODUCER.getTempFileName(), + TemplateFileEnum.MQ_LISTENER.getTempFileName(), + TemplateFileEnum.MQ_HANDLER.getTempFileName() )), @@ -122,7 +134,6 @@ public enum ModuleEnum { TemplateFileEnum.VO.getTempFileName(), TemplateFileEnum.CONTROLLER_DDD.getTempFileName(), TemplateFileEnum.VOBO_CONVERT.getTempFileName(), - TemplateFileEnum.VO_DDD.getTempFileName() )), @@ -140,6 +151,7 @@ public enum ModuleEnum { TemplateFileEnum.REPOSITORY.getTempFileName(), TemplateFileEnum.VALUE_OBJECT.getTempFileName(), TemplateFileEnum.MESSAGE_BODY.getTempFileName(), + TemplateFileEnum.EVENT_BODY.getTempFileName(), TemplateFileEnum.ENUM.getTempFileName() )), @@ -150,7 +162,8 @@ public enum ModuleEnum { TemplateFileEnum.DTO.getTempFileName(), TemplateFileEnum.DTO_DDD.getTempFileName(), TemplateFileEnum.FACADE.getTempFileName(), - TemplateFileEnum.FACADE_DDD.getTempFileName() + TemplateFileEnum.FACADE_DDD.getTempFileName(), + TemplateFileEnum.API_ENUM.getTempFileName() )), /** @@ -166,7 +179,11 @@ public enum ModuleEnum { TemplateFileEnum.SERVICE_IMPL.getTempFileName(), TemplateFileEnum.ACL.getTempFileName(), TemplateFileEnum.ACL_IMPL.getTempFileName(), - TemplateFileEnum.ACL_PARAM.getTempFileName() + TemplateFileEnum.ACL_PARAM.getTempFileName(), + + TemplateFileEnum.MQ_CONSUMER.getTempFileName(), + TemplateFileEnum.MQ_PRODUCER.getTempFileName(), + TemplateFileEnum.MQ_HANDLER.getTempFileName() )), /** @@ -184,8 +201,10 @@ public enum ModuleEnum { TemplateFileEnum.EXE_IMPL.getTempFileName(), TemplateFileEnum.SPRING_APPLICATION_CONTEXT.getTempFileName(), TemplateFileEnum.DTOBO_CONVERT.getTempFileName(), - TemplateFileEnum.FACADE_AOP.getTempFileName() - )), + TemplateFileEnum.FACADE_AOP.getTempFileName(), + TemplateFileEnum.MQ_LISTENER.getTempFileName() + + )), ; private String appName; private String moduleName; diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/enums/TemplateFileEnum.java b/codemaker-core/src/main/java/com/coderman/codemaker/enums/TemplateFileEnum.java index d25bf3548bcf1d5e21bd22316b6ad6c207b4f1b4..f73b378e66aa8bfcaa3394ce24a549e56f8ba5ad 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/enums/TemplateFileEnum.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/enums/TemplateFileEnum.java @@ -34,7 +34,9 @@ public enum TemplateFileEnum { REPOSITORY_IMPL("repositoryimpl"), FACTORY("factory"), ENUM("enum"), + API_ENUM("apienum"), MESSAGE_BODY("msgbody"), + EVENT_BODY("event"), GATAWAY_IMPL("gatawayimpl"), ACL("acl"), ACL_IMPL("aclimpl"), @@ -53,6 +55,10 @@ public enum TemplateFileEnum { VO_DDD("voddd"), VOBO_CONVERT("voboconvert"), DTO_DDD("dtoddd"), + MQ_CONSUMER("mqconsumer"), + MQ_HANDLER("mqhandler"), + MQ_LISTENER("mqlistener"), + MQ_PRODUCER("mqproducer"), ; private String tempFileName; TemplateFileEnum(String tempFileName){ diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/enums/dynamic/InvokeLayerTypeEnum.java b/codemaker-core/src/main/java/com/coderman/codemaker/enums/dynamic/InvokeLayerTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..6b89d8bbd72250ab18b8971a9b3bda3ce5a503d8 --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/enums/dynamic/InvokeLayerTypeEnum.java @@ -0,0 +1,71 @@ +package com.coderman.codemaker.enums.dynamic; + +import com.coderman.codemaker.enums.TemplateFileEnum; +import com.google.common.collect.Sets; + +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; + +/** + * Description: 调用层有哪些调用入口枚举 + * date: 2021/10/16 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public enum InvokeLayerTypeEnum { + APP_RPC("app_rpc", Sets.newHashSet(TemplateFileEnum.FACADE.getTempFileName(), + TemplateFileEnum.EXE.getTempFileName(), + TemplateFileEnum.EXE_ABSTRACT.getTempFileName(), + TemplateFileEnum.EXE_IMPL.getTempFileName(), + TemplateFileEnum.MQ_LISTENER.getTempFileName() + )), + APP_HTTP("app_http", Sets.newHashSet(TemplateFileEnum.CONTROLLER.getTempFileName())), + DOMAIN("domain", Sets.newHashSet(TemplateFileEnum.GATAWAY.getTempFileName(), + TemplateFileEnum.REPOSITORY.getTempFileName(), + TemplateFileEnum.SERVICE.getTempFileName(), + TemplateFileEnum.FACTORY.getTempFileName() + )), + INFRAST("infrast", Sets.newHashSet( TemplateFileEnum.MQ_PRODUCER.getTempFileName(), + TemplateFileEnum.MAPPER.getTempFileName(), + TemplateFileEnum.ACL.getTempFileName(), + TemplateFileEnum.MQ_PRODUCER.getTempFileName(), + TemplateFileEnum.MQ_HANDLER.getTempFileName(), + TemplateFileEnum.MQ_CONSUMER.getTempFileName() + )), + + ; + private String code; + private Set classTypeSet; + InvokeLayerTypeEnum(String code, Set classTypeSet){ + this.code = code; + this.classTypeSet = classTypeSet; + } + + + public String getCode() { + return code; + } + + public Set getClassTypeSet() { + return classTypeSet; + } + + /** + * 根据类名获取类所在层 + * @param className + * @return + */ + public static String getLayerCode(String className){ + AtomicReference layerName = new AtomicReference<>(""); + for (InvokeLayerTypeEnum layerTypeEnum : InvokeLayerTypeEnum.values()){ + layerTypeEnum.getClassTypeSet().forEach(classType->{ + if(className.toLowerCase().endsWith(classType)){ + layerName.set(layerTypeEnum.code); + } + }); + } + return layerName.get(); + } +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/enums/dynamic/InvokeSceneTypeEnum.java b/codemaker-core/src/main/java/com/coderman/codemaker/enums/dynamic/InvokeSceneTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..09484bb416959e9b1b3a143f9f560cebf7595a24 --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/enums/dynamic/InvokeSceneTypeEnum.java @@ -0,0 +1,85 @@ +package com.coderman.codemaker.enums.dynamic; + +import org.apache.commons.lang3.StringUtils; + +/** + * Description:调用场景枚举 + * date: 2021/10/16 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public enum InvokeSceneTypeEnum { + + APP_RPC_TO_DOMAIN("app_rpc2domain","应用层->领域层"), + APP_HTTP_TO_DOMAIN("app_http2domain","应用层->领域层"), + APP_RPC_TO_SELF("app_rpc2self","应用层->应用层"), + APP_HTTP_TO_SELF("app_http2self","应用层->应用层"), + APP_RPC_TO_INFRAST("app_rpc2infrast","应用层->基础设施层"), + APP_HTTP_TO_INFRAST("app_http2infrast","应用层->基础设施层"), + + DOMAIN_TO_INFRAST("domain2infrast","领域层->基础设施层"), + DOMAIN_TO_SELF("domain2self","领域层->领域层"), + + INFRAST_TO_SELF("infrast2self","基础设施层->基础设施层"), + + ; + private String code; + private String desc; + InvokeSceneTypeEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + + public String getCode() { + return code; + } + + public String getDesc() { + return desc; + } + + + /** + * 根据调用类和被调用类判断调用场景 + * @param invokeClassName + * @param providerClassName + * @return + */ + public static String getInvokeScene(String invokeClassName,String providerClassName){ + String invokerLayer = InvokeLayerTypeEnum.getLayerCode(invokeClassName); + String providerLayer = InvokeLayerTypeEnum.getLayerCode(providerClassName); + if(StringUtils.isEmpty(invokerLayer) || StringUtils.isEmpty(providerLayer)){ + return null; + } + + for (InvokeSceneTypeEnum invokeSceneTypeEnum : InvokeSceneTypeEnum.values()){ + if(invokerLayer.equals(providerLayer) && providerLayer.equals(InvokeLayerTypeEnum.APP_RPC.getCode())){ + return InvokeSceneTypeEnum.APP_RPC_TO_SELF.getCode(); + } + + if(invokerLayer.equals(providerLayer) && providerLayer.equals(InvokeLayerTypeEnum.APP_HTTP.getCode())){ + return InvokeSceneTypeEnum.APP_HTTP_TO_SELF.getCode(); + } + + if(invokerLayer.equals(providerLayer) && providerLayer.equals(InvokeLayerTypeEnum.DOMAIN.getCode())){ + return InvokeSceneTypeEnum.DOMAIN_TO_SELF.getCode(); + } + + if(invokerLayer.equals(providerLayer) && providerLayer.equals(InvokeLayerTypeEnum.INFRAST.getCode())){ + return InvokeSceneTypeEnum.INFRAST_TO_SELF.getCode(); + } + + if(invokeSceneTypeEnum.getCode().contains(invokerLayer) && invokeSceneTypeEnum.getCode().contains(providerLayer)){ + return invokeSceneTypeEnum.getCode(); + } + } + + + return null; + } + + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/enums/dynamic/ReadWriteTypeEnum.java b/codemaker-core/src/main/java/com/coderman/codemaker/enums/dynamic/ReadWriteTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..3c83396922fa5d18f26f508d37dc2a166527536f --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/enums/dynamic/ReadWriteTypeEnum.java @@ -0,0 +1,65 @@ +package com.coderman.codemaker.enums.dynamic; + +import org.apache.commons.lang3.StringUtils; +import org.mockito.internal.util.collections.Sets; + +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; + +/** + * Description:读写类型枚举 + * date: 2021/10/16 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public enum ReadWriteTypeEnum { + READ("read","读场景"), + WRITE("write","写场景") + ; + private String code; + private String desc; + private static Set readSet = Sets.newSet("search","get","find","select","load","read"); + + private static Set writeSet = Sets.newSet("write","regist","update","create","save","insert","delete","init"); + + ReadWriteTypeEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + + public String getCode() { + return code; + } + + public String getDesc() { + return desc; + } + + + /** + * 根据方法名判断方法的读写属性 + * @param methodName + * @return + */ + public static String getCodeByMethod(String methodName){ + AtomicReference code = new AtomicReference<>(""); + readSet.stream().forEach(v->{ + if(methodName.startsWith(v)){ + code.set(ReadWriteTypeEnum.READ.getCode()); + } + }); + if(StringUtils.isNotEmpty(code.get())){ + return code.get(); + } + writeSet.stream().forEach(v->{ + if(methodName.startsWith(v)){ + code.set(ReadWriteTypeEnum.WRITE.getCode()); + } + }); + return code.get(); + } + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/AbstractVarRegistry.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/AbstractVarRegistry.java index da802f34ed92095ff940f9bc70251148c6ef94ce..c00d82ebe9366ab8573ede237d9c922ef6686c70 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/service/AbstractVarRegistry.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/AbstractVarRegistry.java @@ -1,21 +1,21 @@ package com.coderman.codemaker.service; -import com.alibaba.fastjson.JSON; import com.coderman.codemaker.app.dynamicddd.DomainElementHandler; +import com.coderman.codemaker.app.dynamicddd.DynamicInvokeHandler; import com.coderman.codemaker.app.dynamicddd.derivedhandler.*; import com.coderman.codemaker.bean.TableBean; import com.coderman.codemaker.bean.dddelement.*; import com.coderman.codemaker.bean.dddelementderive.*; import com.coderman.codemaker.bean.plantuml.ClassBean; +import com.coderman.codemaker.bean.plantuml.InterfaceBean; import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; import com.coderman.codemaker.config.AppServiceConfig; -import com.coderman.codemaker.config.ProjectTemplateDubboConfig; -import com.coderman.codemaker.config.ProjectTemplateSpringbootConfig; +import com.coderman.codemaker.enums.DomainDerivedElementEnum; +import com.coderman.codemaker.enums.DomainElementEnum; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import javax.annotation.Resource; -import java.util.HashMap; import java.util.Map; /** @@ -62,6 +62,21 @@ public abstract class AbstractVarRegistry { @Resource(name = "appExeElementHandler") private DomainElementHandler appExeElementHandler; + @Resource(name = "eventElementHandler") + private DomainElementHandler eventElementHandler; + + + @Resource(name = "appListenerElementHandler") + private DomainElementHandler appListenerElementHandler; + + @Resource(name = "mqHandlerElementHandler") + private DomainElementHandler mqHandlerElementHandler; + + @Resource(name = "mqConsumerElementHandler") + private DomainElementHandler mqConsumerElementHandler; + + @Resource(name = "mqProducerElementHandler") + private DomainElementHandler mqProducerElementHandler; //------------------以下为领域元素派生类对象处理器 @@ -90,6 +105,23 @@ public abstract class AbstractVarRegistry { @Resource(name = "derivedVOBOConvertElementHandler") private DerivedVOBOConvertElementHandler derivedVOBOConvertElementHandler; + @Resource(name = "derivedEnumElementHandler") + private DerivedEnumElementHandler derivedEnumElementHandler; + + @Resource(name = "derivedRepositoryImplElementHandler") + private DerivedRepositoryImplElementHandler derivedRepositoryImplElementHandler; + + @Resource(name = "derivedGatawayImplElementHandler") + private DerivedGatawayImplElementHandler derivedGatawayImplElementHandler; + + @Resource(name = "derivedInfrastAclImplElementHandler") + private DerivedInfrastAclImplElementHandler derivedInfrastAclImplElementHandler; + + + //------------------以下为动态调用处理服务 + @Autowired + private DynamicInvokeHandler dynamicInvokeHandler; + /** * 合并全局配置 @@ -112,16 +144,20 @@ public abstract class AbstractVarRegistry { Map tableBeanMap = (Map)varMap.get("table"); + varMap.put("package",appServiceConfig.getPackage()+".infrast"); tableBeanMap.forEach((k,v)->{ - ClassBean classBean = v.convertToClassBean(appServiceConfig.getPackage()+".dao.dataobject"); + ClassBean classBean = v.convertToClassBean(appServiceConfig.getPackage()+".infrast.dao.dataobject"); + InterfaceBean mapperInterface = v.convertToMapperInterface(appServiceConfig.getPackage()+".infrast.dao.mapper"); + plantUmlContextBean.getClassBeanMap().put(classBean.getClassName(),classBean); - }); + plantUmlContextBean.getInterfaceBeanMap().put(mapperInterface.getClassName(),mapperInterface); + }); //打标 varMap.put("dynamicddd","dynamicddd"); - System.out.println(JSON.toJSONString(plantUmlContextBean)); + DomainBoElementBean domainBoElementBean = (DomainBoElementBean)domainElementHandler.getElementBeanList(plantUmlContextBean); ValueObjectElementBean valueObjectElementBean = (ValueObjectElementBean)valueObjectElementHandler.getElementBeanList(plantUmlContextBean); RepositoryElementBean repositoryElementBean = (RepositoryElementBean)repositoryElementHandler.getElementBeanList(plantUmlContextBean); @@ -131,45 +167,64 @@ public abstract class AbstractVarRegistry { InfrastAclElementBean infrastAclElementBean = (InfrastAclElementBean)infrastAclElementHandler.getElementBeanList(plantUmlContextBean); CommandElementBean commandElementBean = (CommandElementBean)appCmdElementHandler.getElementBeanList(plantUmlContextBean); ExecutorElementBean executorElementBean = (ExecutorElementBean)appExeElementHandler.getElementBeanList(plantUmlContextBean); + DomainEventElementBean domainEventElementBean = (DomainEventElementBean)eventElementHandler.getElementBeanList(plantUmlContextBean); + AppListenerElementBean appListenerElementBean = (AppListenerElementBean)appListenerElementHandler.getElementBeanList(plantUmlContextBean); + MqConsumerElementBean mqConsumerElementBean = (MqConsumerElementBean)mqConsumerElementHandler.getElementBeanList(plantUmlContextBean); + MqProducerElementBean mqProducerElementBean = (MqProducerElementBean)mqProducerElementHandler.getElementBeanList(plantUmlContextBean); + MqHandlerElementBean mqHandlerElementBean = (MqHandlerElementBean)mqHandlerElementHandler.getElementBeanList(plantUmlContextBean); + //处理派生类 + DtoElementBean dtoElementBean = derivedDTOElementHandler.getElementBeanList(plantUmlContextBean); + FacadeElementBean facadeElementBean = derivedFacadeElementHandler.getElementBeanList(plantUmlContextBean); + FacadeImplElementBean facadeImplElementBean = derivedFacadeImplElementHandler.getElementBeanList(plantUmlContextBean); + DtoBoConvertElementBean dtoBoConvertElementBean = derivedDTOBOConvertElementHandler.getElementBeanList(plantUmlContextBean); + DoBoConvertElementBean doBoConvertElementBean = derivedDOBOConvertElementHandler.getElementBeanList(plantUmlContextBean); + VoElementBean voElementBean = derivedVOElementHandler.getElementBeanList(plantUmlContextBean); + ControllerElementBean controllerElementBean = derivedControllerElementHandler.getElementBeanList(plantUmlContextBean); + VoBoConvertElementBean voBoConvertElementBean = derivedVOBOConvertElementHandler.getElementBeanList(plantUmlContextBean); + EnumElementBean enumElementBean = derivedEnumElementHandler.getElementBeanList(plantUmlContextBean); + GatawayImplElementBean gatawayImplElementBean = derivedGatawayImplElementHandler.getElementBeanList(plantUmlContextBean); + RepositoryImplElementBean repositoryImplElementBean = derivedRepositoryImplElementHandler.getElementBeanList(plantUmlContextBean); + InfrastAclImplElementBean infrastAclImplElementBean = derivedInfrastAclImplElementHandler.getElementBeanList(plantUmlContextBean); + + //最后进行动态调用绘制 + dynamicInvokeHandler.exeDynamicInvoke(plantUmlContextBean); + + + + varMap.put("domainevent",domainEventElementBean.getClassBeanList()); varMap.put("domainbo",domainBoElementBean.getClassBeanList()); varMap.put("domainvalueobject",valueObjectElementBean.getClassBeanList()); varMap.put("valueobjectenum",valueObjectElementBean.getEnumBeanList()); - varMap.put("repository",repositoryElementBean.getInterfaceBeanList()); - varMap.put("gataway",gatawayElementBean.getInterfaceBeanList()); + varMap.put("repository",repositoryElementBean.refreshInterface(plantUmlContextBean,DomainElementEnum.REPOSITORY.getElement()).getInterfaceBeanList()); + varMap.put("gataway",gatawayElementBean.refreshInterface(plantUmlContextBean,DomainElementEnum.GATAWAY.getElement()).getInterfaceBeanList()); varMap.put("domainmsg",domainMsgBodyElementBean.getClassBeanList()); - varMap.put("domainfactory",factoryElementBean.getClassBeanList()); + varMap.put("domainfactory",factoryElementBean.refreshClass(plantUmlContextBean,DomainElementEnum.FACTORY.getElement()).getClassBeanList()); varMap.put("infrastacl",infrastAclElementBean.getInterfaceBeanList()); varMap.put("infrastaclparam",infrastAclElementBean.getClassBeanList()); varMap.put("cmd",commandElementBean.getClassBeanList()); - varMap.put("exeClass",executorElementBean.getClassBeanList()); + varMap.put("exeClass",executorElementBean.refreshClass(plantUmlContextBean,DomainElementEnum.EXECUTOR.getElement()).getClassBeanList()); varMap.put("exeInterface",executorElementBean.getInterfaceBeanList()); + varMap.put("applistener",appListenerElementBean.getClassBeanList()); + varMap.put("mqproducer",mqProducerElementBean.getClassBeanList()); + varMap.put("mqconsumer",mqConsumerElementBean.getClassBeanList()); + varMap.put("mqhandler",mqHandlerElementBean.getClassBeanList()); //处理派生类 - DtoElementBean dtoElementBean = derivedDTOElementHandler.getElementBeanList(plantUmlContextBean); varMap.put("derivedto",dtoElementBean.getClassBeanList()); - - FacadeElementBean facadeElementBean = derivedFacadeElementHandler.getElementBeanList(plantUmlContextBean); - varMap.put("derivefacade",facadeElementBean.getInterfaceBeanList()); - - FacadeImplElementBean facadeImplElementBean = derivedFacadeImplElementHandler.getElementBeanList(plantUmlContextBean); - varMap.put("derivefacadeimpl",facadeImplElementBean.getClassBeanList()); - - DtoBoConvertElementBean dtoBoConvertElementBean = derivedDTOBOConvertElementHandler.getElementBeanList(plantUmlContextBean); + varMap.put("derivefacade",facadeElementBean.refreshInterface(plantUmlContextBean,DomainDerivedElementEnum.FACADE.getElement()).getInterfaceBeanList()); + varMap.put("derivefacadeimpl",facadeImplElementBean.refreshClass(plantUmlContextBean, DomainDerivedElementEnum.FACADE_IMPL.getElement()).getClassBeanList()); varMap.put("dtoboconvert",dtoBoConvertElementBean.getInterfaceBeanList()); - - DoBoConvertElementBean doBoConvertElementBean = derivedDOBOConvertElementHandler.getElementBeanList(plantUmlContextBean); varMap.put("doboconvert",doBoConvertElementBean.getInterfaceBeanList()); - - VoElementBean voElementBean = derivedVOElementHandler.getElementBeanList(plantUmlContextBean); varMap.put("adaptervo",voElementBean.getClassBeanList()); - - ControllerElementBean controllerElementBean = derivedControllerElementHandler.getElementBeanList(plantUmlContextBean); - varMap.put("controller",controllerElementBean.getClassBeanList()); - - VoBoConvertElementBean voBoConvertElementBean = derivedVOBOConvertElementHandler.getElementBeanList(plantUmlContextBean); + varMap.put("controller",controllerElementBean.refreshClass(plantUmlContextBean,DomainDerivedElementEnum.CONTROLLER.getElement()).getClassBeanList()); varMap.put("voboconvert",voBoConvertElementBean.getInterfaceBeanList()); + varMap.put("apienum",enumElementBean.getEnumBeanList()); + varMap.put("gatawayimpl",gatawayImplElementBean.refreshClass(plantUmlContextBean, DomainElementEnum.GATAWAY_IMPL.getElement()).getClassBeanList()); + varMap.put("repositoryimpl",repositoryImplElementBean.refreshClass(plantUmlContextBean, DomainElementEnum.REPOSITORY_IMPL.getElement()).getClassBeanList()); + varMap.put("infrastaclimpl",infrastAclImplElementBean.refreshClass(plantUmlContextBean, DomainElementEnum.ADAPTER_ACL_IMPL.getElement()).getClassBeanList()); + return varMap; } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/IWriteFileService.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/IWriteFileService.java index 64c35b998069f80d1eef7d33f454196a80dbec38..1d608a04fc45265722eb4d1f9b4efb2b773fc876 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/service/IWriteFileService.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/IWriteFileService.java @@ -19,7 +19,7 @@ public interface IWriteFileService { * 抽象写模块class文件 * @param writeContentBean */ - public void writeContent(WriteContentBean writeContentBean); + void writeContent(WriteContentBean writeContentBean); /** * 一次性生成单表需要的所有模块代码 @@ -27,14 +27,14 @@ public interface IWriteFileService { * @param humpClassName * @param varMap */ - public void writeAllContent(String humpClassName, Map varMap, String fast); + void writeAllContent(String humpClassName, Map varMap, String fast); /** * 写公共基础服务类 * * @param varMap */ - public void writeCommonContent(Map varMap, String fast); + void writeCommonContent(Map varMap, String fast); } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/ReadInvokePlantUMLFileService.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/ReadInvokePlantUMLFileService.java new file mode 100644 index 0000000000000000000000000000000000000000..6ec3bcbe9d8118040dfa54c7839752cdc8de7437 --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/ReadInvokePlantUMLFileService.java @@ -0,0 +1,250 @@ +package com.coderman.codemaker.service; + +import com.coderman.codemaker.bean.GlobalConstant; +import com.coderman.codemaker.bean.invoke.InvokeContextBean; +import com.coderman.codemaker.bean.plantuml.*; +import com.coderman.codemaker.service.invoker.MethodInvokeHandler; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.assertj.core.util.Lists; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ResourceUtils; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; + +/** + * Description: + * date: 2021/10/15 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +@Slf4j +public class ReadInvokePlantUMLFileService { + + @Autowired + private MethodInvokeHandler methodInvokeHandler; + + /** + * 读取plantUMl文件 + * @param plantUMLFileName + * @return + */ + private List readPlantUMLContent(String plantUMLFileName){ + if(StringUtils.isEmpty(plantUMLFileName)){ + log.error("plantUMLFileName is empty,can't read content----------------!!!!!!!!!!"); + return null; + } + try { + File file = ResourceUtils.getFile("classpath:invoke-plantuml/"+plantUMLFileName); + return FileUtils.readLines(file,"UTF-8"); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + + /** + * 解析plantUML文件内容 + * @return + */ + public void parseInvokeChainList( PlantUmlContextBean plantUmlContextBean,String plantUMLFileName){ + List contentList = readPlantUMLContent(plantUMLFileName); + List elementList = new ArrayList<>(); + for(String str : contentList){ + if(str.trim().contains(GlobalConstant.INVOKE_TAG)){ + elementList.add(str.trim()); + } + } + for(String invokeContent : elementList){ + dealInvokeMethodConent(invokeContent,plantUmlContextBean); + } + } + + /** + * 对调用方的method进行动态绘制 + * @param invokeContent + * @param plantUmlContextBean + */ + private void dealInvokeMethodConent(String invokeContent, PlantUmlContextBean plantUmlContextBean){ + String [] invokeArr = invokeContent.split(GlobalConstant.INVOKE_TAG); + AbstractClassBean invokerClassBean = getTargetClass(invokeArr[0],plantUmlContextBean); + AbstractClassBean providerClassBean = getTargetClass(invokeArr[1],plantUmlContextBean); + + if(invokerClassBean == null || providerClassBean == null){ + log.error("获取调用者类名 或者提供者类名为空,绘制动态调用失败,invokeContent = {}",invokeContent); + return; + } + + String invokerMethod = invokeArr[0].toLowerCase().split(invokerClassBean.getClassName().toLowerCase()+".")[1].trim()+"("; + + String providerMethod = invokeArr[1].toLowerCase().split(providerClassBean.getClassName().toLowerCase()+".")[1].trim()+"("; + + Optional providerMethodBean = providerClassBean.getMethodBeanList().stream().filter(methodBean -> methodBean.getMethodName().toLowerCase().startsWith(providerMethod)).findFirst(); + + + Optional invokerMethodBean = invokerClassBean.getMethodBeanList().stream().filter(methodBean -> methodBean.getMethodName().toLowerCase().startsWith(invokerMethod)).findFirst(); + if(!providerMethodBean.isPresent() || !invokerMethodBean.isPresent()){ + log.error("获取调用者方法名 或者提供者方法名为空,绘制动态调用失败,invokeContent = {}",invokeContent); + return; + } + + InvokeContextBean invokeBean = new InvokeContextBean(); + + if(invokerMethodBean.isPresent()){ + MethodBean methodBean = invokerMethodBean.get(); + if(CollectionUtils.isEmpty(methodBean.getInvokeMethodList())){ + methodBean.initInvokeRowContentList(); + } + invokeBean.setMethodBean(methodBean); + invokeBean.setPlantUmlContextBean(plantUmlContextBean); + invokeBean.setInvokerMethod(invokerMethod); + invokeBean.setProviderClassName(providerClassBean.getClassName()); + invokeBean.setProviderClassMethod(providerMethodBean.get().getMethodName()); + invokeBean.setProviderClassMethodReturn(providerMethodBean.get().getReturnClass()); + invokeBean.buildInvokeScene(invokerClassBean.getClassName(),providerClassBean.getClassName()); + invokeBean.setInvokerClassBean(invokerClassBean); + + boolean result = plantUmlContextBean.addInvokeMethod(invokeBean); + if(!result){ + return; + } + } + methodInvokeHandler.dealInvokeContent(invokeBean); + + + + + + //注册被调用方的field + methodInvokeHandler.registField(invokerClassBean, providerClassBean); + //注册被调用方的方法返回值引用包 + methodInvokeHandler.registImportPackageByClass(invokerClassBean,plantUmlContextBean,providerMethodBean.get().getReturnClass()); + //更新plantumlcontext上下文 + refreshPlantUmlContext(invokerClassBean,plantUmlContextBean); + + } + + + + /** + * 从调用描述中获取调用类或者被调用类 + * @param invokerClassContent + * @param plantUmlContextBean + * @return + */ + private AbstractClassBean getTargetClass(String invokerClassContent,PlantUmlContextBean plantUmlContextBean){ + AtomicReference abstractClassBean = new AtomicReference<>(); + AtomicInteger size = new AtomicInteger(0); + plantUmlContextBean.getInterfaceBeanMap().forEach((k,v)->{ + v.getMethodBeanList().forEach(methodBean -> { + String methodInfo = k.toLowerCase()+"."+methodBean.getSimplMethodName().toLowerCase(); + if(invokerClassContent.trim().toLowerCase().endsWith(methodInfo) && methodInfo.length() > size.get()){ + abstractClassBean.set(v); + size.set(methodInfo.length()); + } + }); + + }); + + plantUmlContextBean.getClassBeanMap().forEach((k,v)->{ + v.getMethodBeanList().forEach(methodBean -> { + String methodInfo = k.toLowerCase()+"."+methodBean.getSimplMethodName().toLowerCase(); + if(invokerClassContent.trim().toLowerCase().endsWith(methodInfo) && methodInfo.length() > size.get()){ + abstractClassBean.set(v); + size.set(methodInfo.length()); + } + }); + }); + + + if(abstractClassBean.get() != null){ + return abstractClassBean.get(); + } + + if(plantUmlContextBean.getDerivedPlantUmlContextBean() != null){ + plantUmlContextBean.getDerivedPlantUmlContextBean().getInterfaceBeanMap().forEach((k,v)->{ + v.getMethodBeanList().forEach(methodBean -> { + String methodInfo = k.toLowerCase()+"."+methodBean.getSimplMethodName().toLowerCase(); + if(invokerClassContent.trim().toLowerCase().endsWith(methodInfo) && methodInfo.length() > size.get()){ + abstractClassBean.set(v); + size.set(methodInfo.length()); + } + }); + }); + + plantUmlContextBean.getDerivedPlantUmlContextBean().getClassBeanMap().forEach((k,v)->{ + v.getMethodBeanList().forEach(methodBean -> { + String methodInfo = k.toLowerCase()+"."+methodBean.getSimplMethodName().toLowerCase(); + if(invokerClassContent.trim().toLowerCase().endsWith(methodInfo) && methodInfo.length() > size.get()){ + abstractClassBean.set(v); + size.set(methodInfo.length()); + } + }); + }); + } + if(abstractClassBean.get() != null){ + return abstractClassBean.get(); + } + + return null; + + } + + + /** + * 更新plantUMlcontext上下文 + * @param invokerClassBean + * @param plantUmlContextBean + */ + private void refreshPlantUmlContext(AbstractClassBean invokerClassBean,PlantUmlContextBean plantUmlContextBean){ + InterfaceBean oldInterface = plantUmlContextBean.getInterfaceBeanMap().get(invokerClassBean.getClassName()); + if(oldInterface != null){ + oldInterface.setFieldBeanList(invokerClassBean.getFieldBeanList()); + oldInterface.setMethodBeanList(invokerClassBean.getMethodBeanList()); + plantUmlContextBean.getInterfaceBeanMap().put(oldInterface.getClassName(),oldInterface); + return; + } + ClassBean oldClass = plantUmlContextBean.getClassBeanMap().get(invokerClassBean.getClassName()); + if(oldClass != null){ + oldClass.setFieldBeanList(invokerClassBean.getFieldBeanList()); + oldClass.setMethodBeanList(invokerClassBean.getMethodBeanList()); + oldClass.mergeImportClass(invokerClassBean.getDynamicImportPackageList()); + plantUmlContextBean.getClassBeanMap().put(oldClass.getClassName(),oldClass); + return; + } + + + ClassBean oldDervidClass = plantUmlContextBean.getDerivedPlantUmlContextBean().getClassBeanMap().get(invokerClassBean.getClassName()); + if(oldDervidClass != null){ + oldDervidClass.setFieldBeanList(invokerClassBean.getFieldBeanList()); + oldDervidClass.setMethodBeanList(invokerClassBean.getMethodBeanList()); + oldDervidClass.mergeImportClass(invokerClassBean.getDynamicImportPackageList()); + plantUmlContextBean.getDerivedPlantUmlContextBean().getClassBeanMap().put(oldDervidClass.getClassName(),oldDervidClass); + return; + } + + InterfaceBean oldDervidInterface = plantUmlContextBean.getDerivedPlantUmlContextBean().getInterfaceBeanMap().get(invokerClassBean.getClassName()); + if(oldDervidInterface != null){ + oldDervidInterface.setFieldBeanList(invokerClassBean.getFieldBeanList()); + oldDervidInterface.setMethodBeanList(invokerClassBean.getMethodBeanList()); + plantUmlContextBean.getDerivedPlantUmlContextBean().getInterfaceBeanMap().put(oldDervidInterface.getClassName(),oldDervidInterface); + return; + } + + } + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/ReadPlantUMLFileServiceV2.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/ReadPlantUMLFileServiceV2.java index 23785a212ed995cc758291508eca94faa615abfa..abb144403f5dccf3511f4b4daf25477065fa0c59 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/service/ReadPlantUMLFileServiceV2.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/ReadPlantUMLFileServiceV2.java @@ -2,10 +2,10 @@ package com.coderman.codemaker.service; import com.coderman.codemaker.bean.plantuml.*; import com.coderman.codemaker.config.AppServiceConfig; -import com.coderman.codemaker.config.ProjectTemplateDynamicDDDConfig; import com.coderman.codemaker.enums.ClassEnum; import com.coderman.codemaker.enums.ClassRelationEnum; import com.coderman.codemaker.enums.VisibilityEnum; +import com.coderman.codemaker.utils.StringCheckUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FileUtils; @@ -16,10 +16,7 @@ import org.springframework.util.ResourceUtils; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Description: 读文件服务 @@ -121,6 +118,40 @@ public class ReadPlantUMLFileServiceV2 { classBean.setRelationClassStr(StringUtils.join(relationList,",")); } }); + + //统一对解析内容进行校验,提前暴露 + plantUmlContextBean.getClassBeanMap().forEach((className,classBean)->{ + List fieldBeanList = classBean.getFieldBeanList(); + Set fieldNameSet = new HashSet<>(); + fieldBeanList.forEach(fieldBean -> { + if(fieldNameSet.contains(fieldBean.getFieldName())){ + log.error("属性重复,类名{},属性名:{}",className,fieldBean.getFieldName()); + } + fieldNameSet.add(fieldBean.getFieldName()); + }); + + List methodBeanList = classBean.getMethodBeanList(); + Set methodNameSet = new HashSet<>(); + methodBeanList.forEach(methodBean -> { + if(fieldNameSet.contains(methodBean.getMethodName())){ + log.error("方法重复,类名{},属性名:{}",className,methodBean.getMethodName()); + } + methodNameSet.add(methodBean.getMethodName()); + }); + + }); + + plantUmlContextBean.getInterfaceBeanMap().forEach((className,interfaceBean)->{ + List methodBeanList = interfaceBean.getMethodBeanList(); + Set methodNameSet = new HashSet<>(); + methodBeanList.forEach(methodBean -> { + if(methodNameSet.contains(methodBean.getMethodName())){ + log.error("方法重复,类名{},属性名:{}",className,methodBean.getMethodName()); + } + methodNameSet.add(methodBean.getMethodName()); + }); + }); + return plantUmlContextBean; } @@ -134,21 +165,20 @@ public class ReadPlantUMLFileServiceV2 { String classType = getClassType(elementList.get(0)); if(classType.equals(ClassEnum.CLASS.getClassType())){ ClassBean classBean = buildClassBean(elementList); - classBean.setPlantUMLPackage(currentPackage); + classBean.buildPlantUMLPackage(currentPackage); plantUmlContextBean.addClassBean(classBean); } else if(classType.equals(ClassEnum.ENUM.getClassType())){ EnumBean enumBean = builEnumBean(elementList); - enumBean.setPlantUMLPackage(currentPackage); + enumBean.buildPlantUMLPackage(currentPackage); plantUmlContextBean.addEnumBean(enumBean); } else if(classType.equals(ClassEnum.INTERFACE.getClassType())){ InterfaceBean interfaceBean = buildInterfaceBean(elementList); - interfaceBean.setPlantUMLPackage(currentPackage); + interfaceBean.buildPlantUMLPackage(currentPackage); plantUmlContextBean.addInterfaceBean(interfaceBean); } - } @@ -163,17 +193,26 @@ public class ReadPlantUMLFileServiceV2 { */ private ClassBean buildClassBean(List elementList ){ - String[] array = elementList.get(0).trim().replace("{","").trim().split(" "); + String[] array = elementList.get(0).trim().replace("{","").trim().split("\""); String classMetaInfoArr = array[1]; List fieldBeanList = getFieldBeanList(elementList.subList(1,elementList.size())); List methodBeanList = getMethodBeanList(elementList.subList(1,elementList.size())); ClassBean classBean = new ClassBean(); classBean.setFieldBeanList(fieldBeanList); - classBean.setMethodBeanList(methodBeanList); + classBean.setAuthor(appServiceConfig.getAuthor()); classBean.setClassName(classMetaInfoArr.split("-")[1].replace("\"","")); classBean.setClassDesc(classMetaInfoArr.split("-")[0].replace("\"","")); + + if(StringCheckUtils.isContainChinese(classBean.getClassName())){ + String className = classBean.getClassDesc(); + classBean.setClassDesc(classBean.getClassName()); + classBean.setClassName(className); + } + methodBeanList.forEach(methodBean -> methodBean.setClassName(classBean.getClassName())); + classBean.setMethodBeanList(methodBeanList); + return classBean; } @@ -184,16 +223,23 @@ public class ReadPlantUMLFileServiceV2 { */ private InterfaceBean buildInterfaceBean(List elementList ){ - String[] array = elementList.get(0).trim().replace("{","").trim().split(" "); + String[] array = elementList.get(0).trim().replace("{","").trim().split("\""); String classMetaInfoArr = array[1]; List methodBeanList = getMethodBeanList(elementList.subList(1,elementList.size())); InterfaceBean interfaceBean = new InterfaceBean(); - interfaceBean.setMethodBeanList(methodBeanList); interfaceBean.setAuthor(appServiceConfig.getAuthor()); interfaceBean.setClassName(classMetaInfoArr.split("-")[1].replace("\"","")); interfaceBean.setClassDesc(classMetaInfoArr.split("-")[0].replace("\"","")); + if(StringCheckUtils.isContainChinese(interfaceBean.getClassName())){ + String className = interfaceBean.getClassDesc(); + interfaceBean.setClassDesc(interfaceBean.getClassName()); + interfaceBean.setClassName(className); + } + methodBeanList.stream().forEach(methodBean -> methodBean.setClassName(interfaceBean.getClassName())); + interfaceBean.setMethodBeanList(methodBeanList); + return interfaceBean; } @@ -204,7 +250,7 @@ public class ReadPlantUMLFileServiceV2 { */ private EnumBean builEnumBean(List elementList ){ - String[] array = elementList.get(0).trim().replace("{","").trim().split(" "); + String[] array = elementList.get(0).trim().replace("{","").trim().split("\""); String classMetaInfoArr = array[1]; List fieldBeanList = getFieldBeanList(elementList.subList(1,elementList.size())); @@ -213,6 +259,11 @@ public class ReadPlantUMLFileServiceV2 { enumBean.setAuthor(appServiceConfig.getAuthor()); enumBean.setClassName(classMetaInfoArr.split("-")[1].replace("\"","")); enumBean.setClassDesc(classMetaInfoArr.split("-")[0].replace("\"","")); + if(StringCheckUtils.isContainChinese(enumBean.getClassName())){ + String className = enumBean.getClassDesc(); + enumBean.setClassDesc(enumBean.getClassName()); + enumBean.setClassName(className); + } dealEnumMethodBeanList(elementList,enumBean); return enumBean; } @@ -232,10 +283,9 @@ public class ReadPlantUMLFileServiceV2 { if(!fieldStr.trim().contains(":")){ continue; } - //+主交易单类型:string tradeOrderType String[] fieldArr = fieldStr.trim().split(":"); FieldBean fieldBean = new FieldBean(); - fieldBean.setDesc(fieldArr[0]); + fieldBean.buildDesc(fieldArr[0]); fieldBean.setVisibility(VisibilityEnum.getVisibilityStr(fieldArr[0])); fieldBean.setFieldName(fieldArr[1]); fieldBeanList.add(fieldBean); @@ -251,17 +301,14 @@ public class ReadPlantUMLFileServiceV2 { private List getMethodBeanList(List elementList){ List methodBeanList = new ArrayList<>(); for (String fieldStr : elementList){ - if(!fieldStr.contains("()") && !fieldStr.contains("(") && !fieldStr.contains(")")){ continue; } - MethodBean methodBean =new MethodBean(); - - //-创建变更日志: TradeOrderLogBO getTradeOrderLogBO() + MethodBean methodBean = new MethodBean(); if(fieldStr.contains(":")){ String[] fieldArr = fieldStr.trim().split(":"); - methodBean.setVisibility(VisibilityEnum.getVisibilityStr(fieldArr[1])); - methodBean.setDesc(fieldArr[0]); + methodBean.setVisibility(VisibilityEnum.getVisibilityStr(fieldArr[0])); + methodBean.buildDesc(fieldArr[0]); String[] arr = fieldArr[1].trim().split(" "); if(arr.length == 2){ @@ -279,7 +326,7 @@ public class ReadPlantUMLFileServiceV2 { methodBean.setReturnClass(fieldStr.trim().split(" ")[0]); methodBean.setMethodName(fieldStr.trim().split(" ")[1]); }else{ - methodBean.setDesc(fieldArr[0]); + methodBean.buildDesc(fieldArr[0]); methodBean.setVisibility(VisibilityEnum.getVisibilityStr(fieldStr.trim())); methodBean.setReturnClass(fieldArr[1]); StringBuilder builder = new StringBuilder(); @@ -292,7 +339,7 @@ public class ReadPlantUMLFileServiceV2 { if(!methodBean.getReturnClass().contains("void")){ methodBean.setReturnBody("return null;"); } - + methodBean.buildParamArr(); methodBeanList.add(methodBean); } return methodBeanList; diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/TemlateVarService.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/TemlateVarService.java index 0aff281cad593a67ae6e35e1fcb2f2fa85e0f6c8..9cdb5b1bfb4f54d5cab2e4d082231c7d098f4b2e 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/service/TemlateVarService.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/TemlateVarService.java @@ -1,10 +1,10 @@ package com.coderman.codemaker.service; -import com.alibaba.fastjson.JSON; import com.coderman.codemaker.bean.ColumnBean; import com.coderman.codemaker.bean.TableBean; import com.coderman.codemaker.config.AppServiceConfig; import com.coderman.codemaker.dao.SqlMapper; +import com.coderman.codemaker.utils.StringHelperUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,7 +49,7 @@ public class TemlateVarService { tableBeanList.stream().forEach(e->{ String humpTableName = getHumpTableName(e.getTableName()); e.setHumpTableName(humpTableName); - String humpClassName = getHumpClassName(humpTableName); + String humpClassName = StringHelperUtils.getHumpClassName(humpTableName); e.setHumpClassName(humpClassName); String tableName ; if(e.getTableName().contains("_")){ @@ -66,8 +66,6 @@ public class TemlateVarService { e.setTableName(tableName); tableBeanMap.put(tableName,e); }); - - System.out.println(JSON.toJSONString(tableBeanMap)); return tableBeanMap; } @@ -112,7 +110,6 @@ public class TemlateVarService { }); Map> stringListMap = columnBeanListNew.stream().collect(Collectors.groupingBy(ColumnBean::getTableName)); - System.out.println("stringListMap = "+JSON.toJSONString(stringListMap)); return stringListMap; } @@ -169,18 +166,7 @@ public class TemlateVarService { - /** - * 获取表名对应的类名 - * eg: user_info->UserInfo - * staff_education_info->StaffEducationInfo - * - * @param humpTableName - * @return - */ - private String getHumpClassName(String humpTableName){ - String resultName = humpTableName.substring(0,1).toUpperCase().concat(humpTableName.substring(1)); - return resultName; - } + /** * 获取字段类型对应的javaentity的java类型 @@ -238,13 +224,4 @@ public class TemlateVarService { return columnBeanMap; } - /** - * 根据表名获取对应类名 - * @param tableName - * @return - */ - public String getClassDOName(String tableName){ - String humpTableName = getHumpTableName(tableName); - return getHumpClassName(humpTableName); - } } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/WriteAppModuleService.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/WriteAppModuleService.java index c35d25606e3deba94d497295acdd8ca4d2d659b1..84de00e2240ecad9dc5574227332a18d575c86af 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/service/WriteAppModuleService.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/WriteAppModuleService.java @@ -189,6 +189,19 @@ public class WriteAppModuleService { } writeDynamicDDDModuleService.writeMsgBody(classBeanList,writeFileService,null); } + + /** + * 写event文件 + * @param classBeanList + */ + public void writeDomainEvent(List classBeanList) { + IWriteFileService writeFileService = appServiceConfig.getModuleWriteService(TemplateFileEnum.EVENT_BODY.getTempFileName()); + if (writeFileService == null) { + return; + } + writeDynamicDDDModuleService.writeDomainEvent(classBeanList,writeFileService,null); + } + /** * 写domaingataway文件 * @param classBeanList @@ -202,14 +215,26 @@ public class WriteAppModuleService { } /** * 写domaingatawayimpl文件 - * @param interfaceBeanList + * @param gatawayImplBeanList */ - public void writeGatawayImpl(List interfaceBeanList) { + public void writeGatawayImpl(List gatawayImplBeanList) { IWriteFileService writeFileService = appServiceConfig.getModuleWriteService(TemplateFileEnum.GATAWAY_IMPL.getTempFileName()); if (writeFileService == null) { return; } - writeDynamicDDDModuleService.writeGatawayImpl(interfaceBeanList,writeFileService,null); + writeDynamicDDDModuleService.writeGatawayImpl(gatawayImplBeanList,writeFileService,null); + } + + /** + * 写domainrepositoryimpl文件 + * @param repositoryImplBeanList + */ + public void writeRepositoryImpl(List repositoryImplBeanList) { + IWriteFileService writeFileService = appServiceConfig.getModuleWriteService(TemplateFileEnum.REPOSITORY_IMPL.getTempFileName()); + if (writeFileService == null) { + return; + } + writeDynamicDDDModuleService.writeRepositoryImpl(repositoryImplBeanList,writeFileService,null); } /** @@ -236,6 +261,56 @@ public class WriteAppModuleService { writeDynamicDDDModuleService.writeFactory(classBeanList,writeFileService,null); } + /** + * 写applistener文件 + * @param classBeanList + */ + public void writeAppListener(List classBeanList) { + IWriteFileService writeFileService = appServiceConfig.getModuleWriteService(TemplateFileEnum.MQ_LISTENER.getTempFileName()); + if (writeFileService == null) { + return; + } + writeDynamicDDDModuleService.writeAppListner(classBeanList,writeFileService,null); + } + + /** + * 写mqproducer文件 + * @param classBeanList + */ + public void writeMqProducer(List classBeanList) { + IWriteFileService writeFileService = appServiceConfig.getModuleWriteService(TemplateFileEnum.MQ_PRODUCER.getTempFileName()); + if (writeFileService == null) { + return; + } + writeDynamicDDDModuleService.writeMqProducer(classBeanList,writeFileService,null); + } + + /** + * 写mqconsumer文件 + * @param classBeanList + */ + public void writeMqConsumer(List classBeanList) { + IWriteFileService writeFileService = appServiceConfig.getModuleWriteService(TemplateFileEnum.MQ_CONSUMER.getTempFileName()); + if (writeFileService == null) { + return; + } + writeDynamicDDDModuleService.writeMqConsumer(classBeanList,writeFileService,null); + } + + /** + * 写mqhandler文件 + * @param classBeanList + */ + public void writeMqHandler(List classBeanList) { + IWriteFileService writeFileService = appServiceConfig.getModuleWriteService(TemplateFileEnum.MQ_HANDLER.getTempFileName()); + if (writeFileService == null) { + return; + } + writeDynamicDDDModuleService.writeMqHandler(classBeanList,writeFileService,null); + } + + + /** * 写AppExeImpl文件 * @param classBeanList @@ -314,12 +389,25 @@ public class WriteAppModuleService { * 写AppExeInterface文件 * @param interfaceBeanList */ - public void writeAclInterfaceAndImpl(List interfaceBeanList) { + public void writeAclInterface(List interfaceBeanList) { IWriteFileService writeFileService = appServiceConfig.getModuleWriteService(TemplateFileEnum.ACL.getTempFileName()); if (writeFileService == null) { return; } - writeDynamicDDDModuleService.writeAclInterfaceAndImpl(interfaceBeanList,writeFileService,null); + writeDynamicDDDModuleService.writeAclInterface(interfaceBeanList,writeFileService,null); + } + + + /** + * 写InfrastAclImpl文件 + * @param classBeanList + */ + public void writeAclInterfaceImpl(List classBeanList) { + IWriteFileService writeFileService = appServiceConfig.getModuleWriteService(TemplateFileEnum.ACL_IMPL.getTempFileName()); + if (writeFileService == null) { + return; + } + writeDynamicDDDModuleService.writeAclInterfaceImpl(classBeanList,writeFileService,null); } /** @@ -346,6 +434,19 @@ public class WriteAppModuleService { writeDynamicDDDModuleService.writeEnum(classBeanList,writeFileService,null); } + + /** + * 写apienum文件 + * @param classBeanList + */ + public void writeAPIEnum(List classBeanList) { + IWriteFileService writeFileService = appServiceConfig.getModuleWriteService(TemplateFileEnum.API_ENUM.getTempFileName()); + if (writeFileService == null) { + return; + } + writeDynamicDDDModuleService.writeEnum(classBeanList,writeFileService,null); + } + /** * 写DTO文件 * @param classBeanList @@ -662,19 +763,43 @@ public class WriteAppModuleService { this.writeValueObject(valueObjectBeanList); this.writeEnum(enumBeanList); + + + List apiEnumBeanList = (List)allMetaDataMap.get("apienum"); + this.writeAPIEnum(apiEnumBeanList); + + + + List msgClassBeanList = (List)allMetaDataMap.get("domainmsg"); this.writeMsgBody(msgClassBeanList); + + List eventClassBeanList = (List)allMetaDataMap.get("domainevent"); + this.writeDomainEvent(eventClassBeanList); + + List gatawayBeanList = (List)allMetaDataMap.get("gataway"); List repositoryBeanList = (List)allMetaDataMap.get("repository"); gatawayBeanList.addAll(repositoryBeanList); this.writeDomainGataway(gatawayBeanList); - this.writeGatawayImpl(gatawayBeanList); + + List gatawayImplBeanList = (List)allMetaDataMap.get("gatawayimpl"); + this.writeGatawayImpl(gatawayImplBeanList); + + List repositoryImplBeanList = (List)allMetaDataMap.get("repositoryimpl"); + this.writeRepositoryImpl(repositoryImplBeanList); + + List aclBeanList = (List)allMetaDataMap.get("infrastacl"); List aclParamBeanList = (List)allMetaDataMap.get("infrastaclparam"); - this.writeAclInterfaceAndImpl(aclBeanList); + List aclImplBeanList = (List)allMetaDataMap.get("infrastaclimpl"); + + this.writeAclInterface(aclBeanList); this.writeAclInterfaceParam(aclParamBeanList); + this.writeAclInterfaceImpl(aclImplBeanList); + List commandBeanList = (List)allMetaDataMap.get("cmd"); @@ -689,6 +814,23 @@ public class WriteAppModuleService { List factoryBeanList = (List)allMetaDataMap.get("domainfactory"); this.writeFactory(factoryBeanList); + List appListenerBeanList = (List)allMetaDataMap.get("applistener"); + this.writeAppListener(appListenerBeanList); + + List mqProducerBeanList = (List)allMetaDataMap.get("mqproducer"); + this.writeMqProducer(mqProducerBeanList); + + List mqConsumerBeanList = (List)allMetaDataMap.get("mqconsumer"); + this.writeMqConsumer(mqConsumerBeanList); + + List mqHandlerBeanList = (List)allMetaDataMap.get("mqhandler"); + this.writeMqHandler(mqHandlerBeanList); + + + + + + List voClassBeanList = (List)allMetaDataMap.get("adaptervo"); this.writeVO(voClassBeanList); @@ -705,8 +847,6 @@ public class WriteAppModuleService { List dtoClassBeanList = (List)allMetaDataMap.get("derivedto"); this.writeDTO(dtoClassBeanList); - - List dtoboconvertBeanList = (List)allMetaDataMap.get("dtoboconvert"); this.writeDTOBOConvert(dtoboconvertBeanList); diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/WriteDynamicDDDModuleService.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/WriteDynamicDDDModuleService.java index 233e2621c028c5046f6818cbfd4643570a7acb30..8a8cc0672b6c671e71ee7379aa1cc9635570d848 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/service/WriteDynamicDDDModuleService.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/WriteDynamicDDDModuleService.java @@ -55,13 +55,24 @@ public class WriteDynamicDDDModuleService { List domainMsgBeanList = (List)dynamicDDDMap.get("domainmsg"); writeMsgBody(domainMsgBeanList,writeFileService,"ddd"); + + //写domainevent + List domainEventBeanList = (List)dynamicDDDMap.get("domainevent"); + writeDomainEvent(domainEventBeanList,writeFileService,"ddd"); + //写factory List domainFactoryBeanList = (List)dynamicDDDMap.get("domainfactory"); writeFactory(domainFactoryBeanList,writeFileService,"ddd"); //写防腐层接口 List infrastAclInterfaceList = (List)dynamicDDDMap.get("infrastacl"); - writeAclInterfaceAndImpl(infrastAclInterfaceList,writeFileService,"ddd"); + writeAclInterface(infrastAclInterfaceList,writeFileService,"ddd"); + + + //写防腐层接口 + List infrastAclInterfaceImplList = (List)dynamicDDDMap.get("infrastaclimpl"); + writeAclInterfaceImpl(infrastAclInterfaceImplList,writeFileService,"ddd"); + //写防腐层接口需要的参数 List infrastAclParamClassList = (List)dynamicDDDMap.get("infrastaclparam"); writeACLParam(infrastAclParamClassList,writeFileService,"ddd"); @@ -92,12 +103,8 @@ public class WriteDynamicDDDModuleService { public void writeBO(List classBeanList, IWriteFileService writeFileService,String dddTag){ for (ClassBean classBean : classBeanList){ - Map varMap = new HashMap<>(); + Map varMap = classBean.buildVarMap(); - varMap.put("class",classBean); - varMap.put("fields",classBean.getFieldBeanList()); - varMap.put("methods",classBean.getMethodBeanList()); - varMap.put("imports",classBean.getImportClassList()); String boContent; if (StringUtils.isNotEmpty(dddTag)){ boContent = freemarkerService.parseTplDynamicDDD(TemplateFileEnum.BUSINESS_OBJECT_DDD.getTempFileName(), varMap); @@ -121,12 +128,8 @@ public class WriteDynamicDDDModuleService { public void writeMsgBody(List classBeanList, IWriteFileService writeFileService,String dddTag){ for (ClassBean classBean : classBeanList){ - Map varMap = new HashMap<>(); + Map varMap = classBean.buildVarMap(); - varMap.put("class",classBean); - varMap.put("fields",classBean.getFieldBeanList()); - varMap.put("methods",classBean.getMethodBeanList()); - varMap.put("imports",classBean.getImportClassList()); String boContent; if(StringUtils.isNotEmpty(dddTag)){ boContent = freemarkerService.parseTplDynamicDDD(TemplateFileEnum.MESSAGE_BODY.getTempFileName(), varMap); @@ -144,6 +147,35 @@ public class WriteDynamicDDDModuleService { } } + + + /** + * 写domainEvent + * @param classBeanList + * @param writeFileService + */ + public void writeDomainEvent(List classBeanList, IWriteFileService writeFileService,String dddTag){ + + for (ClassBean classBean : classBeanList){ + Map varMap = classBean.buildVarMap(); + + String boContent; + if(StringUtils.isNotEmpty(dddTag)){ + boContent = freemarkerService.parseTplDynamicDDD(TemplateFileEnum.EVENT_BODY.getTempFileName(), varMap); + }else { + boContent = freemarkerService.parseTpl(TemplateFileEnum.EVENT_BODY.getTempFileName(), varMap); + } + + WriteContentBean writeContentBean = WriteContentBean.builder().content(boContent) + .templateName(TemplateFileEnum.EVENT_BODY.getTempFileName()) + .humpClassName(classBean.getClassName()) + .classPackageName(classBean.getPackageName()) + .build(); + writeFileService.writeContent(writeContentBean); + } + } + + /** * 写DTO * @param classBeanList @@ -152,12 +184,8 @@ public class WriteDynamicDDDModuleService { public void writeDTO(List classBeanList, IWriteFileService writeFileService){ for (ClassBean classBean : classBeanList){ - Map varMap = new HashMap<>(); + Map varMap = classBean.buildVarMap(); - varMap.put("class",classBean); - varMap.put("fields",classBean.getFieldBeanList()); - varMap.put("methods",classBean.getMethodBeanList()); - varMap.put("imports",classBean.getImportClassList()); String boContent = freemarkerService.parseTpl(TemplateFileEnum.DTO_DDD.getTempFileName(), varMap); WriteContentBean writeContentBean = WriteContentBean.builder().content(boContent) .templateName(TemplateFileEnum.DTO_DDD.getTempFileName()) @@ -176,12 +204,8 @@ public class WriteDynamicDDDModuleService { public void writeVO(List classBeanList, IWriteFileService writeFileService){ for (ClassBean classBean : classBeanList){ - Map varMap = new HashMap<>(); + Map varMap = classBean.buildVarMap(); - varMap.put("class",classBean); - varMap.put("fields",classBean.getFieldBeanList()); - varMap.put("methods",classBean.getMethodBeanList()); - varMap.put("imports",classBean.getImportClassList()); String boContent = freemarkerService.parseTpl(TemplateFileEnum.VO_DDD.getTempFileName(), varMap); WriteContentBean writeContentBean = WriteContentBean.builder().content(boContent) .templateName(TemplateFileEnum.VO_DDD.getTempFileName()) @@ -201,12 +225,8 @@ public class WriteDynamicDDDModuleService { public void writeController(List classBeanList, IWriteFileService writeFileService){ for (ClassBean classBean : classBeanList){ - Map varMap = new HashMap<>(); + Map varMap = classBean.buildVarMap(); - varMap.put("class",classBean); - varMap.put("fields",classBean.getFieldBeanList()); - varMap.put("methods",classBean.getMethodBeanList()); - varMap.put("imports",classBean.getImportClassList()); String boContent = freemarkerService.parseTpl(TemplateFileEnum.CONTROLLER_DDD.getTempFileName(), varMap); WriteContentBean writeContentBean = WriteContentBean.builder().content(boContent) .templateName(TemplateFileEnum.CONTROLLER_DDD.getTempFileName()) @@ -226,10 +246,8 @@ public class WriteDynamicDDDModuleService { public void writeFacadeImpl(List classBeanList, IWriteFileService writeFileService){ for (ClassBean classBean : classBeanList){ - Map varMap = new HashMap<>(); - varMap.put("class",classBean); - varMap.put("methods",classBean.getMethodBeanList()); - varMap.put("imports",classBean.getImportClassList()); + Map varMap = classBean.buildVarMap(); + String boContent = freemarkerService.parseTpl(TemplateFileEnum.FACADE_IMPL_DDD.getTempFileName(), varMap); WriteContentBean writeContentBean = WriteContentBean.builder().content(boContent) .templateName(TemplateFileEnum.FACADE_IMPL.getTempFileName()) @@ -248,11 +266,8 @@ public class WriteDynamicDDDModuleService { public void writeFacade(List classBeanList, IWriteFileService writeFileService){ for (InterfaceBean interfaceBean : classBeanList){ - Map varMap = new HashMap<>(); + Map varMap = interfaceBean.buildVarMap(); - varMap.put("class",interfaceBean); - varMap.put("methods",interfaceBean.getMethodBeanList()); - varMap.put("imports",interfaceBean.getImportClassList()); String boContent = freemarkerService.parseTpl(TemplateFileEnum.FACADE_DDD.getTempFileName(), varMap); WriteContentBean writeContentBean = WriteContentBean.builder().content(boContent) .templateName(TemplateFileEnum.FACADE.getTempFileName()) @@ -272,12 +287,8 @@ public class WriteDynamicDDDModuleService { public void writeValueObject(List classBeanList, IWriteFileService writeFileService,String dddTag){ for (ClassBean classBean : classBeanList){ - Map varMap = new HashMap<>(); + Map varMap = classBean.buildVarMap(); - varMap.put("class",classBean); - varMap.put("fields",classBean.getFieldBeanList()); - varMap.put("methods",classBean.getMethodBeanList()); - varMap.put("imports",classBean.getImportClassList()); String boContent; if(StringUtils.isNotEmpty(dddTag)){ boContent = freemarkerService.parseTplDynamicDDD(TemplateFileEnum.VALUE_OBJECT.getTempFileName(), varMap); @@ -301,10 +312,8 @@ public class WriteDynamicDDDModuleService { */ private void writeInterfaceAndImpl(List repositoryInterfaceBeanList, IWriteFileService writeFileService,String dddTag){ for (InterfaceBean interfaceBean : repositoryInterfaceBeanList){ - Map varMap = new HashMap<>(); - varMap.put("class",interfaceBean); - varMap.put("methods",interfaceBean.getMethodBeanList()); - varMap.put("imports",interfaceBean.getImportClassList()); + Map varMap = interfaceBean.buildVarMap(); + String interfaceContent; if (StringUtils.isNotEmpty(dddTag)){ interfaceContent = freemarkerService.parseTplDynamicDDD(TemplateFileEnum.GATAWAY.getTempFileName(), varMap); @@ -336,10 +345,7 @@ public class WriteDynamicDDDModuleService { */ public void writeGataWay(List gataWayBeanList, IWriteFileService writeFileService,String dddTag) { for (InterfaceBean interfaceBean : gataWayBeanList) { - Map varMap = new HashMap<>(); - varMap.put("class", interfaceBean); - varMap.put("methods", interfaceBean.getMethodBeanList()); - varMap.put("imports", interfaceBean.getImportClassList()); + Map varMap = interfaceBean.buildVarMap(); String interfaceContent = freemarkerService.parseTpl(TemplateFileEnum.GATAWAY.getTempFileName(), varMap); WriteContentBean writeContentBean = WriteContentBean.builder().content(interfaceContent) @@ -353,27 +359,46 @@ public class WriteDynamicDDDModuleService { /** * 写gataway实现 - * @param gatawayInterfaceBeanList + * @param gatawayImplInterfaceBeanList * @param writeFileService */ - public void writeGatawayImpl(List gatawayInterfaceBeanList, IWriteFileService writeFileService,String dddTag){ - for (InterfaceBean interfaceBean : gatawayInterfaceBeanList){ - Map varMap = new HashMap<>(); - varMap.put("class",interfaceBean); - varMap.put("methods",interfaceBean.getMethodBeanList()); - varMap.put("imports",interfaceBean.getImportClassList()); - + public void writeGatawayImpl(List gatawayImplInterfaceBeanList, IWriteFileService writeFileService,String dddTag){ + for (ClassBean classBean : gatawayImplInterfaceBeanList){ + Map varMap = classBean.buildVarMap(); //写接口实现 String interfaceImplContent = freemarkerService.parseTpl(TemplateFileEnum.GATAWAY_IMPL.getTempFileName(), varMap); WriteContentBean writeContentBean2 = WriteContentBean.builder().content(interfaceImplContent) .templateName(TemplateFileEnum.GATAWAY_IMPL.getTempFileName()) - .humpClassName(interfaceBean.getClassName()) - .classPackageName(interfaceBean.getPackageName()) + .humpClassName(classBean.getClassName()) + .classPackageName(classBean.getPackageName()) .build(); + + writeFileService.writeContent(writeContentBean2); } } + /** + * 写repository实现 + * @param repositoryImplInterfaceBeanList + * @param writeFileService + */ + public void writeRepositoryImpl(List repositoryImplInterfaceBeanList, IWriteFileService writeFileService,String dddTag){ + for (ClassBean classBean : repositoryImplInterfaceBeanList){ + Map varMap = classBean.buildVarMap(); + //写接口实现 + String interfaceImplContent = freemarkerService.parseTpl(TemplateFileEnum.GATAWAY_IMPL.getTempFileName(), varMap); + WriteContentBean writeContentBean2 = WriteContentBean.builder().content(interfaceImplContent) + .templateName(TemplateFileEnum.REPOSITORY_IMPL.getTempFileName()) + .humpClassName(classBean.getClassName()) + .classPackageName(classBean.getPackageName()) + .build(); + + writeFileService.writeContent(writeContentBean2); + } + } + + /** * 写枚举 * @param enumBeanList @@ -382,13 +407,7 @@ public class WriteDynamicDDDModuleService { public void writeEnum(List enumBeanList, IWriteFileService writeFileService,String dddTag){ //写枚举 for (EnumBean enumBean : enumBeanList){ - Map varMap = new HashMap<>(); - varMap.put("class",enumBean); - varMap.put("fields",enumBean.getFieldBeanList()); - varMap.put("methods",enumBean.getMethodBeanList()); - varMap.put("enums",enumBean.getEnumValueList()); - varMap.put("methods",enumBean.getMethodBeanList()); - varMap.put("bodys",enumBean.getConstructMethodBodyList()); + Map varMap = enumBean.buildVarMap(); String enumContent; if(StringUtils.isNotEmpty(dddTag)){ enumContent = freemarkerService.parseTplDynamicDDD(TemplateFileEnum.ENUM.getTempFileName(), varMap); @@ -412,11 +431,7 @@ public class WriteDynamicDDDModuleService { public void writeFactory(List domainFactoryBeanList, IWriteFileService writeFileService,String dddTag){ //写factory for (ClassBean classBean : domainFactoryBeanList){ - Map varMap = new HashMap<>(); - varMap.put("class",classBean); - varMap.put("fields",classBean.getFieldBeanList()); - varMap.put("methods",classBean.getMethodBeanList()); - varMap.put("imports",classBean.getImportClassList()); + Map varMap = classBean.buildVarMap(); String boContent; if(StringUtils.isNotEmpty(dddTag)){ boContent = freemarkerService.parseTplDynamicDDD(TemplateFileEnum.FACTORY.getTempFileName(), varMap); @@ -435,16 +450,119 @@ public class WriteDynamicDDDModuleService { /** - * 写接口和实现 + * 写app.listener + * @param appListenerBeanList + * @param writeFileService + */ + public void writeAppListner(List appListenerBeanList, IWriteFileService writeFileService,String dddTag){ + //写app.listener + for (ClassBean classBean : appListenerBeanList){ + Map varMap = classBean.buildVarMap(); + + String boContent; + if(StringUtils.isNotEmpty(dddTag)){ + boContent = freemarkerService.parseTplDynamicDDD(TemplateFileEnum.MQ_LISTENER.getTempFileName(), varMap); + }else { + boContent = freemarkerService.parseTpl(TemplateFileEnum.MQ_LISTENER.getTempFileName(), varMap); + } + + WriteContentBean writeContentBean = WriteContentBean.builder().content(boContent) + .templateName(TemplateFileEnum.MQ_LISTENER.getTempFileName()) + .humpClassName(classBean.getClassName()) + .classPackageName(classBean.getPackageName()) + .build(); + writeFileService.writeContent(writeContentBean); + } + } + + + /** + * 写infrast.mq.producer + * @param appListenerBeanList + * @param writeFileService + */ + public void writeMqProducer(List appListenerBeanList, IWriteFileService writeFileService,String dddTag){ + //写infrast.mq.producer + for (ClassBean classBean : appListenerBeanList){ + Map varMap = classBean.buildVarMap(); + + String boContent; + if(StringUtils.isNotEmpty(dddTag)){ + boContent = freemarkerService.parseTplDynamicDDD(TemplateFileEnum.MQ_PRODUCER.getTempFileName(), varMap); + }else { + boContent = freemarkerService.parseTpl(TemplateFileEnum.MQ_PRODUCER.getTempFileName(), varMap); + } + + WriteContentBean writeContentBean = WriteContentBean.builder().content(boContent) + .templateName(TemplateFileEnum.MQ_PRODUCER.getTempFileName()) + .humpClassName(classBean.getClassName()) + .classPackageName(classBean.getPackageName()) + .build(); + writeFileService.writeContent(writeContentBean); + } + } + + /** + * 写infrast.mq.consumer + * @param appListenerBeanList + * @param writeFileService + */ + public void writeMqConsumer(List appListenerBeanList, IWriteFileService writeFileService,String dddTag){ + //写infrast.mq.consumer + for (ClassBean classBean : appListenerBeanList){ + Map varMap = classBean.buildVarMap(); + + String boContent; + if(StringUtils.isNotEmpty(dddTag)){ + boContent = freemarkerService.parseTplDynamicDDD(TemplateFileEnum.MQ_CONSUMER.getTempFileName(), varMap); + }else { + boContent = freemarkerService.parseTpl(TemplateFileEnum.MQ_CONSUMER.getTempFileName(), varMap); + } + + WriteContentBean writeContentBean = WriteContentBean.builder().content(boContent) + .templateName(TemplateFileEnum.MQ_CONSUMER.getTempFileName()) + .humpClassName(classBean.getClassName()) + .classPackageName(classBean.getPackageName()) + .build(); + writeFileService.writeContent(writeContentBean); + } + } + + /** + * 写infrast.mq.handler + * @param appListenerBeanList + * @param writeFileService + */ + public void writeMqHandler(List appListenerBeanList, IWriteFileService writeFileService,String dddTag){ + //写infrast.mq.handler + for (ClassBean classBean : appListenerBeanList){ + Map varMap = classBean.buildVarMap(); + String boContent; + if(StringUtils.isNotEmpty(dddTag)){ + boContent = freemarkerService.parseTplDynamicDDD(TemplateFileEnum.MQ_HANDLER.getTempFileName(), varMap); + }else { + boContent = freemarkerService.parseTpl(TemplateFileEnum.MQ_HANDLER.getTempFileName(), varMap); + } + + WriteContentBean writeContentBean = WriteContentBean.builder().content(boContent) + .templateName(TemplateFileEnum.MQ_HANDLER.getTempFileName()) + .humpClassName(classBean.getClassName()) + .classPackageName(classBean.getPackageName()) + .build(); + writeFileService.writeContent(writeContentBean); + } + } + + + /** + * 写infrastacl接口 * @param aclInterfaceBeanList * @param writeFileService */ - public void writeAclInterfaceAndImpl(List aclInterfaceBeanList, IWriteFileService writeFileService,String dddTag){ + public void writeAclInterface(List aclInterfaceBeanList, IWriteFileService writeFileService,String dddTag){ for (InterfaceBean interfaceBean : aclInterfaceBeanList){ - Map varMap = new HashMap<>(); - varMap.put("class",interfaceBean); - varMap.put("methods",interfaceBean.getMethodBeanList()); - varMap.put("imports",interfaceBean.getImportClassList()); + Map varMap = interfaceBean.buildVarMap(); + String interfaceContent; if(StringUtils.isNotEmpty(dddTag)){ interfaceContent = freemarkerService.parseTplDynamicDDD(TemplateFileEnum.ACL.getTempFileName(), varMap); @@ -458,27 +576,34 @@ public class WriteDynamicDDDModuleService { .classPackageName(interfaceBean.getPackageName()) .build(); writeFileService.writeContent(writeContentBean); + } + } - //写接口实现 + + /** + * 写infrastaclImpl + * @param infrastAclImplBeanList + * @param writeFileService + */ + public void writeAclInterfaceImpl(List infrastAclImplBeanList, IWriteFileService writeFileService,String dddTag){ + for (ClassBean classBean : infrastAclImplBeanList){ + Map varMap = classBean.buildVarMap(); String interfaceImplContent; if(StringUtils.isNotEmpty(dddTag)){ interfaceImplContent = freemarkerService.parseTplDynamicDDD(TemplateFileEnum.GATAWAY_IMPL.getTempFileName(), varMap); }else { interfaceImplContent = freemarkerService.parseTpl(TemplateFileEnum.GATAWAY_IMPL.getTempFileName(), varMap); } - - WriteContentBean writeImplBean = WriteContentBean.builder() .content(interfaceImplContent) .templateName(TemplateFileEnum.ACL_IMPL.getTempFileName()) - .humpClassName(interfaceBean.getClassName()) - .classPackageName(interfaceBean.getPackageName()) + .humpClassName(classBean.getClassName()) + .classPackageName(classBean.getPackageName()) .build(); writeFileService.writeContent(writeImplBean); } } - /** * 写acl.param * @param classBeanList @@ -515,11 +640,7 @@ public class WriteDynamicDDDModuleService { public void writeAppCommand(List classBeanList, IWriteFileService writeFileService,String dddTag){ for (ClassBean classBean : classBeanList){ - Map varMap = new HashMap<>(); - varMap.put("class",classBean); - varMap.put("fields",classBean.getFieldBeanList()); - varMap.put("methods",classBean.getMethodBeanList()); - varMap.put("imports",classBean.getImportClassList()); + Map varMap = classBean.buildVarMap(); //使用BO的模板 String boContent; if(StringUtils.isNotEmpty(dddTag)){ @@ -546,12 +667,7 @@ public class WriteDynamicDDDModuleService { public void writeAppExeImpl(List classBeanList, IWriteFileService writeFileService,String dddTag){ for (ClassBean classBean : classBeanList){ - Map varMap = new HashMap<>(); - varMap.put("class",classBean); - varMap.put("fields",classBean.getFieldBeanList()); - varMap.put("methods",classBean.getMethodBeanList()); - varMap.put("imports",classBean.getImportClassList()); - + Map varMap = classBean.buildVarMap(); String boContent; if(StringUtils.isNotEmpty(dddTag)){ boContent = freemarkerService.parseTplDynamicDDD(TemplateFileEnum.EXE_IMPL.getTempFileName(), varMap); @@ -582,11 +698,7 @@ public class WriteDynamicDDDModuleService { */ public void writeAppExeInterface(List interfaceBeanList, IWriteFileService writeFileService,String dddTag){ for (InterfaceBean interfaceBean : interfaceBeanList){ - Map varMap = new HashMap<>(); - varMap.put("class",interfaceBean); - varMap.put("methods",interfaceBean.getMethodBeanList()); - varMap.put("imports",interfaceBean.getImportClassList()); - + Map varMap = interfaceBean.buildVarMap(); //借用gataway的模板 String interfaceContent; if(StringUtils.isNotEmpty(dddTag)){ @@ -613,11 +725,7 @@ public class WriteDynamicDDDModuleService { */ public void writeDtoBOConvert(List interfaceBeanList, IWriteFileService writeFileService){ for (InterfaceBean interfaceBean : interfaceBeanList){ - Map varMap = new HashMap<>(); - varMap.put("class",interfaceBean); - varMap.put("methods",interfaceBean.getMethodBeanList()); - varMap.put("imports",interfaceBean.getImportClassList()); - + Map varMap = interfaceBean.buildVarMap(); String interfaceContent = freemarkerService.parseTpl(TemplateFileEnum.CONVERT.getTempFileName(), varMap); WriteContentBean writeContentBean = WriteContentBean.builder().content(interfaceContent) .templateName(TemplateFileEnum.CONVERT.getTempFileName()) @@ -636,11 +744,7 @@ public class WriteDynamicDDDModuleService { */ public void writeVoBOConvert(List interfaceBeanList, IWriteFileService writeFileService){ for (InterfaceBean interfaceBean : interfaceBeanList){ - Map varMap = new HashMap<>(); - varMap.put("class",interfaceBean); - varMap.put("methods",interfaceBean.getMethodBeanList()); - varMap.put("imports",interfaceBean.getImportClassList()); - + Map varMap = interfaceBean.buildVarMap(); String interfaceContent = freemarkerService.parseTpl(TemplateFileEnum.CONVERT.getTempFileName(), varMap); WriteContentBean writeContentBean = WriteContentBean.builder().content(interfaceContent) .templateName(TemplateFileEnum.CONVERT.getTempFileName()) @@ -660,11 +764,7 @@ public class WriteDynamicDDDModuleService { */ public void writeDoBOConvert(List interfaceBeanList, IWriteFileService writeFileService){ for (InterfaceBean interfaceBean : interfaceBeanList){ - Map varMap = new HashMap<>(); - varMap.put("class",interfaceBean); - varMap.put("methods",interfaceBean.getMethodBeanList()); - varMap.put("imports",interfaceBean.getImportClassList()); - + Map varMap = interfaceBean.buildVarMap(); String interfaceContent = freemarkerService.parseTpl(TemplateFileEnum.CONVERT.getTempFileName(), varMap); WriteContentBean writeContentBean = WriteContentBean.builder().content(interfaceContent) .templateName(TemplateFileEnum.CONVERT.getTempFileName()) diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/AppHttpInvokeHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/AppHttpInvokeHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..1e22fe31b30f87a55c41a52471c8d954715883c1 --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/AppHttpInvokeHandler.java @@ -0,0 +1,132 @@ +package com.coderman.codemaker.service.invoker; + +import com.coderman.codemaker.bean.invoke.InvokeContextBean; +import com.coderman.codemaker.bean.plantuml.ClassBean; +import com.coderman.codemaker.bean.plantuml.InterfaceBean; +import com.coderman.codemaker.bean.plantuml.MethodBean; +import com.coderman.codemaker.enums.dynamic.InvokeLayerTypeEnum; +import com.coderman.codemaker.enums.dynamic.ReadWriteTypeEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.Optional; + +/** + * Description: 应用层app_http调用方 方法绘制处理器 + * date: 2021/10/21 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "appHttpInvokeHandler") +public class AppHttpInvokeHandler implements InvokeHandler { + @Autowired + private ConvertInvokeHandler convertInvokeHandler; + + @Override + public void dealInvoke(InvokeContextBean invokeBean) { + + //写场景,对调用方的方法参数vo->bo + if(invokeBean.getMethodRWType().equals(ReadWriteTypeEnum.WRITE.getCode())){ + + InterfaceBean bovoConvertInterfaceBean = convertInvokeHandler.getBOVOConvert(invokeBean); + if(bovoConvertInterfaceBean == null){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + + return; + } + + MethodBean convertMethod = convertInvokeHandler.getBO2VOConvertMethod(bovoConvertInterfaceBean,invokeBean.getMethodBean(),"vo2bo("); + if(convertMethod == null){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + + return; + } + + String [] paramArr = invokeBean.getMethodBean().getParamArr(); + String convertParamType = convertMethod.getParamArr()[0]; + String convertParamStr = "null"; + for (String param : paramArr){ + String paramClassType = param.trim().split(" ")[0]; + String convertClassType = convertParamType.trim().split(" ")[0]; + if(paramClassType.equals(convertClassType)){ + convertParamStr = param.trim().split(" ")[1]; + } + } + String returnClassName = convertMethod.getReturnClass(); + String invokeRow = returnClassName +" " + + returnClassName.substring(0,1).toLowerCase() + + returnClassName.substring(1) + + " = " + bovoConvertInterfaceBean.getClassName() + ".INSTANCE."+convertMethod.getSimplMethodName()+"("+convertParamStr+")"; + Optional oldRow = invokeBean.getMethodBean().getInvokeMethodList().stream().filter(str->str.equals(invokeRow)).findFirst(); + if(oldRow.isPresent()){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + return; + } + invokeBean.getMethodBean().getInvokeMethodList().add(invokeRow); + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + + //需要引用convert接口的时候注册引用包 + if(CollectionUtils.isEmpty(invokeBean.getInvokerClassBean().getDynamicImportPackageList())){ + invokeBean.getInvokerClassBean().setDynamicImportPackageList(new ArrayList<>()); + } + + + ClassBean returnClassBean = invokeBean.getPlantUmlContextBean().getClassBeanMap().get(returnClassName); + if(returnClassBean == null){ + returnClassBean = invokeBean.getPlantUmlContextBean().getDerivedPlantUmlContextBean().getClassBeanMap().get(returnClassName); + } + if(returnClassBean != null){ + invokeBean.getInvokerClassBean().getDynamicImportPackageList().add(returnClassBean.getPackageName()+"."+returnClassBean.getClassName()); + } + invokeBean.getInvokerClassBean().getDynamicImportPackageList().add(bovoConvertInterfaceBean.getPackageName()+"."+bovoConvertInterfaceBean.getClassName()); + } + + //读场景,对被调用方的返回值bo->vo + else if(invokeBean.getMethodRWType().equals(ReadWriteTypeEnum.READ.getCode())){ + InterfaceBean bodtoConvertInterfaceBean = convertInvokeHandler.getBOVOConvert(invokeBean); + if(bodtoConvertInterfaceBean == null){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + return; + } + MethodBean convertMethod = convertInvokeHandler.getBO2VOConvertMethod(bodtoConvertInterfaceBean,invokeBean.getMethodBean(),"bo2vo("); + if(convertMethod == null){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + return; + } + + String [] paramArr = invokeBean.getMethodBean().getParamArr(); + String convertParamType = convertMethod.getParamArr()[0]; + String convertParamStr = "null"; + for (String param : paramArr){ + if(param.startsWith(convertParamType)){ + convertParamStr = param.trim().split(" ")[1]; + } + } + String returnClassName = convertMethod.getReturnClass(); + String invokeRow = returnClassName +" " + + returnClassName.substring(0,1).toLowerCase() + + returnClassName.substring(1) + + " = " + bodtoConvertInterfaceBean.getClassName() + ".INSTANCE."+convertMethod.getSimplMethodName()+"("+convertParamStr+")"; + Optional oldRow = invokeBean.getMethodBean().getInvokeMethodList().stream().filter(str->str.equals(invokeRow)).findFirst(); + if(oldRow.isPresent()){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + return; + } + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + invokeBean.getMethodBean().getInvokeMethodList().add(invokeRow); + //需要引用convert接口的时候注册引用包 + if(CollectionUtils.isEmpty(invokeBean.getInvokerClassBean().getDynamicImportPackageList())){ + invokeBean.getInvokerClassBean().setDynamicImportPackageList(new ArrayList<>()); + } + invokeBean.getInvokerClassBean().getDynamicImportPackageList().add(bodtoConvertInterfaceBean.getPackageName()+"."+bodtoConvertInterfaceBean.getClassName()); + } + else { + invokeBean.getMethodBean().getInvokeMethodList().add(invokeBean.getCurrentInvokeRowContent()); + } + + } +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/AppRpcInvokeHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/AppRpcInvokeHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..b52df7ce496e8508411d2897b959eb13677d11ff --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/AppRpcInvokeHandler.java @@ -0,0 +1,121 @@ +package com.coderman.codemaker.service.invoker; + +import com.coderman.codemaker.bean.invoke.InvokeContextBean; +import com.coderman.codemaker.bean.plantuml.InterfaceBean; +import com.coderman.codemaker.bean.plantuml.MethodBean; +import com.coderman.codemaker.enums.dynamic.ReadWriteTypeEnum; +import org.assertj.core.util.Lists; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +/** + * Description:应用层app_rpc调用方 方法绘制处理器 + * date: 2021/10/21 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "appRpcInvokeHandler") +public class AppRpcInvokeHandler implements InvokeHandler{ + @Autowired + private ConvertInvokeHandler convertInvokeHandler; + + @Override + public void dealInvoke(InvokeContextBean invokeBean) { + //写场景,对调用方的方法参数dto->bo + if(invokeBean.getMethodRWType().equals(ReadWriteTypeEnum.WRITE.getCode())){ + InterfaceBean bodtoConvertInterfaceBean = invokeBean.getPlantUmlContextBean().getDerivedPlantUmlContextBean().getInterfaceBeanMap().get(invokeBean.getInvokerClassBean().getBodtoConvertInterface()); + if(bodtoConvertInterfaceBean == null){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + return; + } + + MethodBean convertMethod = convertInvokeHandler.getConvertMethod(bodtoConvertInterfaceBean,invokeBean,"dto2bo("); + if(convertMethod == null){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + return; + } + + String [] paramArr = invokeBean.getMethodBean().getParamArr(); + String convertParamType = convertMethod.getParamArr()[0]; + String convertParamStr = "null"; + for (String param : paramArr){ + if(param.startsWith(convertParamType)){ + convertParamStr = param.trim().split(" ")[1]; + } + } + + String returnClassName = convertMethod.getReturnClass(); + String invokeRow = returnClassName +" " + + returnClassName.substring(0,1).toLowerCase() + + returnClassName.substring(1) + + " = " + bodtoConvertInterfaceBean.getClassName() + ".INSTANCE.dto2bo("+convertParamStr+")"; + Optional oldRow = invokeBean.getMethodBean().getInvokeMethodList().stream().filter(str->str.equals(invokeRow)).findFirst(); + if(oldRow.isPresent()){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + return; + } + invokeBean.getMethodBean().getInvokeMethodList().add(invokeRow); + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + + //需要引用convert接口的时候注册引用包 + if(CollectionUtils.isEmpty(invokeBean.getInvokerClassBean().getDynamicImportPackageList())){ + invokeBean.getInvokerClassBean().setDynamicImportPackageList(new ArrayList<>()); + } + invokeBean.getInvokerClassBean().getDynamicImportPackageList().add(bodtoConvertInterfaceBean.getPackageName()+"."+bodtoConvertInterfaceBean.getClassName()); + + } + //读场景,对可能的被调用方的方法返回值进行bo->dto + else if(invokeBean.getMethodRWType().equals(ReadWriteTypeEnum.READ.getCode())){ + InterfaceBean bodtoConvertInterfaceBean = invokeBean.getPlantUmlContextBean().getDerivedPlantUmlContextBean().getInterfaceBeanMap().get(invokeBean.getInvokerClassBean().getBodtoConvertInterface()); + if(bodtoConvertInterfaceBean == null){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + return; + } + + MethodBean convertMethod = convertInvokeHandler.getConvertMethod(bodtoConvertInterfaceBean,invokeBean,"bo2dto("); + if(convertMethod == null){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + return; + } + + String [] paramArr = invokeBean.getMethodBean().getParamArr(); + String convertParamType = convertMethod.getParamArr()[0]; + String convertParamStr = "null"; + for (String param : paramArr){ + if(param.startsWith(convertParamType)){ + convertParamStr = param.trim().split(" ")[1]; + } + } + + String returnClassName = convertMethod.getReturnClass(); + String invokeRow = returnClassName +" " + + returnClassName.substring(0,1).toLowerCase() + + returnClassName.substring(1) + + " = " + bodtoConvertInterfaceBean.getClassName() + ".INSTANCE.bo2dto("+convertParamStr+")"; + Optional oldRow = invokeBean.getMethodBean().getInvokeMethodList().stream().filter(str->str.equals(invokeRow)).findFirst(); + if(oldRow.isPresent()){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + return; + } + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + invokeBean.getMethodBean().getInvokeMethodList().add(invokeRow); + + //需要引用convert接口的时候注册引用包 + if(CollectionUtils.isEmpty(invokeBean.getInvokerClassBean().getDynamicImportPackageList())){ + invokeBean.getInvokerClassBean().setDynamicImportPackageList(new ArrayList<>()); + } + invokeBean.getInvokerClassBean().getDynamicImportPackageList().add(bodtoConvertInterfaceBean.getPackageName()+"."+bodtoConvertInterfaceBean.getClassName()); + } + else { + invokeBean.getMethodBean().getInvokeMethodList().add(invokeBean.getCurrentInvokeRowContent()); + } + + } +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/ConvertInvokeHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/ConvertInvokeHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..de8a7423fd22c03653a7d4bb855997fa5240b6a1 --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/ConvertInvokeHandler.java @@ -0,0 +1,113 @@ +package com.coderman.codemaker.service.invoker; + +import com.coderman.codemaker.bean.plantuml.ClassBean; +import com.coderman.codemaker.bean.plantuml.InterfaceBean; +import com.coderman.codemaker.bean.invoke.InvokeContextBean; +import com.coderman.codemaker.bean.plantuml.MethodBean; +import com.coderman.codemaker.enums.dynamic.ReadWriteTypeEnum; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * Description: + * date: 2021/10/21 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class ConvertInvokeHandler { + + /** + * 获取bovoconvert 接口类 + * @param invokeBean + * @return + */ + public InterfaceBean getBOVOConvert(InvokeContextBean invokeBean){ + String returnClassType = invokeBean.getMethodBean().buildReturnClassType(); + ClassBean classBean = invokeBean.getPlantUmlContextBean().getClassBeanMap().get(returnClassType); + if(classBean == null){ + classBean = invokeBean.getPlantUmlContextBean().getDerivedPlantUmlContextBean().getClassBeanMap().get(returnClassType); + } + if(classBean == null){ + return null; + } + return invokeBean.getPlantUmlContextBean().getDerivedPlantUmlContextBean() + .getInterfaceBeanMap() + .get(classBean.getBovoConvertInterface()); + } + + /** + * 从转换接口中过滤符合转换条件参数的转换方法 + * @param convertInterfaceBean + * @param invokeBean + * @param methodTag + * @return + */ + public MethodBean getConvertMethod(InterfaceBean convertInterfaceBean, InvokeContextBean invokeBean,String methodTag){ + List methodBeanList = convertInterfaceBean.getMethodBeanList().stream().filter(methodBean -> methodBean.getMethodName().toLowerCase().startsWith(methodTag)).collect(Collectors.toList()); + if(invokeBean.getMethodRWType().equals(ReadWriteTypeEnum.READ.getCode()) && CollectionUtils.isNotEmpty(methodBeanList)){ + return methodBeanList.get(0); + } + String [] invokerParamArr = invokeBean.getMethodBean().getParamArr(); + + for (MethodBean methodBean : methodBeanList){ + String [] providerConvertParamArr = methodBean.getParamArr(); + for (int i = 0;i < providerConvertParamArr.length;i ++ ){ + for (int j = 0;j< invokerParamArr.length;j ++){ + String providerConvertParamType = providerConvertParamArr[i].trim().split(" ")[0]; + String invokerParamType = invokerParamArr[j].trim().split(" ")[0]; + if(invokerParamType.equals(providerConvertParamType)){ + return methodBean; + } + } + } + } + return null; + } + + + /** + * 从转换接口中过滤符合转换条件参数的转换方法 + * @param convertInterfaceBean + * @param invokerMethodBean + * @param methodTag + * @return + */ + public MethodBean getBO2VOConvertMethod(InterfaceBean convertInterfaceBean, MethodBean invokerMethodBean,String methodTag){ + List methodBeanList = convertInterfaceBean.getMethodBeanList().stream().filter(methodBean -> methodBean.getMethodName().toLowerCase().startsWith(methodTag)).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(methodBeanList)){ + return methodBeanList.get(0); + } + return null; + } + /** + * 从调用方的方法名称中扣出BO类 className + * 并且找到bodoConvert类 + * @param invokeBean + * @return + */ + public InterfaceBean getBODOConvertInterfaceBean(InvokeContextBean invokeBean){ + String paramContent = invokeBean.getMethodBean().getMethodName().split("\\(")[1].replace(")",""); + String [] paramArr = paramContent.split(","); + for (String param : paramArr){ + String [] arr = param.trim().split(" "); + if(!arr[0].toLowerCase().endsWith("bo")){ + continue; + } + ClassBean boClassBeanElement = invokeBean.getPlantUmlContextBean().getClassBeanMap().get(arr[0]); + if(StringUtils.isEmpty(boClassBeanElement.getBodoConvertInterface())){ + continue; + } + return invokeBean.getPlantUmlContextBean().getDerivedPlantUmlContextBean().getInterfaceBeanMap().get(boClassBeanElement.getBodoConvertInterface()); + } + return null; + } + + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/DomainInvokeHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/DomainInvokeHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..14348ca8004e82d6534573091bbb35b97617f5ad --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/DomainInvokeHandler.java @@ -0,0 +1,164 @@ +package com.coderman.codemaker.service.invoker; + +import com.coderman.codemaker.bean.invoke.InvokeContextBean; +import com.coderman.codemaker.bean.plantuml.ClassBean; +import com.coderman.codemaker.bean.plantuml.InterfaceBean; +import com.coderman.codemaker.bean.plantuml.MethodBean; +import com.coderman.codemaker.enums.dynamic.InvokeSceneTypeEnum; +import com.coderman.codemaker.enums.dynamic.ReadWriteTypeEnum; +import org.apache.commons.lang3.StringUtils; +import org.assertj.core.util.Lists; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +/** + * Description:领域层调用方 方法绘制处理器 + * date: 2021/10/21 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "domainInvokeHandler") +public class DomainInvokeHandler implements InvokeHandler{ + @Autowired + private ConvertInvokeHandler convertInvokeHandler; + + + @Override + public void dealInvoke(InvokeContextBean invokeBean) { + /** + * 如果读写场景为空的话,就重新根据被调用方的方法读写情况判断整体的读写情况 + * 这里可能产生一定的误差: + * 由于调用方的方法判断读写情况不准确,只能根据被调用方的方法判断,如果都判断不出来则不进行convert转换接口绘制 + */ + if(invokeBean.getInvokeSceneType() + .equals(InvokeSceneTypeEnum.DOMAIN_TO_INFRAST.getCode()) && StringUtils.isEmpty(invokeBean.getMethodRWType())){ + String rwType = ReadWriteTypeEnum.getCodeByMethod(invokeBean.getProviderClassMethod()); + invokeBean.setMethodRWType(rwType); + } + + //写场景 + if(invokeBean.getMethodRWType().equals(ReadWriteTypeEnum.WRITE.getCode())){ + InterfaceBean doboConvertInterfaceBean = convertInvokeHandler.getBODOConvertInterfaceBean(invokeBean); + if(doboConvertInterfaceBean == null){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + return; + } + + Optional convertMethod = doboConvertInterfaceBean.getMethodBeanList().stream().filter(methodBean -> methodBean.getMethodName().startsWith("bo2do(")).findFirst(); + if(!convertMethod.isPresent()){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + + return; + } + + String paramContent = invokeBean.getMethodBean().getMethodName().split("\\(")[1].replace(")",""); + String [] paramArr = paramContent.split(","); + String convertParam = convertMethod.get().getMethodName().split("\\(")[1].replace(")","").trim(); + String convertClassName = convertParam.split(" ")[0]; + String convertParamStr = "null"; + for (String param : paramArr){ + if(param.startsWith(convertClassName)){ + convertParamStr = param.trim().split(" ")[1]; + } + } + + String returnClassName = convertMethod.get().getReturnClass(); + String invokeRow = returnClassName +" " + + returnClassName.substring(0,1).toLowerCase() + + returnClassName.substring(1) + + " = " + doboConvertInterfaceBean.getClassName() + ".INSTANCE.bo2do("+convertParamStr+")"; + Optional oldRow = invokeBean.getMethodBean().getInvokeMethodList().stream().filter(str->str.equals(invokeRow)).findFirst(); + if(oldRow.isPresent()){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + return; + } + + invokeBean.getMethodBean().getInvokeMethodList().add(invokeRow); + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + + if(CollectionUtils.isEmpty(invokeBean.getInvokerClassBean().getDynamicImportPackageList())){ + invokeBean.getInvokerClassBean().setDynamicImportPackageList(new ArrayList<>()); + } + invokeBean.getInvokerClassBean().getDynamicImportPackageList().add(doboConvertInterfaceBean.getPackageName()+"."+doboConvertInterfaceBean.getClassName()); + + String providerMethodReturnClassName = convertMethod.get().getReturnClass(); + ClassBean returnClassBean = invokeBean.getPlantUmlContextBean().getClassBeanMap().get(providerMethodReturnClassName); + if(returnClassBean == null){ + returnClassBean = invokeBean.getPlantUmlContextBean().getDerivedPlantUmlContextBean().getClassBeanMap().get(providerMethodReturnClassName); + } + if(returnClassBean == null){ + return; + } + invokeBean.getInvokerClassBean().getDynamicImportPackageList().add(returnClassBean.getPackageName()+"."+returnClassBean.getClassName()); + } + + + //读场景 + else if(invokeBean.getMethodRWType().equals(ReadWriteTypeEnum.READ.getCode())){ + InterfaceBean doboConvertInterfaceBean = convertInvokeHandler.getBODOConvertInterfaceBean(invokeBean); + if(doboConvertInterfaceBean == null){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + + return; + } + + Optional convertMethod = doboConvertInterfaceBean.getMethodBeanList().stream().filter(methodBean -> methodBean.getMethodName().startsWith("bo2do(")).findFirst(); + if(!convertMethod.isPresent()){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + + return; + } + + String paramContent = invokeBean.getMethodBean().getMethodName().split("\\(")[1].replace(")",""); + String [] paramArr = paramContent.split(","); + String convertParam = convertMethod.get().getMethodName().split("\\(")[1].replace(")","").trim(); + String convertClassName = convertParam.split(" ")[0]; + String convertParamStr = "null"; + for (String param : paramArr){ + if(param.startsWith(convertClassName)){ + convertParamStr = param.trim().split(" ")[1]; + } + } + + String returnClassName = convertMethod.get().getReturnClass(); + String invokeRow = returnClassName +" " + + returnClassName.substring(0,1).toLowerCase() + + returnClassName.substring(1) + + " = " + doboConvertInterfaceBean.getClassName() + ".INSTANCE.bo2do("+convertParamStr+")"; + Optional oldRow = invokeBean.getMethodBean().getInvokeMethodList().stream().filter(str->str.equals(invokeRow)).findFirst(); + if(oldRow.isPresent()){ + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + + return; + } + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + invokeBean.getMethodBean().getInvokeMethodList().add(invokeRow); + + if(CollectionUtils.isEmpty(invokeBean.getInvokerClassBean().getDynamicImportPackageList())){ + invokeBean.getInvokerClassBean().setDynamicImportPackageList(new ArrayList<>()); + } + invokeBean.getInvokerClassBean().getDynamicImportPackageList().add(doboConvertInterfaceBean.getPackageName()+"."+doboConvertInterfaceBean.getClassName()); + + String providerMethodReturnClassName = convertMethod.get().getReturnClass(); + ClassBean returnClassBean = invokeBean.getPlantUmlContextBean().getClassBeanMap().get(providerMethodReturnClassName); + if(returnClassBean == null){ + returnClassBean = invokeBean.getPlantUmlContextBean().getDerivedPlantUmlContextBean().getClassBeanMap().get(providerMethodReturnClassName); + } + if(returnClassBean == null){ + return; + } + invokeBean.getInvokerClassBean().getDynamicImportPackageList().add(returnClassBean.getPackageName()+"."+returnClassBean.getClassName()); + } + else { + invokeBean.getMethodBean().getInvokeMethodList().add(invokeBean.getCurrentInvokeRowContent()); + } + + } +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/InfrastInvokeHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/InfrastInvokeHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..a2f50412208e3bf26d0bf13b81ab4d9a90ab83de --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/InfrastInvokeHandler.java @@ -0,0 +1,20 @@ +package com.coderman.codemaker.service.invoker; + +import com.coderman.codemaker.bean.invoke.InvokeContextBean; +import org.springframework.stereotype.Service; + +/** + * Description:基础设施层infrast调用方 方法绘制处理器 + * date: 2021/10/21 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service(value = "infrastInvokeHandler") +public class InfrastInvokeHandler implements InvokeHandler{ + @Override + public void dealInvoke(InvokeContextBean invokeBean) { + invokeBean.getMethodBean().addInvokeRowContent(invokeBean.getCurrentInvokeRowContent(),invokeBean.getCurrentInvokeRowBean()); + } +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/InvokeHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/InvokeHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..33825f32f9e983ad56fa8ba2ca9062ff9b37ca72 --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/InvokeHandler.java @@ -0,0 +1,24 @@ +package com.coderman.codemaker.service.invoker; + +import com.coderman.codemaker.bean.invoke.InvokeContextBean; + +/** + * Description: 动态方法调用绘制处理器入口 + * 主要处理convert和上下文等之间的代码生成关系分析等 + * date: 2021/10/21 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public interface InvokeHandler { + + + /** + * 调用方法绘制对于读写场景的方法处理整体入口 + * @param invokeBean + */ + void dealInvoke(InvokeContextBean invokeBean); + + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/MethodInvokeHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/MethodInvokeHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..e68f4c9ad359c1126b53a28128607d189a6a3b81 --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/MethodInvokeHandler.java @@ -0,0 +1,325 @@ +package com.coderman.codemaker.service.invoker; + +import com.coderman.codemaker.bean.invoke.InvokeContextBean; +import com.coderman.codemaker.bean.plantuml.*; +import com.coderman.codemaker.enums.TemplateFileEnum; +import com.coderman.codemaker.enums.VisibilityEnum; +import com.coderman.codemaker.enums.dynamic.InvokeLayerTypeEnum; +import com.coderman.codemaker.enums.dynamic.InvokeSceneTypeEnum; +import org.apache.commons.lang3.StringUtils; +import org.assertj.core.util.Lists; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +/** + * Description: + * date: 2021/10/16 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class MethodInvokeHandler { + + @Resource(name = "appRpcInvokeHandler") + private InvokeHandler appRpcInvokeHandler; + + @Resource(name = "appHttpInvokeHandler") + private InvokeHandler appHttpInvokeHandler; + + @Resource(name = "domainInvokeHandler") + private InvokeHandler domainInvokeHandler; + + @Resource(name = "infrastInvokeHandler") + private InvokeHandler infrastInvokeHandler; + + /** + * 处理方法调用内容 + * @param invokeBean + */ + public void dealInvokeContent(InvokeContextBean invokeBean){ + + if(!invokeBean.getMethodBean().getMethodName().toLowerCase().startsWith(invokeBean.getInvokerMethod())){ + return; + } + + String providerClassMethod = getProviderClassMethod(invokeBean); + String returnStr = invokeBean.getProviderClassMethodReturn(); + String invokeRowReturn = buildReturnBody(returnStr,invokeBean.getProviderClassMethod()); + if (StringUtils.isNotEmpty(invokeRowReturn)) { + invokeRowReturn = invokeRowReturn + invokeBean.getMethodBean().getInvokeMethodList().size()+" = "; + } + + String providerClassVar = invokeBean.getProviderClassName().substring(0,1).toLowerCase()+invokeBean.getProviderClassName().substring(1); + String invokeRowContent = invokeRowReturn + providerClassVar +"."+providerClassMethod; + invokeBean.buildCurrentInvokeRow(invokeRowContent); + //注册调用层,根据调用层间关系判断是否需要增加do,bo,vo之间的转换接口 + registConvertLayer(invokeBean); + + } + + + /** + * 动态绘制调用方法详情 + * @param invokeBean + * @return + */ + private String getProviderClassMethod(InvokeContextBean invokeBean){ + String providerClassMethod = invokeBean.getProviderClassMethod(); + String methodName = providerClassMethod.substring(0,providerClassMethod.indexOf("(")); + String params = providerClassMethod.substring(providerClassMethod.indexOf("(")+1).replace(")",""); + providerClassMethod = methodName+"("+getProviderClassMethodParamStr(invokeBean.getMethodBean(), params)+")"; + return providerClassMethod; + } + + /** + * 根据调用链路内容动态绘制方法参数 + * @param invokeMethod + * @param providerMethodParams + * @return + */ + private String getProviderClassMethodParamStr(MethodBean invokeMethod,String providerMethodParams){ + if(StringUtils.isEmpty(providerMethodParams)){ + return ""; + } + + //如果调用内容为空,则校验接口参数调用者与被调用者是否存在一致,存在则保持一致 + if(CollectionUtils.isEmpty(invokeMethod.getInvokeMethodList())){ + if(invokeMethod.getMethodName().contains("()")){ + return ""; + } + String [] invokerMethodParamArr = invokeMethod.getMethodName().replace(")","").split("\\(")[1].split(","); + String [] providerMethodParamArr = providerMethodParams.split(","); + StringBuilder paramBuilder = new StringBuilder(); + for (int i = 0;i < providerMethodParamArr.length;i++){ + String providerParamType = providerMethodParamArr[i].trim().split(" ")[0]; + String providerParamVar = providerMethodParamArr[i].trim().split(" ")[1]; + boolean find = false; + for (int j = 0;j < invokerMethodParamArr.length;j++){ + String invokerParamType = invokerMethodParamArr[j].trim().split(" ")[0]; + String invokerParamVar = invokerMethodParamArr[j].trim().split(" ")[1]; + if(providerParamType.equals(invokerParamType) && providerParamVar.equals(invokerParamVar)){ + find = true; + break; + } + } + if(find){ + paramBuilder.append(providerParamVar+", "); + }else { + paramBuilder.append("null, "); + } + } + if(paramBuilder.length() == 0 || StringUtils.isEmpty(paramBuilder.toString())){ + return ""; + } + return paramBuilder.substring(0,paramBuilder.length() - 2); + } + + + String [] paramArr = providerMethodParams.split(","); + StringBuilder paramBuilder = new StringBuilder(); + for (String param : paramArr){ + String paramType = param.trim().split(" ")[0]; + String paramVar = param.trim().split(" ")[1]; + boolean find = false; + for (String invokeContent : invokeMethod.getInvokeMethodList()){ + if(!invokeContent.contains(paramType)){ + continue; + } + find = true; + } + + if(find){ + paramBuilder.append(paramVar+", "); + }else { + paramBuilder.append("null, "); + } + } + + if(paramBuilder.length() == 0 || StringUtils.isEmpty(paramBuilder.toString())){ + return ""; + } + return paramBuilder.substring(0,paramBuilder.length() - 2); + } + + /** + * 构建调用方法返回体 + * @param returnStr + * @return + */ + private String buildReturnBody(String returnStr,String methodName){ + String invokeRowReturn = ""; + if(returnStr.contains("void")){ + return invokeRowReturn; + } + + if(returnStr.toLowerCase().contains("integer")){ + invokeRowReturn = "Integer integerVar"; + return invokeRowReturn; + } + + if(returnStr.toLowerCase().contains("int")){ + invokeRowReturn = "int intVar"; + return invokeRowReturn; + } + + + if(returnStr.toLowerCase().contains("short")){ + invokeRowReturn = "short shortVar"; + return invokeRowReturn; + } + + if(returnStr.toLowerCase().contains("String")){ + invokeRowReturn = "String strVar"; + return invokeRowReturn; + } + + + if(returnStr.toLowerCase().contains("boolean")){ + invokeRowReturn = "boolean booleanVar"; + return invokeRowReturn; + } + + + if(returnStr.contains("Long")){ + invokeRowReturn = "Long longVar"; + return invokeRowReturn; + } + + if(returnStr.contains("long")){ + invokeRowReturn = "long longVar"; + return invokeRowReturn; + } + + + if(!returnStr.contains("void")){ + String returnVar = returnStr.substring(0,1).toLowerCase()+returnStr.substring(1); + if(methodName.startsWith("get")){ + returnVar = returnVar+"Get"; + } + if(methodName.startsWith("search")){ + returnVar = returnVar+"Search"; + } + if(methodName.startsWith("find")){ + returnVar = returnVar+"Find"; + } + if(methodName.startsWith("load")){ + returnVar = returnVar+"Load"; + } + invokeRowReturn = returnStr + " " + returnVar; + } + + return invokeRowReturn; + } + + /** + * 注册被调用方作为调用方的属性 + * @param invokerClassBean + * @param providerClassBean + */ + public void registField(AbstractClassBean invokerClassBean,AbstractClassBean providerClassBean){ + String targetClassName = providerClassBean.getClassName(); + //注册被调用方的field + if(CollectionUtils.isEmpty(invokerClassBean.getFieldBeanList())){ + invokerClassBean.setFieldBeanList(Lists.newArrayList()); + } + FieldBean fieldBean = new FieldBean(); + fieldBean.setVisibility(VisibilityEnum.PRIVATE.getVisibility()); + fieldBean.setFieldName(targetClassName+ " " +targetClassName.substring(0,1).toLowerCase() + targetClassName.substring(1)); + Optional fieldBeanOptional = invokerClassBean.getFieldBeanList().stream().filter(fieldBean1 -> fieldBean1.getFieldName().toLowerCase().contains(targetClassName.toLowerCase())).findFirst(); + if(fieldBeanOptional.isPresent()){ + return; + } + invokerClassBean.getFieldBeanList().add(fieldBean); + if(org.apache.commons.collections4.CollectionUtils.isEmpty(invokerClassBean.getDynamicImportPackageList())){ + invokerClassBean.setDynamicImportPackageList(Lists.newArrayList()); + } + invokerClassBean.getDynamicImportPackageList().add(providerClassBean.getPackageName()+"."+targetClassName); + } + + /** + * 注册被调用方的方法返回值所属包作为调用方的引用包 + * @param invokerClassBean + * @param plantUmlContextBean + * @param importClassName + */ + public void registImportPackageByClass(AbstractClassBean invokerClassBean, PlantUmlContextBean plantUmlContextBean, String importClassName){ + importClassName = importClassName.trim(); + //处理bo 或者do + if(importClassName.trim().toLowerCase() + .endsWith(TemplateFileEnum.BUSINESS_OBJECT.getTempFileName()) + || importClassName.trim().toLowerCase() + .endsWith(TemplateFileEnum.DATA_OBJECT.getTempFileName())){ + ClassBean classBean = plantUmlContextBean.getClassBeanMap().get(importClassName); + if(classBean == null) { + return; + } + if(CollectionUtils.isEmpty(invokerClassBean.getDynamicImportPackageList())){ + invokerClassBean.setDynamicImportPackageList(Lists.newArrayList()); + } + invokerClassBean.getDynamicImportPackageList().add(classBean.getPackageName()+"."+classBean.getClassName()); + } + + + //处理vo 或者dto + if((importClassName.trim().toLowerCase().endsWith(TemplateFileEnum.DTO.getTempFileName()) + || importClassName.trim().toLowerCase().endsWith(TemplateFileEnum.VO.getTempFileName())) + && plantUmlContextBean.getDerivedPlantUmlContextBean() != null){ + ClassBean classBean = plantUmlContextBean.getDerivedPlantUmlContextBean().getClassBeanMap().get(importClassName); + if(classBean == null) { + return; + } + if(CollectionUtils.isEmpty(invokerClassBean.getDynamicImportPackageList())){ + invokerClassBean.setDynamicImportPackageList(Lists.newArrayList()); + } + invokerClassBean.getDynamicImportPackageList().add(classBean.getPackageName()+"."+classBean.getClassName()); + } + + + //处理convert + if(importClassName.trim().toLowerCase().endsWith(TemplateFileEnum.CONVERT.getTempFileName()) + && plantUmlContextBean.getDerivedPlantUmlContextBean() != null){ + InterfaceBean interfaceBean = plantUmlContextBean.getDerivedPlantUmlContextBean().getInterfaceBeanMap().get(importClassName); + if(interfaceBean == null) { + return; + } + if(CollectionUtils.isEmpty(invokerClassBean.getDynamicImportPackageList())){ + invokerClassBean.setDynamicImportPackageList(Lists.newArrayList()); + } + invokerClassBean.getDynamicImportPackageList().add(interfaceBean.getPackageName()+"."+interfaceBean.getClassName()); + } + } + + /** + * 根据场景动态判断是否需要调用转换层进行数据转换 + * @param invokeBean + */ + private void registConvertLayer(InvokeContextBean invokeBean){ + String invokeSceneType = invokeBean.getInvokeSceneType(); + //是应用层app_rpc作为调用方 + if(invokeSceneType.startsWith(InvokeLayerTypeEnum.APP_RPC.getCode()) + ||invokeSceneType.equals(InvokeSceneTypeEnum.APP_RPC_TO_SELF.getCode())){ + appRpcInvokeHandler.dealInvoke(invokeBean); + } + //是应用层app_http作为调用方 + else if(invokeSceneType.startsWith(InvokeLayerTypeEnum.APP_HTTP.getCode()) + ||invokeSceneType.equals(InvokeSceneTypeEnum.APP_HTTP_TO_SELF.getCode())){ + appHttpInvokeHandler.dealInvoke(invokeBean); + } + //是领域层domain作为调用方 + else if(invokeBean.getInvokeSceneType().startsWith(InvokeLayerTypeEnum.DOMAIN.getCode())) { + domainInvokeHandler.dealInvoke(invokeBean); + } + //是基础设施层infrast作为调用方 + else if(invokeBean.getInvokeSceneType().startsWith(InvokeLayerTypeEnum.INFRAST.getCode())) { + infrastInvokeHandler.dealInvoke(invokeBean); + } + } + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/ProviderInvokeHandler.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/ProviderInvokeHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..3de88a5e0e04b86c6782abf1b3d6da1fbcc79a1f --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/invoker/ProviderInvokeHandler.java @@ -0,0 +1,23 @@ +package com.coderman.codemaker.service.invoker; + +import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; +import org.springframework.stereotype.Service; + +/** + * Description: + * date: 2021/10/16 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +@Service +public class ProviderInvokeHandler { + public String buildProviderMethod(String providerContent, PlantUmlContextBean plantUmlContextBean){ + String className = providerContent.trim().split("\\.")[0]; + String method = providerContent.trim().split("\\.")[1]; + return null; + } + + +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/service/registry/DynamicDDDVarRegistry.java b/codemaker-core/src/main/java/com/coderman/codemaker/service/registry/DynamicDDDVarRegistry.java index bf77dc589d3f6f2a44462fe5d880ec3927c920d2..d15a173d6fb52583c40911e3361ff062e66635a9 100644 --- a/codemaker-core/src/main/java/com/coderman/codemaker/service/registry/DynamicDDDVarRegistry.java +++ b/codemaker-core/src/main/java/com/coderman/codemaker/service/registry/DynamicDDDVarRegistry.java @@ -1,10 +1,12 @@ package com.coderman.codemaker.service.registry; -import com.alibaba.fastjson.JSON; import com.coderman.codemaker.app.dynamicddd.DomainElementHandler; +import com.coderman.codemaker.app.dynamicddd.derivedhandler.DerivedInfrastAclImplElementHandler; import com.coderman.codemaker.bean.dddelement.*; +import com.coderman.codemaker.bean.dddelementderive.InfrastAclImplElementBean; import com.coderman.codemaker.bean.plantuml.PlantUmlContextBean; import com.coderman.codemaker.config.ProjectTemplateDynamicDDDConfig; +import com.coderman.codemaker.enums.DomainElementEnum; import com.coderman.codemaker.service.AbstractVarRegistry; import com.coderman.codemaker.service.ReadPlantUMLFileServiceV2; import org.springframework.beans.factory.annotation.Autowired; @@ -58,13 +60,33 @@ public class DynamicDDDVarRegistry extends AbstractVarRegistry { @Resource(name = "appExeElementHandler") private DomainElementHandler appExeElementHandler; + + @Resource(name = "derivedInfrastAclImplElementHandler") + private DerivedInfrastAclImplElementHandler derivedInfrastAclImplElementHandler; + + @Resource(name = "mqHandlerElementHandler") + private DomainElementHandler mqHandlerElementHandler; + + @Resource(name = "mqConsumerElementHandler") + private DomainElementHandler mqConsumerElementHandler; + + @Resource(name = "mqProducerElementHandler") + private DomainElementHandler mqProducerElementHandler; + + @Resource(name = "eventElementHandler") + private DomainElementHandler eventElementHandler; + + + + + + @Autowired private ProjectTemplateDynamicDDDConfig projectTemplateDynamicDDDConfig; @Override public Map getRegistVarMap() { PlantUmlContextBean plantUmlContextBean = readFileService.getPlantUmlContextBean(projectTemplateDynamicDDDConfig.getPlantumlFileName()); - System.out.println(JSON.toJSONString(plantUmlContextBean)); DomainBoElementBean domainBoElementBean = (DomainBoElementBean)domainElementHandler.getElementBeanList(plantUmlContextBean); ValueObjectElementBean valueObjectElementBean = (ValueObjectElementBean)valueObjectElementHandler.getElementBeanList(plantUmlContextBean); RepositoryElementBean repositoryElementBean = (RepositoryElementBean)repositoryElementHandler.getElementBeanList(plantUmlContextBean); @@ -74,6 +96,11 @@ public class DynamicDDDVarRegistry extends AbstractVarRegistry { InfrastAclElementBean infrastAclElementBean = (InfrastAclElementBean)infrastAclElementHandler.getElementBeanList(plantUmlContextBean); CommandElementBean commandElementBean = (CommandElementBean)appCmdElementHandler.getElementBeanList(plantUmlContextBean); ExecutorElementBean executorElementBean = (ExecutorElementBean)appExeElementHandler.getElementBeanList(plantUmlContextBean); + InfrastAclImplElementBean infrastAclImplElementBean = derivedInfrastAclImplElementHandler.getElementBeanList(plantUmlContextBean); + MqConsumerElementBean mqConsumerElementBean = (MqConsumerElementBean)mqConsumerElementHandler.getElementBeanList(plantUmlContextBean); + MqProducerElementBean mqProducerElementBean = (MqProducerElementBean)mqProducerElementHandler.getElementBeanList(plantUmlContextBean); + MqHandlerElementBean mqHandlerElementBean = (MqHandlerElementBean)mqHandlerElementHandler.getElementBeanList(plantUmlContextBean); + DomainEventElementBean domainEventElementBean = (DomainEventElementBean)eventElementHandler.getElementBeanList(plantUmlContextBean); Map map = new HashMap<>(); @@ -89,9 +116,11 @@ public class DynamicDDDVarRegistry extends AbstractVarRegistry { map.put("cmd",commandElementBean.getClassBeanList()); map.put("exeClass",executorElementBean.getClassBeanList()); map.put("exeInterface",executorElementBean.getInterfaceBeanList()); - - //由领域实体派生的类dto - //map.put("domainbo_dto",domainBoElementBean.getDerivedElementBean().getClassBeanList()); + map.put("infrastaclimpl",infrastAclImplElementBean.refreshClass(plantUmlContextBean, DomainElementEnum.ADAPTER_ACL_IMPL.getElement()).getClassBeanList()); + map.put("mqproducer",mqProducerElementBean.getClassBeanList()); + map.put("mqconsumer",mqConsumerElementBean.getClassBeanList()); + map.put("mqhandler",mqHandlerElementBean.getClassBeanList()); + map.put("domainevent",domainEventElementBean.getClassBeanList()); return map; } diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/utils/StringCheckUtils.java b/codemaker-core/src/main/java/com/coderman/codemaker/utils/StringCheckUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..410dfeee2059cb18bde6c1b60534579f62a6a72f --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/utils/StringCheckUtils.java @@ -0,0 +1,30 @@ +package com.coderman.codemaker.utils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Description: + * date: 2021/10/12 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class StringCheckUtils { + /** + * 判断字符串中是否包含中文 + * @param str + * 待校验字符串 + * @return 是否为中文 + * @warn 不能校验是否为中文标点符号 + */ + public static boolean isContainChinese(String str) { + Pattern p = Pattern.compile("[\u4e00-\u9fa5]"); + Matcher m = p.matcher(str); + if (m.find()) { + return true; + } + return false; + } +} diff --git a/codemaker-core/src/main/java/com/coderman/codemaker/utils/StringHelperUtils.java b/codemaker-core/src/main/java/com/coderman/codemaker/utils/StringHelperUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..809a64a4f88a1d72f37d2ae10dbfa6ef3cf5c2eb --- /dev/null +++ b/codemaker-core/src/main/java/com/coderman/codemaker/utils/StringHelperUtils.java @@ -0,0 +1,88 @@ +package com.coderman.codemaker.utils; + +import java.util.regex.Pattern; + +/** + * Description: + * date: 2021/10/21 + * + * @author fanchunshuai + * @version 1.0.0 + * @since JDK 1.8 + */ +public class StringHelperUtils { + + private static Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$"); + + + /** + * 根据表名获取对应类名 + * @param tableName + * @return + */ + public static String getClassDOName(String tableName){ + String humpTableName = getHumpTableName(tableName); + return getHumpClassName(humpTableName); + } + + /** + * 获取表名对应的类名 + * eg: user_info->UserInfo + * staff_education_info->StaffEducationInfo + * + * @param humpTableName + * @return + */ + public static String getHumpClassName(String humpTableName){ + String resultName = humpTableName.substring(0,1).toUpperCase().concat(humpTableName.substring(1)); + return resultName; + } + + /** + * 获取表名对应的变量名 + * eg: user_info->userInfo + * staff_education_info->staffEducationInfo + * + * @param tableName + * @return + */ + private static String getHumpTableName(String tableName){ + String resultName = ""; + + if(!tableName.contains("_")){ + resultName = tableName; + }else { + String[] tableNameArr = tableName.split("_"); + int length = tableNameArr.length; + StringBuilder builder = new StringBuilder(); + + if(isNum(tableNameArr[length - 1])){ + if(length == 2){ + resultName = tableNameArr[0]; + }else { + builder.append(tableNameArr[0]); + for (int i = 1;i < length - 1;i++){ + String tag = tableNameArr[i].substring(0,1).toUpperCase().concat(tableNameArr[i].substring(1)); + builder.append(tag); + } + resultName = builder.toString(); + } + }else { + builder.append(tableNameArr[0]); + for (int i = 1;i < length;i++){ + String tag = tableNameArr[i].substring(0,1).toUpperCase().concat(tableNameArr[i].substring(1)); + builder.append(tag); + } + resultName = builder.toString(); + } + + } + return resultName; + } + + + private static boolean isNum(String str){ + return pattern.matcher(str).matches(); + } + +} diff --git a/codemaker-core/src/main/resources/application.properties b/codemaker-core/src/main/resources/application.properties index e5d53fdf12f62d2612aeeeb9e1b7b9df059d7220..4ffaaae02169a16f5747f82662fa2cad9092363d 100644 --- a/codemaker-core/src/main/resources/application.properties +++ b/codemaker-core/src/main/resources/application.properties @@ -22,7 +22,7 @@ server.port=8099 #数据库配置 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.url=jdbc:mysql://localhost:3306/school_manager?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC +spring.datasource.url=jdbc:mysql://localhost:3306/infosys_auth?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root @@ -33,8 +33,8 @@ mybatis.mapper-locations=classpath:mapper/*.xml mybatis.type-aliases-package=com.coderman.codemaker.bean spring.application.name=codemaker #生成的应用类型,支持springboot,dubbo,cola -application.type=springboot +application.type=dubbo #目标应用根包名称 -application.global.package=com.snail.school.manager +application.global.package=com.coderman.infosys.auth #作者 application.global.author=fanchunshuai \ No newline at end of file diff --git a/codemaker-core/src/main/resources/ddd-plantuml/auth-domain.puml b/codemaker-core/src/main/resources/ddd-plantuml/auth-domain.puml new file mode 100644 index 0000000000000000000000000000000000000000..d00fc60700a34362fd1b43cf4344e5471e555837 --- /dev/null +++ b/codemaker-core/src/main/resources/ddd-plantuml/auth-domain.puml @@ -0,0 +1,498 @@ +@startuml + +package domain.enum{ + enum "权限类型-AuthorityTypeEnum" as AuthTypeEnum{ + DATA(1,"数据字段权限"), + FUNCATION(2,"菜单功能权限"), + ADMINISTRATION(3,"行政权限"), + CUSTOMIZE(4,"自定义权限"); + 权限类型code:Integer code + 权限类型描述:String desc + static AuthorityTypeEnum getByCode(Integer code) + .. extend info .. + toRpcClient:String yes + } + +} + +package domain.bo { + class "操作人信息-OperatorBO" as OperatorBO{ + +创建时间:Date dateCreate + +创建人:Long createUserId + } + + class "操作时间信息-OperateDateBO" as OperateDateBO{ + +修改时间:Date dateUpdate + +修改人:Long updateUserId + } + + class "数据操作信息-BasicOperateBO" as BasicOperateBO{ + +修改时间:Date dateUpdate + +创建时间:Date dateCreate + +修改人:Long updateUserId + +创建人:Long createUserId + } + class "用户组-UserGroupBO" as UserBO{ + 组名:String groupName + 组编码:String groupCode + 组内用户列表:List userList + 用户组状态:Integer status + 用户组对应的角色列表:List userList + 用户组对应角色组列表:List userList + .. extend info .. + tableKey:String user_group + facadeKey:String UserGroupFacade,UserGroupQueryFacade + controllerKey:String UserGroupController,UserGroupQueryController + dtoKeyList:String UpdateUserGroupRequestDTO,UserGroupResponseDTO,CreateUserGroupRequestDTO + voKeyList:String UserGroupPageVO,UserGroupVO + 获取用户组信息: ResultDataDto userGroupQueryFacade.getByGroupCode(String groupCode) + 创建用户组: ResultDataDto userGroupFacade.createUserGroup(CreateUserGroupRequestDTO createUserGroupRequestDTO) + 分页获取用户组信息/usergroup/pagelist: ResultDataDto userGroupQueryController.getPageList() + 创建用户组/usergroup/creategroup: ResultDataDto userGroupController.createUserGroup(UserGroupVO userGroupVO) + + } + + class "用户信息-UserBO" as UserBO{ + 用户名:String userName + 用户ID:Long userId + 用户对应角色列表:List userList + 用户对应角色组列表:List userList + + } + + class "角色-RoleBO" as RoleBO{ + 角色名称:String roleName + 角色编码:String roleCode + 角色对应用户列表:List userList + 角色状态:Integer status + .. extend info .. + tableKey:String role + facadeKey:String RoleFacade + controllerKey:String RoleController,RoleQueryController + dtoKeyList:String UpdateRoleRequestDTO,RoleResponseDTO + voKeyList:String RolePageVO + 获取角色详情: ResultDataDto getByRoleCode(String roleCode) + 分页获取用户组信息/role/pagelist: ResultDataDto getPageList() + } + + class "角色组-RoleGroupBO" as RoleGroupBO{ + 角色组名称:String roleName + 角色组编码:String roleCode + 组内角色列表:List roleList + 角色状态:Integer status + .. extend info .. + tableKey:String role_group + facadeKey:String RoleGroupFacade + controllerKey:String RoleGroupController + dtoKeyList:String UpdateRoleGroupRequestDTO,RoleGroupResponseDTO + voKeyList:String RoleGroupPageVO + 获取学生信息: ResultDataDto getByNumber(String number) + 分页获取用户组信息/role/pagelist: ResultDataDto getPageList() + } + + class "权限-AuthorityBO" as AuthorityBO{ + 权限编码标示:String authCode + 权限类型:Integer authorityType + 关联角色:String roleCode + 关联角色组:String roleGroupCode + 数据字段权限列表:List dataAuthorityBOList + 系统菜单权限列表:List systemAuthorityBOList + 行政权限列表:List adminAuthorityBOList + 权限状态:Integer status + .. extend info .. + invokeFileKey:String queryauthoritydata.puml + tableKey:String authority + facadeKey:String AuthorityFacade + controllerKey:String AuthorityOperationController,AuthorityQueryController + dtoKeyList:String UpdateAuthorityRequestDTO,AuthorityResponseDTO,CreateAuthorityRequestDTO + voKeyList:String AuthorityPageVO,AuthorityVO + 判断用户有没有访问某系统的权限: ResultDataDto checkUserSystemAuth(Long userId,String systemCode) + 根据用户和系统获取系统权限信息: ResultDataDto getUserSystemAuth(Long userId,String systemCode) + 根据权限code获取权限信息: ResultDataDto getByCode(String authCode) + 保存权限信息: ResultDataDto saveAuthority(CreateAuthorityRequestDTO createAuthorityRequestDTO) + 分页获取权限信息/authority/pagelist: ResultDataDto AuthorityQueryController.getPageList() + 获取权限信息/authority/getbycode: ResultDataDto AuthorityQueryController.getByCode(String authCode) + 给角色授权/authority/savetorole: ResultDataDto AuthorityOperationController.saveAuthority(AuthorityVO authorityVO) + + } + + class "权限更新请求实体-AuthorityUpdateRequestBO" as AuthorityUpdateRequestBO{ + 权限编码标示:String authCode + } + + + class "数据字段权限-DataAuthorityBO" as DataAuthorityBO { + 权限编码标示:String authCode + 数据字段ID:Long dataColumnId + .. extend info .. + tableKey:String data_authority + facadeKey:String DataAuthorityFacade + controllerKey:String DataAuthorityController + dtoKeyList:String UpdateDataAuthorityRequestDTO,DataAuthorityResponseDTO,CreateDataAuthorityRequestDTO + voKeyList:String DataAuthorityResponseVO + 获取权限信息: ResultDataDto getByCode(String authCode) + 保存权限信息: ResultDataDto saveAuthority(CreateDataAuthorityRequestDTO createDataAuthorityRequestDTO) + 获取权限信息/dataauthority/getbycode: ResultDataDto getByCode(String authCode) + } + + class "系统菜单权限-SystemAuthorityBO" as SystemAuthorityBO{ + 权限编码标示:String authCode + 业务数据系统标示:String systemName + 功能:String funcName + 菜单:String categoryName + 按钮:String menuName + .. extend info .. + tableKey:String system_authority + facadeKey:String SystemAuthorityFacade + controllerKey:String SystemAuthorityController + dtoKeyList:String UpdateSystemAuthorityRequestDTO,SystemAuthorityResponseDTO,CreateSystemAuthorityRequestDTO + voKeyList:String SystemAuthorityResponseVO + invokeFileKey:String queryauthoritydata.puml,queryauthoritydatahttp.puml,createauthoritydata.puml,createauthoritydatahttp.puml + 获取权限信息: ResultDataDto getByCode(String authCode) + 获取权限信息/systemauthority/getbycode: ResultDataDto getByCode(String authCode) + 分页获取权限信息/systemauthority/pagelist: ResultDataDto getPageList() + + } + + class "行政权限-AdminAuthorityBO" as AdminAuthorityBO { + 权限编码标示:String authCode + 组织部门:Long departmentId + 城市:Long cityId + 职位:Long jobId + + } + + class "系统设置-SystemConfig" as SystemConfig{ + 变量名:String varName + 变量描述:String varDesc + 变量值:String value + } + + class "系统管理-SystemBO" as SystemBO{ + 系统名称:String systemName + 系统标示:String systemCode + 系统域名:String systemUrl + 系统图标:String systemPicUrl + 系统技术负责人:Long tecAdminUserId + 系统业务负责人:Long busAdminUserId + 系统当前所在部门:Long departmentId + 系统模块列表:List moduleBOList + .. extend info .. + tableKey:String system + facadeKey:String SystemFacade + dtoKeyList:String SystemDTO + 注册系统: ResultDataDto registSystem(SystemDTO systemDTO) + } + class "菜单/模块管理-ModuleBO" as ModuleBO{ + 菜单名称:String moduleName + 菜单编码:String moduleCode + 菜单链接:String moduleUrl + 系统标示:String systemCode + 按钮列表:List menuBOList + .. extend info .. + tableKey:String module + facadeKey:String ModuleFacade + controllerKey:String ModuleController + dtoKeyList:String UpdateModuleRequestDTO,ModuleResponseDTO,CreateModuleRequestDTO + voKeyList:String ModuleResponseVO,ModulePageVO + 创建菜单信息/module/createmodule: ResultDataDto> getBySystemCode(CreateModuleRequestDTO createRequest) + 获取系统菜单列表信息/module/getbysystemcode: ResultDataDto> getBySystemCode(String systemCode) + 获取权限信息/module/getbycode: ResultDataDto getByCode(String authCode) + 分页获取权限信息/module/pagelist: ResultDataDto getPageList() + 导入菜单信息/module/import: ResultDataDto importModuleList(List createRequest) + 导出菜单信息/module/export: ResultDataDto exportModuleList(String systemCode) + + } + + class "按钮管理-MenuBO" as MenuBO{ + 按钮名称:String menuName + 按钮编码:String menuCode + 按钮链接:String menuUrl + 系统编码:String menuCode + 菜单编码:String moduleCode + .. extend info .. + tableKey:String menu + facadeKey:String MenuFacade + controllerKey:String MenuController + dtoKeyList:String UpdateMenuRequestDTO,MenuResponseDTO,CreateMenuRequestDTO + voKeyList:String MenuResponseVO,MenuPageVO + 修改按钮信息/menu/updatemenu: ResultDataDto updateMenu(UpdateMenuRequestDTO updateMenuRequestDTO) + 创建按钮信息/menu/createmenu: ResultDataDto createMenu(CreateMenuRequestDTO createMenuRequestDto) + 获取按钮详情信息/menu/getbycode: ResultDataDto getByCode(String menuCode) + 获取按钮列表信息/menu/pagelist: ResultDataDto> getPageList(String moduleCode ) + } + + class "数据字段实体-DataColumnBO" as DataColumnBO{ + 主键ID:Long id + 数据库业务系统名称:String busDataBase + 数据库表名称:String tableName + 数据库表描述:String tableDesc + 数据库字段名称:String columnName + 数据库字段描述:String columnDesc + 业务字段名称:String fieldName + .. extend info .. + tableKey:String data_column_config + controllerKey:String DataColumnController + voKeyList:String DataColumnResponseVO,DataColumnVO + 获取数据字段信息/datacolumn/getbycode: ResultDataDto getByBusDataBase(String busDataBase) + 分页获取数据字段信息/datacolumn/pagelist: ResultDataDto> getPageList() + 导入数据字段列表/datacolumn/import: ResultDataDto importDataColumnList(List updateMenuRequestDTO) + } + + + class "AuthAggregateBO-权限聚合根" as AuthAggregateBO{ + +系统权限:List systemBOList + +菜单权限:List moduleBOList + +按钮权限:List menuBOList + +城市权限:List cityIdList + +部门权限:List departmentIdList + +数据字段权限:List dataColumnBOList + } + + class "UserAuthAggregateBO-用户权限聚合根" as UserAuthAggregateBO{ + 用户ID:Long userId + } + + class "RoleAuthAggregateBO-角色权限聚合根" as RoleAuthAggregateBO{ + 角色ID:Long roleId + } + + AuthorityBO <|-- DataAuthorityBO + AdminAuthorityBO --|> AuthorityBO + SystemAuthorityBO --|> AuthorityBO + UserAuthAggregateBO --|> AuthAggregateBO + RoleAuthAggregateBO --|> AuthAggregateBO + +} + + +package domain.msgbody { + class "UserStatusChangeMsgBody-接收用户状态变更消息" as UserChangeMsgBody{ + 用户ID:Long userId + 状态类型:Integer statusType + } +} + +package domain.event{ + class "MenuChangeEvent-按钮信息变更事件" as MenuChangeEvent{ + 按钮code:String menuCode + 变更事件类型:Integer changeEventType + 按钮内容:MenuBO menuBO + } + class "RoleChangeEvent-角色变更事件" as RoleChangeEvent{ + 角色code:String roleCode + 变更事件类型:Integer changeEventType + 角色内容:RoleBO roleBO + } + class "RoleAuthChangeEvent-角色授权变更事件" as RoleAuthChangeEvent{ + 角色code:String roleCode + 权限code:String authCode + 变更事件类型:Integer changeEventType + 角色内容:RoleBO roleBO + } +} + + + +package domain.gataway { + interface "系统菜单按钮仓库服务-SystemModuleRepository" as SystemModuleRepository{ + 创建系统信息:Long saveSystem(SystemBO systemBO) + 更新系统信息:Integer updateSystem(SystemBO systemBO) + 创建菜单信息:Long saveModule(ModuleBO moduleBO) + 更新菜单信息:Integer updateModule(ModuleBO moduleBO) + 创建按钮信息:Long saveMenu(MenuBO moduleBO) + 更新按钮信息:Integer updateMenu(MenuBO moduleBO) + 根据code查询系统详情:SystemBO getSystemByCode(String systemCode) + 根据code查询菜单详情:ModuleBO getModule(String moduleCode) + 根据code查询按钮详情:MenuBO getMenu(String menuCode) + } + + interface "系统菜单按钮查询服务-SystemModuleQueryGataWay" as SystemModuleQueryGataWay{ + 分页查询系统列表:List querySystemPage() + 分页查询菜单列表:List queryModulePage() + 基于系统code查询菜单和按钮:SystemBO queryBySystemCode(String systemCode) + 查询所有系统菜单和按钮:List queryAll() + } + + + interface "权限管理仓库-AuthorityRepository" as AuthorityRepository{ + 给角色构建权限:Boolean buildAuthority(AuthorityBO authorityBO) + 给角色更新权限:Boolean updateAuthority(AuthorityUpdateRequestBO authorityUpdateRequestBO) + 根据权限code禁用权限资源:Boolean disableAuthority(String authorityCode) + 根据权限code查询权限资源:AuthorityBO getByCode(String authorityCode) + 根据角色code查询权限资源:AuthorityBO getByRoleCode(String roleCode) + } + + interface "数据字段管理网关-DataColumnGataWay" as DataColumnGataWay{ + 保存数据字段:Long saveDataColumn(DataColumnBO dataColumnBO) + 更新数据字段:Long updateDataColumn(DataColumnBO dataColumnBO) + 根据ID查询数据字段详情:DataColumnBO getById(Long id) + 分页查询数据字段内容:List getPageList() + } + + interface "用户和角色管理仓库-UserRoleRepository" as UserRoleRepository{ + 保存用户组并尝试关联用户:Long saveUserGroup(UserGroupBO userGroupBO) + 更新用户组:Integer updateUserGroup(UserGroupBO userGroupBO) + 保存角色组并尝试关联角色:Long saveRoleGroup(RoleGroupBO roleGroupBO) + 更新角色组:Integer updateRoleGroup(RoleGroupBO roleGroupBO) + 保存角色并尝试关联用户:Long saveRole(RoleBO roleBO) + 更新角色:Integer updateRole(RoleBO roleBO) + 根据code查询用户组详情:UserGroupBO getByUserGroupCode(String userGroupCode) + 根据code查询角色详情:RoleBO getByRoleCode(String roleCode) + 根据code查询角色组详情:RoleGroupBO getByRoleGroupCode(String roleGroupCode) + } + +} + + +package "领域工厂服务包-domain.factory" { + class "权限工厂服务-AuthorityFactory" as AuthorityFactory{ + +基于权限本身的维度-权限编码构建权限模型:AuthorityBO buildAuthorityByCode(String authorityCode) + +基于用户的维度构建权限模型:UserAuthAggregateBO buildAuthorityWithRoleCode(String roleCode) + } + + +} + +package "防腐层包-infrast.acl" as infrast.acl { + interface "部门查询服务适配器-DepartmentServiceAdapter" as DepartmentServiceAdapter{ + 查询所有有效的部门: List queryAllDepartment(DepartmentQueryDTO queryDto) + 查询子部门: List queryDepartmentsList(Long pId) + } + + interface "省份城市查询服务适配器-AreaServiceAdapter" as AreaServiceAdapter{ + 查询所有的省份: List queryAllProvince() + 查询省份下所有城市: List queryCityByProvinceid(Long provinceId) + } + +} + + +package app.command { + + class "抽象命令类-AbstractCmd" as AbstractCmd{ + +操作时间: Date operateTime + +操作人ID: Long userId + +命令类: Class commandClass + +命令数据: String payLoad; + + } + + class "增加用户组命令-AddUserGroupCmd" as AddUserGroupCmd{ + 组名:String groupName + 用户ID:Long userId + } + + class "增加用户命令-AddUserCmd" as AddUserCmd{ + 用户名:String userName + 用户ID:Long userId + 所属组织:Long departmentId + } + + class "增加用户权限-AddUserAuthCmd" as AddUserAuthCmd{ + 用户ID:Long userId + 角色ID:Long roleId + 权限类型:int authorityType + 权限数据内容:String json + } + + class "更新用户权限-UpdateUserAuthCmd" as UpdateUserAuthCmd{ + 用户ID:Long userId + 角色ID:Long roleId + 权限数据内容:String json + } + + class "更新角色权限-UpdateRoleAuthCmd" as UpdateRoleAuthCmd{ + 角色ID:Long roleId + 权限数据内容:String json + } + + class "对角色权限-AddRoleAuthCmd" as AddRoleAuthCmd{ + 角色ID:Long roleId + 权限数据内容:String json + } + + AddUserRoleCmd --|> AbstractCmd + AddUserGroupCmd --|> AbstractCmd + AddUserCmd --|> AbstractCmd + AddUserAuthCmd --|> AbstractCmd + UpdateUserAuthCmd --|> AbstractCmd + AddRoleAuthCmd --|> AbstractCmd + UpdateRoleAuthCmd --|> AbstractCmd + +} + + +package app.exe { + + interface "命令执行接口-CmdExeService" as CmdExeService{ + 命令执行入口:String exe(AbstractCmd abstractCmd) + } + + class "用户组cmd处理类-UserGroupCmdExe" as UserGroupCmdExe{ + + } + + class "用户cmd处理类-UserCmdExe" as UserCmdExe{ + + } + + class "用户权限cmd处理类-UserAuthCmdExe" as UserAuthCmdExe{ + + } + + + class "角色权限cmd处理类-RoleAuthCmdExe" as RoleAuthCmdExe{ + + } + + UserGroupCmdExe ..|> CmdExeService + UserCmdExe ..|> CmdExeService + UserAuthCmdExe ..|> CmdExeService + RoleAuthCmdExe ..|> CmdExeService + +} + + + +package "应用层事件监听器包支持域内消息和域外消息,在应用层处理消息-app.listener" as app.listener{ + class "权限变更监听器-AuthorityChangeListener" as AuthorityChangeListener{ + 事务提交后权限变更监听:void authorityCreate(String authCode) + 用户状态信息变更监听消费:void userStatusChange(Long userId) + } + + class "系统菜单按钮变更监听器-SystemChangeListener" as SystemChangeListener{ + 事务提交后权限变更监听:void systemChange(MenuChangeEvent event) + } +} + + + +package "基础设施层消息生产者-mq.producer" as mq.producer { + class "权限上下文消息生产者-AuthorityMqProducer" as AuthorityMqProducer{ + 权限创建:void authorityCreate(String authCode) + 权限更新:void authorityUpdate(String authCode) + } + + class "系统上下文消息生产者-SystemMqProducer" as SystemMqProducer{ + 事务提交后权限变更监听:void systemChange(MenuChangeEvent event) + } +} + +package "基础设施层消息消费者-mq.consumer" as mq.consumer { + class "用户上下文消息消费者或者监听-UserMqConsumer" as UserMqConsumer{ + 监听用户状态变更:void consumeUserStatusChange(String mqBody) + } + class "组织上下文消息消费者或者监听-DepartmentMqConsumer" as DepartmentMqConsumer{ + 监听组织状态变更:void consumeDepartmentStatusChange(String mqBody) + } +} + + +package "基础设施层消息消费处理器或者直接在基础设施层处理消息代码方案一-mq.handler" as mq.handler { + class "用户上下文消息处理器-UserMqHandler" as UserMqHandler{ + 处理用户状态变更的权限信息:void handleUserStatusChange(String mqBody) + } +} + +@enduml \ No newline at end of file diff --git a/codemaker-core/src/main/resources/invoke-plantuml/Demo.puml b/codemaker-core/src/main/resources/invoke-plantuml/Demo.puml new file mode 100644 index 0000000000000000000000000000000000000000..d0f7d7981d6c40a28d74ccab644035d708943d19 --- /dev/null +++ b/codemaker-core/src/main/resources/invoke-plantuml/Demo.puml @@ -0,0 +1,7 @@ +@startuml +Alice -> Bob: Authentication Request +Bob --> Alice: Authentication Response + +Alice -> Bob: Another authentication Request +Alice <-- Bob: another authentication Response +@enduml \ No newline at end of file diff --git a/codemaker-core/src/main/resources/invoke-plantuml/createauthoritydata.puml b/codemaker-core/src/main/resources/invoke-plantuml/createauthoritydata.puml new file mode 100644 index 0000000000000000000000000000000000000000..ccdf54c9a763683902d6ea02a558e2815b7bac01 --- /dev/null +++ b/codemaker-core/src/main/resources/invoke-plantuml/createauthoritydata.puml @@ -0,0 +1,17 @@ +@startuml + +participant 应用api层 as app +participant 领域层 as domain +participant 基础设施层 as infrast +group 系统上下文调用流程 +app --> app: 1.给某角色授权\n AuthorityFacade.saveAuthority invoke RoleAuthCmdExe.exe +app --> domain:2.转入命令层\n RoleAuthCmdExe.exe invoke AuthorityRepository.buildAuthority +domain --> infrast:3.准备保存角色授权数据\n AuthorityRepository.buildAuthority invoke AuthorityMapper.insert +domain --> infrast:4.保存系统权限数据\n AuthorityRepository.buildAuthority invoke SystemAuthorityMapper.insert +domain --> infrast:5.保存行政权限详情\n AuthorityRepository.buildAuthority invoke AdminAuthorityMapper.insert +domain --> infrast:6.保存数据权限详情\n AuthorityRepository.buildAuthority invoke DataAuthorityMapper.insert +app --> infrast:7.发送授权消息\n AuthorityFacade.saveAuthority invoke AuthorityMqProducer.authorityCreate + +end + +@enduml \ No newline at end of file diff --git a/codemaker-core/src/main/resources/invoke-plantuml/createauthoritydatahttp.puml b/codemaker-core/src/main/resources/invoke-plantuml/createauthoritydatahttp.puml new file mode 100644 index 0000000000000000000000000000000000000000..63adc59787dfe0468c27bbee3161bf142ad62381 --- /dev/null +++ b/codemaker-core/src/main/resources/invoke-plantuml/createauthoritydatahttp.puml @@ -0,0 +1,16 @@ +@startuml + +participant 应用api层 as app +participant 领域层 as domain +participant 基础设施层 as infrast +group 系统上下文调用流程 +app --> domain: 1.给某角色授权\nAuthorityOperationController.saveAuthority invoke AuthorityRepository.buildAuthority +domain --> infrast:2.准备保存角色授权数据\n AuthorityRepository.buildAuthority invoke AuthorityMapper.insert +domain --> infrast:3.保存系统权限数据\n AuthorityRepository.buildAuthority invoke SystemAuthorityMapper.insert +domain --> infrast:4.保存行政权限详情\n AuthorityRepository.buildAuthority invoke AdminAuthorityMapper.insert +domain --> infrast:5.保存数据权限详情\n AuthorityRepository.buildAuthority invoke DataAuthorityMapper.insert +app --> infrast:6.发送授权消息\n AuthorityFacade.saveAuthority invoke AuthorityMqProducer.authorityCreate + +end + +@enduml \ No newline at end of file diff --git a/codemaker-core/src/main/resources/invoke-plantuml/createsystemdata.puml b/codemaker-core/src/main/resources/invoke-plantuml/createsystemdata.puml new file mode 100644 index 0000000000000000000000000000000000000000..d71686b10ad26630e5d6f6d94087217b273ee784 --- /dev/null +++ b/codemaker-core/src/main/resources/invoke-plantuml/createsystemdata.puml @@ -0,0 +1,17 @@ +@startuml + +participant 应用api层 as facade +participant 领域层 as domain +participant 基础设施层 as infrast +group 系统上下文调用流程 +facade --> domain: 1.查询系统信息是否已注册\nSystemFacade.registSystem invoke SystemModuleRepository.getSystemByCode +domain --> infrast:2.查询系统信息\n SystemModuleRepository.getSystemByCode invoke SystemMapper.getByCode + +facade --> domain: 3.注册系统\nSystemFacade.registSystem invoke SystemModuleRepository.saveSystem +domain --> infrast:4.持久化系统数据\n SystemModuleRepository.saveSystem invoke SystemMapper.insert + +domain --> infrast:5.发送mq\n SystemModuleRepository.saveSystem invoke SystemMqProducer.systemChange + +end + +@enduml \ No newline at end of file diff --git a/codemaker-core/src/main/resources/invoke-plantuml/queryauthoritydata.puml b/codemaker-core/src/main/resources/invoke-plantuml/queryauthoritydata.puml new file mode 100644 index 0000000000000000000000000000000000000000..fba7bc2d06e92b29c9c220a327610c46859205af --- /dev/null +++ b/codemaker-core/src/main/resources/invoke-plantuml/queryauthoritydata.puml @@ -0,0 +1,15 @@ +@startuml + +participant 应用api层 as facade +participant 领域层 as domain +participant 基础设施层 as infrast +group 系统上下文调用流程 +facade --> domain: 1.根据权限code查询权限信息\nAuthorityFacade.getByCode invoke AuthorityFactory.buildAuthorityByCode +domain --> domain:2.查询权限详情\n AuthorityFactory.buildAuthorityByCode invoke AuthorityRepository.getByCode +domain --> infrast:3.查询权限详情\n AuthorityRepository.getByCode invoke AuthorityMapper.getByCode +domain --> infrast:4.查询系统权限详情\n AuthorityRepository.getByCode invoke SystemAuthorityMapper.getByCode +domain --> infrast:5.查询行政权限详情\n AuthorityRepository.getByCode invoke AdminAuthorityMapper.getByCode + +end + +@enduml \ No newline at end of file diff --git a/codemaker-core/src/main/resources/invoke-plantuml/queryauthoritydatahttp.puml b/codemaker-core/src/main/resources/invoke-plantuml/queryauthoritydatahttp.puml new file mode 100644 index 0000000000000000000000000000000000000000..533585ca2fb6c6457f67fe0ee00a8e682bc37d02 --- /dev/null +++ b/codemaker-core/src/main/resources/invoke-plantuml/queryauthoritydatahttp.puml @@ -0,0 +1,15 @@ +@startuml + +participant 应用api层 as controller +participant 领域层 as domain +participant 基础设施层 as infrast +group 系统上下文调用流程 +controller --> domain: 1.根据权限code查询权限信息\n AuthorityQueryController.getByCode invoke AuthorityFactory.buildAuthorityByCode +domain --> domain:2.查询权限详情\n AuthorityFactory.buildAuthorityByCode invoke AuthorityRepository.getByCode +domain --> infrast:3.查询权限详情\n AuthorityRepository.getByCode invoke AuthorityMapper.getByCode +domain --> infrast:4.查询系统权限详情\n AuthorityRepository.getByCode invoke SystemAuthorityMapper.getByCode +domain --> infrast:5.查询行政权限详情\n AuthorityRepository.getByCode invoke AdminAuthorityMapper.getByCode + +end + +@enduml \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/cola/controllerddd.ftl b/codemaker-core/src/main/resources/template/cola/controllerddd.ftl index db0d725575c53aeba8af5a117b4d18c5ff3ff2ea..570a4e93153a5f60083038aa4dca8e1a715ee0b6 100644 --- a/codemaker-core/src/main/resources/template/cola/controllerddd.ftl +++ b/codemaker-core/src/main/resources/template/cola/controllerddd.ftl @@ -21,14 +21,17 @@ public class ${class.className} { protected Logger logger = LoggerFactory.getLogger(${class.className}.class); +<#list fields as field> + @Autowired + ${field.visibility} ${field.fieldName}; + + <#list methods as method> - /** - * - * @Description:${method.desc} - * @return ${method.returnClass} - */ + +${method.doc} @RequestMapping(value = "${method.pathValue}") public ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/cola/event.ftl b/codemaker-core/src/main/resources/template/cola/event.ftl new file mode 100644 index 0000000000000000000000000000000000000000..9f15e120dfe9a271ea823b5e318410cbd3be5c44 --- /dev/null +++ b/codemaker-core/src/main/resources/template/cola/event.ftl @@ -0,0 +1,35 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + +import lombok.Data; +import lombok.ToString; + + /** + * @Description:${class.classDesc}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Data +@ToString +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/cola/exeimpl.ftl b/codemaker-core/src/main/resources/template/cola/exeimpl.ftl index a2b72408df811370c892a9c7b85f6f5b14597713..e6a8d75475a8c42353b308de6c43e6e9bd173bca 100644 --- a/codemaker-core/src/main/resources/template/cola/exeimpl.ftl +++ b/codemaker-core/src/main/resources/template/cola/exeimpl.ftl @@ -8,6 +8,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import ${class.packageName}.${class.className}; +import org.springframework.beans.factory.annotation.Autowired; /** * @Description:${class.classDesc}接口实现类 @@ -19,10 +20,17 @@ import ${class.packageName}.${class.className}; public class ${class.className} ${class.relationClassStr}{ private Logger logger = LoggerFactory.getLogger(this.getClass()); - <#list methods as method> + <#list fields as field> + @Autowired + ${field.visibility} ${field.fieldName}; + + + + <#list methods as method> @Override public ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/cola/facade.ftl b/codemaker-core/src/main/resources/template/cola/facade.ftl index f0fc9ca6835045c4f8a9ecb41b2f2a7d846ea3dc..ca82ab36e347d75bf925549966ea9725ce17c7ab 100644 --- a/codemaker-core/src/main/resources/template/cola/facade.ftl +++ b/codemaker-core/src/main/resources/template/cola/facade.ftl @@ -19,8 +19,7 @@ public interface ${table.humpClassName}Facade{ * @Title: save * @Description:新增 * @author: - * @param @param dto - * @param @param userId + * @param dto * @return ResultDto 返回类型 * @throws */ @@ -31,7 +30,7 @@ public interface ${table.humpClassName}Facade{ * @Title: delete * @Description: 通过id删除数据 * @author: - * @param @param id + * @param id * @return ResultDto 返回类型 * @throws */ diff --git a/codemaker-core/src/main/resources/template/cola/facadeddd.ftl b/codemaker-core/src/main/resources/template/cola/facadeddd.ftl index a4e48b0a4eadebd7206c00f3656f894c87e1ec92..2ccce459c40a9dade9a9323e059fea5dae1a788d 100644 --- a/codemaker-core/src/main/resources/template/cola/facadeddd.ftl +++ b/codemaker-core/src/main/resources/template/cola/facadeddd.ftl @@ -13,11 +13,8 @@ import ${importClass}; */ public interface ${class.className}{ <#list methods as method> - /** - * - * @Description:${method.desc} - * @return ${method.returnClass} - */ + +${method.doc} ${method.returnClass} ${method.methodName}; } \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/cola/facadeimplddd.ftl b/codemaker-core/src/main/resources/template/cola/facadeimplddd.ftl index ee6c539337af7372dafb56b9c2beab99e37f2620..59e2867a88ae4e260a4bfcb7fc225026af6fa78b 100644 --- a/codemaker-core/src/main/resources/template/cola/facadeimplddd.ftl +++ b/codemaker-core/src/main/resources/template/cola/facadeimplddd.ftl @@ -3,6 +3,8 @@ package ${class.packageName}; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.dubbo.config.annotation.Service; +import org.springframework.beans.factory.annotation.Autowired; + <#list imports as importClass> import ${importClass}; @@ -16,10 +18,18 @@ import ${importClass}; public class ${class.className} ${class.relationClassStr}{ private Logger logger = LoggerFactory.getLogger(this.getClass()); + + <#list fields as field> + @Autowired + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> @Override public ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/cola/factory.ftl b/codemaker-core/src/main/resources/template/cola/factory.ftl index 758b640f34c009f2f7a9a7659d06586a9d51db1a..d7514abef0dc2444f918828f8f828e846a2c489b 100644 --- a/codemaker-core/src/main/resources/template/cola/factory.ftl +++ b/codemaker-core/src/main/resources/template/cola/factory.ftl @@ -5,6 +5,7 @@ import ${importClass}; import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; /** * @Description:${class.className}类 @@ -17,16 +18,15 @@ public class ${class.className}{ <#list fields as field> /** ${field.desc} **/ + @Autowired ${field.visibility} ${field.fieldName}; <#list methods as method> - /** - * - * @Description:${method.desc} - * @return ${method.returnClass} - */ + +${method.doc} ${method.visibility} ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/cola/gataway.ftl b/codemaker-core/src/main/resources/template/cola/gataway.ftl index f2689c4553a21b9c0f9b83b22c31b7d364c48433..327c40fbaea1ec6fd7c168452e5c16efead0fb36 100644 --- a/codemaker-core/src/main/resources/template/cola/gataway.ftl +++ b/codemaker-core/src/main/resources/template/cola/gataway.ftl @@ -13,11 +13,7 @@ import ${importClass}; */ public interface ${class.className}{ <#list methods as method> - /** - * - * @Description:${method.desc} - * @return ${method.returnClass} - */ +${method.doc} ${method.returnClass} ${method.methodName}; } \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/cola/gatawayimpl.ftl b/codemaker-core/src/main/resources/template/cola/gatawayimpl.ftl index ef69323a922b60a7ec953e7cbc952c773f6bb2b8..6f4af81d020f8b3407df0579a172f77ea443aad1 100644 --- a/codemaker-core/src/main/resources/template/cola/gatawayimpl.ftl +++ b/codemaker-core/src/main/resources/template/cola/gatawayimpl.ftl @@ -1,4 +1,4 @@ -package ${class.packageName}.impl; +package ${class.packageName}; <#list imports as importClass> import ${importClass}; @@ -7,7 +7,8 @@ import ${importClass}; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import ${class.packageName}.${class.className}; +import org.springframework.beans.factory.annotation.Autowired; + /** * @Description:${class.classDesc}接口实现类 @@ -16,13 +17,21 @@ import ${class.packageName}.${class.className}; * @version v1.0 */ @Service -public class ${class.className}Impl implements ${class.className}{ +public class ${class.className} ${class.relationClassStr}{ private Logger logger = LoggerFactory.getLogger(this.getClass()); + + + <#list fields as field> + @Autowired + ${field.visibility} ${field.fieldName}; + + <#list methods as method> @Override public ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/cola/infrastaclimpl.ftl b/codemaker-core/src/main/resources/template/cola/infrastaclimpl.ftl new file mode 100644 index 0000000000000000000000000000000000000000..6f4af81d020f8b3407df0579a172f77ea443aad1 --- /dev/null +++ b/codemaker-core/src/main/resources/template/cola/infrastaclimpl.ftl @@ -0,0 +1,39 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + + +/** + * @Description:${class.classDesc}接口实现类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className} ${class.relationClassStr}{ + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + + <#list fields as field> + @Autowired + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + + @Override + public ${method.returnClass} ${method.methodName}{ +${method.methodContent} + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/cola/mqconsumer.ftl b/codemaker-core/src/main/resources/template/cola/mqconsumer.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/cola/mqconsumer.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/cola/mqhandler.ftl b/codemaker-core/src/main/resources/template/cola/mqhandler.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/cola/mqhandler.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/cola/mqlistener.ftl b/codemaker-core/src/main/resources/template/cola/mqlistener.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/cola/mqlistener.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/cola/mqproducer.ftl b/codemaker-core/src/main/resources/template/cola/mqproducer.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/cola/mqproducer.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/cola/service.ftl b/codemaker-core/src/main/resources/template/cola/service.ftl index 3a7a47b74f1297e778c77bf59ac8ceb543bab1e1..0996e2d9b844f94dfe10982ac59fa536536ef4c9 100644 --- a/codemaker-core/src/main/resources/template/cola/service.ftl +++ b/codemaker-core/src/main/resources/template/cola/service.ftl @@ -17,8 +17,7 @@ public interface ${table.humpClassName}Service{ * @Title: save * @Description:新增 * @author: - * @param @param bo - * @param @param userId + * @param bo * @return ResultDto 返回类型 * @throws */ @@ -29,7 +28,7 @@ public interface ${table.humpClassName}Service{ * @Title: delete * @Description: 通过id删除数据 * @author: - * @param @param id + * @param id * @return ResultDto 返回类型 * @throws */ @@ -40,7 +39,7 @@ public interface ${table.humpClassName}Service{ * @Title: getById * @Description: 通过id查询 * @author: - * @param @param id + * @param id * @return ResultDataDto<${table.humpClassName}BO> * @throws */ @@ -61,8 +60,8 @@ public interface ${table.humpClassName}Service{ * @Title: update * @Description:修改 * @author: - * @param @param ${table.humpTableName}BO - * @return int + * @param ${table.humpTableName}BO + * @return boolean * @throws */ public boolean update(${table.humpClassName}BO ${table.humpTableName}BO) throws Exception; diff --git a/codemaker-core/src/main/resources/template/dubbo/event.ftl b/codemaker-core/src/main/resources/template/dubbo/event.ftl new file mode 100644 index 0000000000000000000000000000000000000000..9f15e120dfe9a271ea823b5e318410cbd3be5c44 --- /dev/null +++ b/codemaker-core/src/main/resources/template/dubbo/event.ftl @@ -0,0 +1,35 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + +import lombok.Data; +import lombok.ToString; + + /** + * @Description:${class.classDesc}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Data +@ToString +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/dubbo/exeimpl.ftl b/codemaker-core/src/main/resources/template/dubbo/exeimpl.ftl index a2b72408df811370c892a9c7b85f6f5b14597713..e6a8d75475a8c42353b308de6c43e6e9bd173bca 100644 --- a/codemaker-core/src/main/resources/template/dubbo/exeimpl.ftl +++ b/codemaker-core/src/main/resources/template/dubbo/exeimpl.ftl @@ -8,6 +8,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import ${class.packageName}.${class.className}; +import org.springframework.beans.factory.annotation.Autowired; /** * @Description:${class.classDesc}接口实现类 @@ -19,10 +20,17 @@ import ${class.packageName}.${class.className}; public class ${class.className} ${class.relationClassStr}{ private Logger logger = LoggerFactory.getLogger(this.getClass()); - <#list methods as method> + <#list fields as field> + @Autowired + ${field.visibility} ${field.fieldName}; + + + + <#list methods as method> @Override public ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/dubbo/facade.ftl b/codemaker-core/src/main/resources/template/dubbo/facade.ftl index f0fc9ca6835045c4f8a9ecb41b2f2a7d846ea3dc..ca82ab36e347d75bf925549966ea9725ce17c7ab 100644 --- a/codemaker-core/src/main/resources/template/dubbo/facade.ftl +++ b/codemaker-core/src/main/resources/template/dubbo/facade.ftl @@ -19,8 +19,7 @@ public interface ${table.humpClassName}Facade{ * @Title: save * @Description:新增 * @author: - * @param @param dto - * @param @param userId + * @param dto * @return ResultDto 返回类型 * @throws */ @@ -31,7 +30,7 @@ public interface ${table.humpClassName}Facade{ * @Title: delete * @Description: 通过id删除数据 * @author: - * @param @param id + * @param id * @return ResultDto 返回类型 * @throws */ diff --git a/codemaker-core/src/main/resources/template/dubbo/facadeddd.ftl b/codemaker-core/src/main/resources/template/dubbo/facadeddd.ftl index a4e48b0a4eadebd7206c00f3656f894c87e1ec92..2ccce459c40a9dade9a9323e059fea5dae1a788d 100644 --- a/codemaker-core/src/main/resources/template/dubbo/facadeddd.ftl +++ b/codemaker-core/src/main/resources/template/dubbo/facadeddd.ftl @@ -13,11 +13,8 @@ import ${importClass}; */ public interface ${class.className}{ <#list methods as method> - /** - * - * @Description:${method.desc} - * @return ${method.returnClass} - */ + +${method.doc} ${method.returnClass} ${method.methodName}; } \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/dubbo/facadeimplddd.ftl b/codemaker-core/src/main/resources/template/dubbo/facadeimplddd.ftl index ee6c539337af7372dafb56b9c2beab99e37f2620..59e2867a88ae4e260a4bfcb7fc225026af6fa78b 100644 --- a/codemaker-core/src/main/resources/template/dubbo/facadeimplddd.ftl +++ b/codemaker-core/src/main/resources/template/dubbo/facadeimplddd.ftl @@ -3,6 +3,8 @@ package ${class.packageName}; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.dubbo.config.annotation.Service; +import org.springframework.beans.factory.annotation.Autowired; + <#list imports as importClass> import ${importClass}; @@ -16,10 +18,18 @@ import ${importClass}; public class ${class.className} ${class.relationClassStr}{ private Logger logger = LoggerFactory.getLogger(this.getClass()); + + <#list fields as field> + @Autowired + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> @Override public ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/dubbo/factory.ftl b/codemaker-core/src/main/resources/template/dubbo/factory.ftl index 758b640f34c009f2f7a9a7659d06586a9d51db1a..d7514abef0dc2444f918828f8f828e846a2c489b 100644 --- a/codemaker-core/src/main/resources/template/dubbo/factory.ftl +++ b/codemaker-core/src/main/resources/template/dubbo/factory.ftl @@ -5,6 +5,7 @@ import ${importClass}; import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; /** * @Description:${class.className}类 @@ -17,16 +18,15 @@ public class ${class.className}{ <#list fields as field> /** ${field.desc} **/ + @Autowired ${field.visibility} ${field.fieldName}; <#list methods as method> - /** - * - * @Description:${method.desc} - * @return ${method.returnClass} - */ + +${method.doc} ${method.visibility} ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/dubbo/gatawayimpl.ftl b/codemaker-core/src/main/resources/template/dubbo/gatawayimpl.ftl index ef69323a922b60a7ec953e7cbc952c773f6bb2b8..6f4af81d020f8b3407df0579a172f77ea443aad1 100644 --- a/codemaker-core/src/main/resources/template/dubbo/gatawayimpl.ftl +++ b/codemaker-core/src/main/resources/template/dubbo/gatawayimpl.ftl @@ -1,4 +1,4 @@ -package ${class.packageName}.impl; +package ${class.packageName}; <#list imports as importClass> import ${importClass}; @@ -7,7 +7,8 @@ import ${importClass}; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import ${class.packageName}.${class.className}; +import org.springframework.beans.factory.annotation.Autowired; + /** * @Description:${class.classDesc}接口实现类 @@ -16,13 +17,21 @@ import ${class.packageName}.${class.className}; * @version v1.0 */ @Service -public class ${class.className}Impl implements ${class.className}{ +public class ${class.className} ${class.relationClassStr}{ private Logger logger = LoggerFactory.getLogger(this.getClass()); + + + <#list fields as field> + @Autowired + ${field.visibility} ${field.fieldName}; + + <#list methods as method> @Override public ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/dubbo/mqconsumer.ftl b/codemaker-core/src/main/resources/template/dubbo/mqconsumer.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/dubbo/mqconsumer.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/dubbo/mqhandler.ftl b/codemaker-core/src/main/resources/template/dubbo/mqhandler.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/dubbo/mqhandler.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/dubbo/mqlistener.ftl b/codemaker-core/src/main/resources/template/dubbo/mqlistener.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/dubbo/mqlistener.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/dubbo/mqproducer.ftl b/codemaker-core/src/main/resources/template/dubbo/mqproducer.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/dubbo/mqproducer.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/dubbo/service.ftl b/codemaker-core/src/main/resources/template/dubbo/service.ftl index 36859d2f9f438f9fff7d751f47c743bdaf6d5a80..0996e2d9b844f94dfe10982ac59fa536536ef4c9 100644 --- a/codemaker-core/src/main/resources/template/dubbo/service.ftl +++ b/codemaker-core/src/main/resources/template/dubbo/service.ftl @@ -1,8 +1,8 @@ -package ${package}.core.service; +package ${package}.service; import java.util.List; -import ${package}.core.model.bo.${table.humpClassName}BO; +import ${package}.model.bo.${table.humpClassName}BO; /** * @Description:${table.tableComment}Service接口 @@ -17,31 +17,30 @@ public interface ${table.humpClassName}Service{ * @Title: save * @Description:新增 * @author: - * @param @param dto - * @param @param userId - * @return ${table.humpClassName}BO 返回类型 + * @param bo + * @return ResultDto 返回类型 * @throws */ - public ${table.humpClassName}BO save(${table.humpClassName}BO ${table.humpTableName}BO) throws Exception; + public ${table.humpClassName}BO save(${table.humpClassName}BO bo) throws Exception; /** * * @Title: delete * @Description: 通过id删除数据 * @author: - * @param @param id + * @param id * @return ResultDto 返回类型 * @throws */ - public Boolean delete(Long id); + public boolean delete(Long id); /** * * @Title: getById * @Description: 通过id查询 * @author: - * @param @param id - * @return ${table.humpClassName}BO + * @param id + * @return ResultDataDto<${table.humpClassName}BO> * @throws */ public ${table.humpClassName}BO getById(Long id) throws Exception; @@ -61,10 +60,10 @@ public interface ${table.humpClassName}Service{ * @Title: update * @Description:修改 * @author: - * @param @param ${table.humpTableName}BO - * @return ${table.humpClassName}BO + * @param ${table.humpTableName}BO + * @return boolean * @throws */ - public ${table.humpClassName}BO update(${table.humpClassName}BO ${table.humpTableName}BO) throws Exception; + public boolean update(${table.humpClassName}BO ${table.humpTableName}BO) throws Exception; } \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/dynamicddd/event.ftl b/codemaker-core/src/main/resources/template/dynamicddd/event.ftl new file mode 100644 index 0000000000000000000000000000000000000000..9f15e120dfe9a271ea823b5e318410cbd3be5c44 --- /dev/null +++ b/codemaker-core/src/main/resources/template/dynamicddd/event.ftl @@ -0,0 +1,35 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + +import lombok.Data; +import lombok.ToString; + + /** + * @Description:${class.classDesc}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Data +@ToString +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/dynamicddd/exeimpl.ftl b/codemaker-core/src/main/resources/template/dynamicddd/exeimpl.ftl index a2b72408df811370c892a9c7b85f6f5b14597713..e6a8d75475a8c42353b308de6c43e6e9bd173bca 100644 --- a/codemaker-core/src/main/resources/template/dynamicddd/exeimpl.ftl +++ b/codemaker-core/src/main/resources/template/dynamicddd/exeimpl.ftl @@ -8,6 +8,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import ${class.packageName}.${class.className}; +import org.springframework.beans.factory.annotation.Autowired; /** * @Description:${class.classDesc}接口实现类 @@ -19,10 +20,17 @@ import ${class.packageName}.${class.className}; public class ${class.className} ${class.relationClassStr}{ private Logger logger = LoggerFactory.getLogger(this.getClass()); - <#list methods as method> + <#list fields as field> + @Autowired + ${field.visibility} ${field.fieldName}; + + + + <#list methods as method> @Override public ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/dynamicddd/factory.ftl b/codemaker-core/src/main/resources/template/dynamicddd/factory.ftl index 758b640f34c009f2f7a9a7659d06586a9d51db1a..d7514abef0dc2444f918828f8f828e846a2c489b 100644 --- a/codemaker-core/src/main/resources/template/dynamicddd/factory.ftl +++ b/codemaker-core/src/main/resources/template/dynamicddd/factory.ftl @@ -5,6 +5,7 @@ import ${importClass}; import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; /** * @Description:${class.className}类 @@ -17,16 +18,15 @@ public class ${class.className}{ <#list fields as field> /** ${field.desc} **/ + @Autowired ${field.visibility} ${field.fieldName}; <#list methods as method> - /** - * - * @Description:${method.desc} - * @return ${method.returnClass} - */ + +${method.doc} ${method.visibility} ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/dynamicddd/gatawayimpl.ftl b/codemaker-core/src/main/resources/template/dynamicddd/gatawayimpl.ftl index ef69323a922b60a7ec953e7cbc952c773f6bb2b8..6f4af81d020f8b3407df0579a172f77ea443aad1 100644 --- a/codemaker-core/src/main/resources/template/dynamicddd/gatawayimpl.ftl +++ b/codemaker-core/src/main/resources/template/dynamicddd/gatawayimpl.ftl @@ -1,4 +1,4 @@ -package ${class.packageName}.impl; +package ${class.packageName}; <#list imports as importClass> import ${importClass}; @@ -7,7 +7,8 @@ import ${importClass}; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import ${class.packageName}.${class.className}; +import org.springframework.beans.factory.annotation.Autowired; + /** * @Description:${class.classDesc}接口实现类 @@ -16,13 +17,21 @@ import ${class.packageName}.${class.className}; * @version v1.0 */ @Service -public class ${class.className}Impl implements ${class.className}{ +public class ${class.className} ${class.relationClassStr}{ private Logger logger = LoggerFactory.getLogger(this.getClass()); + + + <#list fields as field> + @Autowired + ${field.visibility} ${field.fieldName}; + + <#list methods as method> @Override public ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/dynamicddd/mqconsumer.ftl b/codemaker-core/src/main/resources/template/dynamicddd/mqconsumer.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/dynamicddd/mqconsumer.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/dynamicddd/mqhandler.ftl b/codemaker-core/src/main/resources/template/dynamicddd/mqhandler.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/dynamicddd/mqhandler.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/dynamicddd/mqproducer.ftl b/codemaker-core/src/main/resources/template/dynamicddd/mqproducer.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/dynamicddd/mqproducer.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/springboot/event.ftl b/codemaker-core/src/main/resources/template/springboot/event.ftl new file mode 100644 index 0000000000000000000000000000000000000000..9f15e120dfe9a271ea823b5e318410cbd3be5c44 --- /dev/null +++ b/codemaker-core/src/main/resources/template/springboot/event.ftl @@ -0,0 +1,35 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + +import lombok.Data; +import lombok.ToString; + + /** + * @Description:${class.classDesc}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Data +@ToString +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/springboot/exeimpl.ftl b/codemaker-core/src/main/resources/template/springboot/exeimpl.ftl index a2b72408df811370c892a9c7b85f6f5b14597713..e6a8d75475a8c42353b308de6c43e6e9bd173bca 100644 --- a/codemaker-core/src/main/resources/template/springboot/exeimpl.ftl +++ b/codemaker-core/src/main/resources/template/springboot/exeimpl.ftl @@ -8,6 +8,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import ${class.packageName}.${class.className}; +import org.springframework.beans.factory.annotation.Autowired; /** * @Description:${class.classDesc}接口实现类 @@ -19,10 +20,17 @@ import ${class.packageName}.${class.className}; public class ${class.className} ${class.relationClassStr}{ private Logger logger = LoggerFactory.getLogger(this.getClass()); - <#list methods as method> + <#list fields as field> + @Autowired + ${field.visibility} ${field.fieldName}; + + + + <#list methods as method> @Override public ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/springboot/factory.ftl b/codemaker-core/src/main/resources/template/springboot/factory.ftl index 758b640f34c009f2f7a9a7659d06586a9d51db1a..d7514abef0dc2444f918828f8f828e846a2c489b 100644 --- a/codemaker-core/src/main/resources/template/springboot/factory.ftl +++ b/codemaker-core/src/main/resources/template/springboot/factory.ftl @@ -5,6 +5,7 @@ import ${importClass}; import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; /** * @Description:${class.className}类 @@ -17,16 +18,15 @@ public class ${class.className}{ <#list fields as field> /** ${field.desc} **/ + @Autowired ${field.visibility} ${field.fieldName}; <#list methods as method> - /** - * - * @Description:${method.desc} - * @return ${method.returnClass} - */ + +${method.doc} ${method.visibility} ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/springboot/gatawayimpl.ftl b/codemaker-core/src/main/resources/template/springboot/gatawayimpl.ftl index ef69323a922b60a7ec953e7cbc952c773f6bb2b8..6f4af81d020f8b3407df0579a172f77ea443aad1 100644 --- a/codemaker-core/src/main/resources/template/springboot/gatawayimpl.ftl +++ b/codemaker-core/src/main/resources/template/springboot/gatawayimpl.ftl @@ -1,4 +1,4 @@ -package ${class.packageName}.impl; +package ${class.packageName}; <#list imports as importClass> import ${importClass}; @@ -7,7 +7,8 @@ import ${importClass}; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import ${class.packageName}.${class.className}; +import org.springframework.beans.factory.annotation.Autowired; + /** * @Description:${class.classDesc}接口实现类 @@ -16,13 +17,21 @@ import ${class.packageName}.${class.className}; * @version v1.0 */ @Service -public class ${class.className}Impl implements ${class.className}{ +public class ${class.className} ${class.relationClassStr}{ private Logger logger = LoggerFactory.getLogger(this.getClass()); + + + <#list fields as field> + @Autowired + ${field.visibility} ${field.fieldName}; + + <#list methods as method> @Override public ${method.returnClass} ${method.methodName}{ +${method.methodContent} ${method.returnBody} } diff --git a/codemaker-core/src/main/resources/template/springboot/mqconsumer.ftl b/codemaker-core/src/main/resources/template/springboot/mqconsumer.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/springboot/mqconsumer.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/springboot/mqhandler.ftl b/codemaker-core/src/main/resources/template/springboot/mqhandler.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/springboot/mqhandler.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/springboot/mqlistener.ftl b/codemaker-core/src/main/resources/template/springboot/mqlistener.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/springboot/mqlistener.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/springboot/mqproducer.ftl b/codemaker-core/src/main/resources/template/springboot/mqproducer.ftl new file mode 100644 index 0000000000000000000000000000000000000000..758b640f34c009f2f7a9a7659d06586a9d51db1a --- /dev/null +++ b/codemaker-core/src/main/resources/template/springboot/mqproducer.ftl @@ -0,0 +1,34 @@ +package ${class.packageName}; + +<#list imports as importClass> +import ${importClass}; + + +import org.springframework.stereotype.Service; + + /** + * @Description:${class.className}类 + * @Author:${class.author} + * @CreateTime:${.now?string('yyyy-MM-dd HH:mm:ss')} + * @version v1.0 + */ +@Service +public class ${class.className}{ + + <#list fields as field> + /** ${field.desc} **/ + ${field.visibility} ${field.fieldName}; + + + <#list methods as method> + /** + * + * @Description:${method.desc} + * @return ${method.returnClass} + */ + ${method.visibility} ${method.returnClass} ${method.methodName}{ + ${method.returnBody} + } + + +} \ No newline at end of file diff --git a/codemaker-core/src/main/resources/template/springboot/service.ftl b/codemaker-core/src/main/resources/template/springboot/service.ftl index 9ca5bf61637bac64d18cc981a450659586122813..0996e2d9b844f94dfe10982ac59fa536536ef4c9 100644 --- a/codemaker-core/src/main/resources/template/springboot/service.ftl +++ b/codemaker-core/src/main/resources/template/springboot/service.ftl @@ -1,10 +1,8 @@ package ${package}.service; import java.util.List; -import com.coderman.utils.response.ResultDataDto; -import com.coderman.utils.response.ResultDto; -import ${package}.vo.${table.humpClassName}VO; +import ${package}.model.bo.${table.humpClassName}BO; /** * @Description:${table.tableComment}Service接口 @@ -19,54 +17,53 @@ public interface ${table.humpClassName}Service{ * @Title: save * @Description:新增 * @author: - * @param @param dto - * @param @param userId + * @param bo * @return ResultDto 返回类型 * @throws */ - public ResultDto save(${table.humpClassName}VO dto) throws Exception; + public ${table.humpClassName}BO save(${table.humpClassName}BO bo) throws Exception; /** * * @Title: delete * @Description: 通过id删除数据 * @author: - * @param @param id + * @param id * @return ResultDto 返回类型 * @throws */ - public ResultDto delete(Long id); + public boolean delete(Long id); /** * * @Title: getById * @Description: 通过id查询 * @author: - * @param @param id - * @return ResultDataDto<${table.humpClassName}VO> + * @param id + * @return ResultDataDto<${table.humpClassName}BO> * @throws */ - public ResultDataDto<${table.humpClassName}VO> getById(Long id) throws Exception; + public ${table.humpClassName}BO getById(Long id) throws Exception; /** * * @Title: getAll * @Description:查询所有数据 * @author: - * @return ResultDataDto> + * @return List<${table.humpClassName}BO> * @throws */ - public ResultDataDto> getAll() throws Exception; + public List<${table.humpClassName}BO> getAll() throws Exception; /** * * @Title: update * @Description:修改 * @author: - * @param @param ${table.humpTableName}Entity - * @return int + * @param ${table.humpTableName}BO + * @return boolean * @throws */ - public ResultDto update(${table.humpClassName}VO ${table.humpTableName}VO) throws Exception; + public boolean update(${table.humpClassName}BO ${table.humpTableName}BO) throws Exception; } \ No newline at end of file diff --git a/codemaker-dberPicture/pom.xml b/codemaker-dberPicture/pom.xml index 98e802beb0a5f594a73dbe49d6f904ecb07a5fe6..2b0e1a5577884da9c1ae2b0cdf4321f1530ca123 100644 --- a/codemaker-dberPicture/pom.xml +++ b/codemaker-dberPicture/pom.xml @@ -6,7 +6,7 @@ com.coderman.codermaker.dbergenerator codemaker-dbergenerator - 1.0.0-SNAPSHOT + 1.0.1-SNAPSHOT codemaker-dbergenerator @@ -55,6 +55,7 @@ 8 8 + 3.6.0 diff --git a/todoList b/todoList index dc27c138dda47dbb6855f88ddcd967ac7b0822f6..22d3d70214e445178e99200fc4c87abdd42ab194 100644 --- a/todoList +++ b/todoList @@ -7,6 +7,20 @@ [5]:codemaker-core全面梳理其他文件的生成依赖数据,具体 比如pom.xml需要的公共dependency 应用application启动类(down) -[6]:增加cola架构代码生成器功能 +[6]:增加cola架构代码生成器功能(down) [7]:增加对枚举数据的代码生成(down some) -[8]:支持dubbo应用类型的代码生成(down) \ No newline at end of file +[8]:支持dubbo应用类型的代码生成(down) + + + + +10. verison 1.2.1-beta 变更(todo) + 1.支持默认带工具类SpringEventPublisher帮助事件发布与消费异步化 + 2.支持事件发布异步化的代码绘制(产生事件->发布->消费事件) + 3.重构读取plantUML文件的相关逻辑降低复杂度 + 4.重新梳理读取plantUML文件的相关路径,优化为按项目维度分别存放 + 5.支持复杂场景下的代码绘制能力,进行精细化控制(如listbo,listvo的转换,代码参数动态绘制引用等) + 6.支持Page对象生成到代码里 + 7.支持通过时序图的调用方法列表补充构建接口和类的方法,辅助完善业务调用流程(如xxMapper.getByCode不在XXMapper里,则通过时序图里的信息进行动态补充) + 8.根据动态调用方法绘制内容将return body也进行动态化绘制 + 9.增加对基础设施层-适配层的调用绘制 \ No newline at end of file diff --git "a/\345\212\250\346\200\201\350\260\203\347\224\250\346\212\200\346\234\257\346\226\207\346\241\243" "b/\345\212\250\346\200\201\350\260\203\347\224\250\346\212\200\346\234\257\346\226\207\346\241\243" new file mode 100644 index 0000000000000000000000000000000000000000..7c84101489da2813ca86d2f7fb2884b23b3894b5 --- /dev/null +++ "b/\345\212\250\346\200\201\350\260\203\347\224\250\346\212\200\346\234\257\346\226\207\346\241\243" @@ -0,0 +1,35 @@ + +读写场景的分析 +1.应用层(app_rpc)->应用层(app_rpc) + 读:被调用方返回值转:bo->dto + 写:调用方参数转:dto->bo,bo->cmd,dto->cmd,cmd->event,event->msgbody + +2.应用层(app_rpc)->领域层(domain) + 读:被调用方返回值转:bo->dto + 写:调用方参数转:dto->bo + +3.应用层(app_rpc)->基础设施层(infrast) + 读:被调用方返回值转:bo->dto,dto->dto + 写:调用方参数转:dto->bo + + +4.领域层(domain)->领域层(domain) + 读:正常绘制 + 写:正常绘制 + + +5.领域层(domain)->基础设施层(infrast) + 读:被调用方返回值转:do->bo + 写:调用方参数转:bo->do,bo->msgbody,bo->event + +6.基础设施层(infrast)->基础设施层(infrast) + 读:正常绘制 + 写:正常绘制 + +7.应用层(app_http)->领域层(domain) + 读:被调用方返回值转:bo->vo + 写:调用方参数转:vo->bo,bo->cmd,vo->cmd,cmd->event,event->msgbody + +8.应用层(app_http)->应用层(app_rpc)-->是否需要? + 读:被调用方返回值转:bo->vo + 写:调用方参数转:vo->bo,bo->cmd,vo->cmd,cmd->event,event->msgbody