Ver a proveniência

增加同步代码生成

develop
陈国强 há 6 anos
ascendente
cometimento
bcee374d38
6 ficheiros alterados com 523 adições e 3 eliminações
  1. +67
    -0
      code-generator/src/main/java/com/qmrz/generator/JavaSyncGenerator.java
  2. +2
    -2
      code-generator/src/main/java/com/qmrz/generator/MapperGenerator.java
  3. +80
    -0
      code-generator/src/main/java/com/qmrz/generator/MapperSyncGenerator.java
  4. +211
    -0
      code-generator/src/main/resources/template/java_sync.ftl
  5. +146
    -0
      code-generator/src/main/resources/template/mapper_sync.ftl
  6. +17
    -1
      code-generator/src/test/TestCodeGenerator.java

+ 67
- 0
code-generator/src/main/java/com/qmrz/generator/JavaSyncGenerator.java Ver ficheiro

@@ -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<Map> tableList = tableService.getTableList(dbName);
List<Map> columnList = tableService.getColumnList(dbName);

Map<String, List<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<Map> 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);
});
}
}

+ 2
- 2
code-generator/src/main/java/com/qmrz/generator/MapperGenerator.java Ver ficheiro

@@ -26,13 +26,13 @@ public class MapperGenerator {
}

public void generator() {

List<Map> tableList = tableService.getTableList(dbName);
List<Map> columnList = tableService.getColumnList(dbName);

Map<String, List<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();


+ 80
- 0
code-generator/src/main/java/com/qmrz/generator/MapperSyncGenerator.java Ver ficheiro

@@ -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<Map> tableList = tableService.getTableList(dbName);
List<Map> columnList = tableService.getColumnList(dbName);

Map<String, List<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<Map> tmpColumnList = result.get(table_name);

List<String> 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);
});
}
}

+ 211
- 0
code-generator/src/main/resources/template/java_sync.ftl Ver ficheiro

@@ -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<String, String> getSyncFieldMapping() {
Map<String, String> fieldMapping = new HashMap<>();
<#list columnList as item>
fieldMapping.put("${item.column_name}","${item.column_name}");
</#list>
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<String, Object> getDefaultSelectParamDB(SyncDTO syncDTO) {
return new HashMap<>();
}

@Override
protected void insertAddField(Map<String, String> insertMap, JSONObject jsonObjectAPI) {
//insertMap.put("id", Fn.getUUID());
jsonObjectAPI.put("syscreatetime", DateTimeUtil.currentStr());
jsonObjectAPI.put("sysupdatetime", DateTimeUtil.currentStr());
}

@Override
protected void updateAddField(Map<String, String> updateMap, JSONObject jsonObjectAPI) {
jsonObjectAPI.put("sysupdatetime", DateTimeUtil.currentStr());
}

@Override
protected void getBeforeCheckRowAPI(Map<String, String> updateMap, JSONObject jsonObjectAPI) {

}

@Override
protected void getResetRowIDAPI(Map<String, Object> rowAPI, JSONObject jsonObjectAPI, SyncDTO syncDTO) {
}

@Override
protected List<String> 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<String> parentIDListDB) {

}
}

+ 146
- 0
code-generator/src/main/resources/template/mapper_sync.ftl Ver ficheiro

@@ -0,0 +1,146 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--
${table_name}(${table_comment})
注意:分隔线以下 不增加业务,有新增自定义业务时加到分隔线上面
-->
<mapper namespace="com.qmrz.domain.mapper.${table_name2}Mapper">

<!-- 同步,查询DB数据,用与api数据比对后的 增、改 -->
<select id="sync_batch_select" resultType="Map" parameterType="Map">
select <#list columnList as item>t.${item.column_name}<#if item_has_next>,</#if></#list>
from ${table_name} t
where t.${primaryKeyName} in(
<foreach collection="idlist" item="item" index="index" separator=",">
${"#"}{item}
</foreach>
)
</select>

<!-- 同步,用与api数据比对后的 删除(使用升序排序更合理) -->
<select id="sync_batch_select_page" resultType="Map" parameterType="Map">
select ${primaryKeyName} from ${table_name}
where ${primaryKeyName} > ${"#"}{maxid}
order by ${primaryKeyName} asc limit ${"#"}{limit}
</select>

