From bcee374d389744dd21678dfa2853495851a74219 Mon Sep 17 00:00:00 2001 From: suger <304902140@qq.com> Date: Fri, 17 May 2019 16:28:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=90=8C=E6=AD=A5=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/qmrz/generator/JavaSyncGenerator.java | 67 ++++++ .../com/qmrz/generator/MapperGenerator.java | 4 +- .../qmrz/generator/MapperSyncGenerator.java | 80 +++++++ .../src/main/resources/template/java_sync.ftl | 211 ++++++++++++++++++ .../main/resources/template/mapper_sync.ftl | 146 ++++++++++++ .../src/test/TestCodeGenerator.java | 18 +- 6 files changed, 523 insertions(+), 3 deletions(-) create mode 100644 code-generator/src/main/java/com/qmrz/generator/JavaSyncGenerator.java create mode 100644 code-generator/src/main/java/com/qmrz/generator/MapperSyncGenerator.java create mode 100644 code-generator/src/main/resources/template/java_sync.ftl create mode 100644 code-generator/src/main/resources/template/mapper_sync.ftl diff --git a/code-generator/src/main/java/com/qmrz/generator/JavaSyncGenerator.java b/code-generator/src/main/java/com/qmrz/generator/JavaSyncGenerator.java new file mode 100644 index 0000000..a3bb635 --- /dev/null +++ b/code-generator/src/main/java/com/qmrz/generator/JavaSyncGenerator.java @@ -0,0 +1,67 @@ +package com.qmrz.generator; + +import com.qmrz.exception.ABException; +import com.qmrz.service.TableService; +import com.qmrz.utils.CGHelper; +import com.qmrz.utils.Fn; +import com.qmrz.utils.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Mapper生成 + */ +public class JavaSyncGenerator { + private TableService tableService; + private String dbName; + + public JavaSyncGenerator(String dbName) { + tableService = SpringContextUtil.getBean(TableService.class); + this.dbName = dbName; + } + + public void generator() { + List tableList = tableService.getTableList(dbName); + List columnList = tableService.getColumnList(dbName); + + Map> result = columnList.stream().collect(Collectors.groupingBy(map -> Fn.toString(map.get("table_name")), Collectors.toList())); + +// CGHelper cgHelper = new CGHelper("mapper2.ftl", dbName);//无同步代码版本 + CGHelper cgHelper = new CGHelper("java_sync.ftl", dbName);//有同步代码版本 + + tableList.forEach(item -> { + String table_name = item.get("table_name").toString(); + String table_name2 = Fn.firstUpperCase(table_name); + + List tmpColumnList = result.get(table_name); + StringBuilder primaryKeyName = new StringBuilder(); + + tmpColumnList.stream().filter(i -> { + if ("PRI".equals(Fn.toString(i.get("column_key")))) { + primaryKeyName.append(Fn.toString(i.get("column_name"))); + return true; + } + return false; + }).findFirst(); + + if (primaryKeyName.length() == 0) { + throw new ABException("表 " + table_name + " 没有主键"); + } + + tmpColumnList = tmpColumnList.stream() + .filter(i -> + !"syscreatetime".equals(Fn.toString(i.get("column_name"))) + && !"sysupdatetime".equals(Fn.toString(i.get("column_name"))) + ).collect(Collectors.toList()); + + item.put("columnList", tmpColumnList); + item.put("dbname", dbName); + item.put("table_name2", table_name2);//首字母大写 + item.put("primaryKeyName", primaryKeyName.toString()); + cgHelper.generator("java_sync", table_name2 + "Sync.java", item); + }); + } +} diff --git a/code-generator/src/main/java/com/qmrz/generator/MapperGenerator.java b/code-generator/src/main/java/com/qmrz/generator/MapperGenerator.java index f306b9e..327e9fc 100644 --- a/code-generator/src/main/java/com/qmrz/generator/MapperGenerator.java +++ b/code-generator/src/main/java/com/qmrz/generator/MapperGenerator.java @@ -26,13 +26,13 @@ public class MapperGenerator { } public void generator() { - List tableList = tableService.getTableList(dbName); List columnList = tableService.getColumnList(dbName); Map> result = columnList.stream().collect(Collectors.groupingBy(map -> Fn.toString(map.get("table_name")), Collectors.toList())); - CGHelper cgHelper = new CGHelper("mapper2.ftl", dbName); + CGHelper cgHelper = new CGHelper("mapper2.ftl", dbName);//无同步代码版本 +// CGHelper cgHelper = new CGHelper("mapper_sync.ftl", dbName);//有同步代码版本 tableList.forEach(item -> { String table_name = item.get("table_name").toString(); diff --git a/code-generator/src/main/java/com/qmrz/generator/MapperSyncGenerator.java b/code-generator/src/main/java/com/qmrz/generator/MapperSyncGenerator.java new file mode 100644 index 0000000..a9efdd0 --- /dev/null +++ b/code-generator/src/main/java/com/qmrz/generator/MapperSyncGenerator.java @@ -0,0 +1,80 @@ +package com.qmrz.generator; + +import com.qmrz.exception.ABException; +import com.qmrz.service.TableService; +import com.qmrz.utils.CGHelper; +import com.qmrz.utils.Fn; +import com.qmrz.utils.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Mapper生成 + */ +public class MapperSyncGenerator { + private TableService tableService; + private String dbName; + + public MapperSyncGenerator(String dbName) { + tableService = SpringContextUtil.getBean(TableService.class); + this.dbName = dbName; + } + + public void generator() { + List tableList = tableService.getTableList(dbName); + List columnList = tableService.getColumnList(dbName); + + Map> result = columnList.stream().collect(Collectors.groupingBy(map -> Fn.toString(map.get("table_name")), Collectors.toList())); + +// CGHelper cgHelper = new CGHelper("mapper2.ftl", dbName);//无同步代码版本 + CGHelper cgHelper = new CGHelper("mapper_sync.ftl", dbName);//有同步代码版本 + + tableList.forEach(item -> { + String table_name = item.get("table_name").toString(); + String table_name2 = Fn.firstUpperCase(table_name); + + List tmpColumnList = result.get(table_name); + + List orderByList = new ArrayList<>(); + tmpColumnList.stream().filter(i -> { + String tmpColumnName = Fn.toString(i.get("column_name")); + if ("createdatetime".equals(tmpColumnName)) { + orderByList.add("t."+tmpColumnName + " desc"); + return true; + } + return false; + }).findFirst(); + + StringBuilder primaryKeyName = new StringBuilder(); + + tmpColumnList.stream().filter(i -> { + if ("PRI".equals(Fn.toString(i.get("column_key")))) { + orderByList.add("t."+Fn.toString(i.get("column_name")) + " desc"); + primaryKeyName.append(Fn.toString(i.get("column_name"))); + return true; + } + return false; + }).findFirst(); + + if (primaryKeyName.length() == 0) { + throw new ABException("表 " + table_name + " 没有主键"); + } + + String orderBy = ""; + + if (orderByList.size() > 0) { + orderBy = "order by " + String.join(",", orderByList); + } + + item.put("columnList", tmpColumnList); + item.put("dbname", dbName); + item.put("table_name2", table_name2);//首字母大写 + item.put("orderBy", orderBy); + item.put("primaryKeyName", primaryKeyName.toString()); + cgHelper.generator("mapper2", table_name2 + "Mapper.xml", item); + }); + } +} diff --git a/code-generator/src/main/resources/template/java_sync.ftl b/code-generator/src/main/resources/template/java_sync.ftl new file mode 100644 index 0000000..062601a --- /dev/null +++ b/code-generator/src/main/resources/template/java_sync.ftl @@ -0,0 +1,211 @@ +package com.qmrz.service.outside.sync; + +import com.alibaba.fastjson.JSONObject; +import com.qmrz.api.common.SpringContextUtil; +import com.qmrz.api.common.SysInfo; +import com.qmrz.service.outside.v2.BaseSyncV2; +import com.qmrz.service.outside.v2.SyncDTO; +import com.qmrz.utils.DateTimeUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 同步 ${table_comment}(${table_name}) + */ +public class ${table_name2}Sync extends BaseSyncV2 { + @Override + protected Map getSyncFieldMapping() { + Map fieldMapping = new HashMap<>(); + <#list columnList as item> + fieldMapping.put("${item.column_name}","${item.column_name}"); + + return fieldMapping; + } + + /** + * 批量插入mapid + * + * @return + */ + @Override + protected String insertMapID() { + return "${table_name2}Mapper.sync_batch_insert"; + } + + /** + * 批量更新mapid + * + * @return + */ + @Override + protected String updateMapID() { + return "${table_name2}Mapper.sync_batch_update"; + } + + /** + * 批量删除mapid + * + * @return + */ + @Override + protected String deleteMapID() { + return "${table_name2}Mapper.sync_batch_delete"; + } + + /** + * 最大maxid,一个同步循环只从DB获取一次 + * + * @return + */ + @Override + protected String maxidMapID() { + return "${table_name2}Mapper.sync_batch_select_maxid"; + } + + /** + * 查询DB数据,用与api数据比对后的 增、改 + * + * @return + */ + @Override + protected String selectDBMapID() { + return "${table_name2}Mapper.sync_batch_select"; + } + + /** + * 查询DB数据,用与api数据比对后的 删除 + * + * @return + */ + @Override + protected String selectDBPageMapID() { + return "${table_name2}Mapper.sync_batch_select_page"; + } + + /** + * 表名 + * + * @return + */ + @Override + protected String getTableName() { + return "${table_name}"; + } + + @Override + protected String getPrimaryFieldName() { + return "${primaryKeyName}"; + } + + /** + * api接口页码 + * + * @return + */ + @Override + protected int getApiPageSize() { + return 1000; //不超过5000,单次api查询最多返回5000条 + } + + /** + * 数据同步 api url + * + * @return + */ + @Override + protected String getSyncUrl(SyncDTO syncDTO) { + SysInfo info = SpringContextUtil.getBean(SysInfo.class); + StringBuilder param = new StringBuilder() + .append("epid=" + info.getEpid()) + .append("&xzqhdm=" + info.getXzqhdm()) + .append("&tableName=" + this.getTableName()); + syncDTO.setSyncapiparam(param.toString()); + return this.getSyncDTO().getSyncapiurl(); + } + + @Override + public boolean getOpenLimitAPI(){ + return true; + } + + /** + * 查询时默认参数 + * + * @return + */ + @Override + protected Map getDefaultSelectParamDB(SyncDTO syncDTO) { + return new HashMap<>(); + } + + @Override + protected void insertAddField(Map insertMap, JSONObject jsonObjectAPI) { + //insertMap.put("id", Fn.getUUID()); + jsonObjectAPI.put("syscreatetime", DateTimeUtil.currentStr()); + jsonObjectAPI.put("sysupdatetime", DateTimeUtil.currentStr()); + } + + @Override + protected void updateAddField(Map updateMap, JSONObject jsonObjectAPI) { + jsonObjectAPI.put("sysupdatetime", DateTimeUtil.currentStr()); + } + + @Override + protected void getBeforeCheckRowAPI(Map updateMap, JSONObject jsonObjectAPI) { + + } + + @Override + protected void getResetRowIDAPI(Map rowAPI, JSONObject jsonObjectAPI, SyncDTO syncDTO) { + } + + @Override + protected List apiReturnFieldByDelete() { + return new ArrayList<>(); + } + + /** + * 是否开启增量模式同步 + * + * @return + */ + @Override + protected boolean getIsOpenMaxIDModel() { + return false; + } + + /** + * 默认maxid,若自增为数字时,可设为0。若字符串时,可以设置为空字符串 + * + * @return + */ + @Override + protected String getDefaultMaxID() { + return "0"; + } + + @Override + protected String setMaxID(String maxID) { + return maxID; + } + + /** + * (开启子集同步时使用) + */ + @Override + protected void syncSubInsertAndUpdate() { + } + + /** + * (开启子集同步时使用) + * + * @param parentIDListDB 同步删除的数据范围(相对子集的父id集合) + */ + @Override + protected void syncSubDelete(List parentIDListDB) { + + } +} diff --git a/code-generator/src/main/resources/template/mapper_sync.ftl b/code-generator/src/main/resources/template/mapper_sync.ftl new file mode 100644 index 0000000..daa4c7d --- /dev/null +++ b/code-generator/src/main/resources/template/mapper_sync.ftl @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + insert into ${table_name}(<#list columnList as item>${item.column_name}<#if item_has_next>,) + values + + (<#list columnList as item>${"#"}{item.${item.column_name}}<#if item_has_next>,) + + + + + + + update ${table_name} + + <#list columnList as item> + <#if item.column_key?? && item.column_key!="PRI" && item.column_name!="syscreatetime"> + ${item.column_name} = ${"#"}{item.${item.column_name}}, + + + + where ${primaryKeyName}= ${"#"}{item.${primaryKeyName}} + + + + + + delete from ${table_name} where ${primaryKeyName} in ( + + ${"#"}{item} + + ) + + + + + + + + <#list columnList as item> + and t.${item.column_name} = ${"#"}{where_${item.column_name}} + + + <#list columnList as item> + and t.${item.column_name} like concat('%',${"#"}{like_${item.column_name}},'%') + + + + and t.${primaryKeyName} in + + ${"#"}{item} + + + + + + + + + + + + insert into ${table_name}( + + <#list columnList as item> + ${item.column_name}, + + ) + values( + + <#list columnList as item> + ${"#"}{${item.column_name}}, + + + ) + + + + + update ${table_name} t + + <#list columnList as item> + <#if item.column_key?? && item.column_key!="PRI" || item.column_name?? && item.column_name != "id"> + t.${item.column_name} = ${"#"}{${item.column_name}}, + + + + + + + + + + + delete t from ${table_name} t + + + + + \ No newline at end of file diff --git a/code-generator/src/test/TestCodeGenerator.java b/code-generator/src/test/TestCodeGenerator.java index cbc1b54..357b34f 100644 --- a/code-generator/src/test/TestCodeGenerator.java +++ b/code-generator/src/test/TestCodeGenerator.java @@ -11,7 +11,9 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @SpringBootTest(classes = CodeGenerator.class) public class TestCodeGenerator { // private String dbname="ga-dp-dev"; -private String dbname="psbd-dev"; +//private String dbname="qmrz"; + private String dbname="ga-lock-dev"; +// private String dbname="psbd-dev"; // private String dbname="ga-hotelmanage-dev"; /** * 生成所有 @@ -20,6 +22,8 @@ private String dbname="psbd-dev"; public void generatorAll() { readme(); mapper(); + mapperSync(); + javaSync(); // service(); service2(); // serviceImpl(); @@ -54,6 +58,18 @@ private String dbname="psbd-dev"; generator.generator(); } + @Test + public void mapperSync() { + MapperSyncGenerator generator = new MapperSyncGenerator(dbname); + generator.generator(); + } + + @Test + public void javaSync() { + JavaSyncGenerator generator = new JavaSyncGenerator(dbname); + generator.generator(); + } + /** * service 生成 */