<!-- 同步批量插入 -->
<insert id="sync_batch_insert" parameterType="Map">
insert into ${table_name}(<#list columnList as item>${item.column_name}<#if item_has_next>,</#if></#list>)
values
<foreach collection="list" item="item" index="index" separator=",">
(<#list columnList as item>${"#"}{item.${item.column_name}}<#if item_has_next>,</#if></#list>)
</foreach>
</insert>

<!-- 同步批量更新 -->
<update id="sync_batch_update" parameterType="List">
<foreach collection="list" item="item" index="index" separator=";">
update ${table_name}
<set>
<#list columnList as item>
<#if item.column_key?? && item.column_key!="PRI" && item.column_name!="syscreatetime">
${item.column_name} = ${"#"}{item.${item.column_name}},
</#if>
</#list>
</set>
where ${primaryKeyName}= ${"#"}{item.${primaryKeyName}}
</foreach>
</update>

<!-- 同步批量删除 -->
<delete id="sync_batch_delete" parameterType="List">
delete from ${table_name} where ${primaryKeyName} in (
<foreach collection="list" item="item" index="index" separator=",">
${"#"}{item}
</foreach>
)
</delete>

<!-- ========================= 分隔线以下为生成的通用代码 ========================= -->
<!--
注意:
1、增加条件必须增加 _parameter.containsKey
2、修改字段手动更改此文件,不推荐重新生成后全部覆盖
-->

<!-- 通用查询条件 -->
<sql id="common_where">
<#list columnList as item>
<if test="_parameter.containsKey('where_${item.column_name}')">and t.${item.column_name} = ${"#"}{where_${item.column_name}}</if>
</#list>

<#list columnList as item>
<if test="_parameter.containsKey('like_${item.column_name}')">and t.${item.column_name} like concat('%',${"#"}{like_${item.column_name}},'%')</if>
</#list>

<if test="_parameter.containsKey('list_${primaryKeyName}')">
and t.${primaryKeyName} in
<foreach collection="list_${primaryKeyName}" item="item" open="(" separator="," close=")">
${"#"}{item}
</foreach>
</if>
</sql>
<!-- 通用查询记录 -->
<select id="selectList" resultType="java.util.LinkedHashMap">
select <#list columnList as item>t.${item.column_name}<#if item_has_next>,</#if></#list>
from ${table_name} t
<where>
<include refid="common_where" />
</where>
${orderBy}
<if test="_parameter.containsKey('__limit__')">
<#noparse>limit #{__limit__}</#noparse>
</if>
</select>

<!-- 通用查询记录总数 -->
<select id="selectCount" resultType="Integer">
select count(0) as cou from ${table_name} t
<where>
<include refid="common_where" />
</where>
</select>

<!-- 通用插入数据 -->
<insert id="insert">
insert into ${table_name}(
<trim suffixOverrides=",">
<#list columnList as item>
<if test="_parameter.containsKey('${item.column_name}')">${item.column_name},</if>
</#list>
</trim>)
values(
<trim suffixOverrides=",">
<#list columnList as item>
<if test="_parameter.containsKey('${item.column_name}')">${"#"}{${item.column_name}},</if>
</#list>
</trim>
)
</insert>

<!-- 通用更新数据 -->
<update id="update">
update ${table_name} t
<set>
<#list columnList as item>
<#if item.column_key?? && item.column_key!="PRI" || item.column_name?? && item.column_name != "id">
<if test="_parameter.containsKey('${item.column_name}')">t.${item.column_name} = ${"#"}{${item.column_name}},</if>
</#if>
</#list>
</set>
<where>
<include refid="common_where" />
</where>
</update>

<!-- 通用删除记录 -->
<delete id="delete">
delete t from ${table_name} t
<where>
<include refid="common_where" />
</where>
</delete>
</mapper>

+ 17
- 1
code-generator/src/test/TestCodeGenerator.java Ver ficheiro

@@ -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 生成
*/


Carregando…
Cancelar
Guardar