package jnpf.base.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.Operation; import jnpf.base.ActionResult; import jnpf.base.model.dbsync.DbSyncForm; import jnpf.base.model.dbsync.DbSyncVo; import jnpf.base.service.DbLinkService; import jnpf.base.service.DbSyncService; import jnpf.base.service.DbTableService; import jnpf.constant.MsgCode; import jnpf.database.datatype.db.interfaces.DtInterface; import jnpf.database.datatype.sync.util.DtSyncUtil; import jnpf.database.model.dto.PrepSqlDTO; import jnpf.database.model.entity.DbLinkEntity; import jnpf.database.sql.util.SqlFastUtil; import jnpf.database.util.DataSourceUtil; import lombok.Cleanup; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.sql.Connection; import java.util.*; /** * 数据同步 * * @author JNPF开发平台组 * @version V3.1.0 * @copyright 引迈信息技术有限公司(https://www.jnpfsoft.com) * @date 2019年9月27日 上午9:18 */ @Tag(name = "数据同步", description = "DataSync") @RestController @RequestMapping("/DataSync") public class DataSyncController { @Autowired private DbSyncService dbSyncService; @Autowired private DbLinkService dblinkService; @Autowired private DbTableService dbTableService; @Autowired private DataSourceUtil dataSourceUtil; /** * 验证连接 * * @param dbSyncForm 页面参数 * @return * @throws Exception */ @Operation(summary = "验证连接") @Parameters({ @Parameter(name = "dbSyncForm", description = "页面参数", required = true) }) @SaCheckPermission("systemData.dataSync") @PostMapping("/Actions/checkDbLink") public ActionResult checkDbLink(@RequestBody DbSyncForm dbSyncForm) throws Exception { String fromDbType; String toDbType; DbSyncVo vo = new DbSyncVo(); try { DbLinkEntity dbLinkEntity = dblinkService.getResource(dbSyncForm.getDbConnectionFrom()); DbLinkEntity dbLinkEntity1 = dblinkService.getResource(dbSyncForm.getDbConnectionTo()); fromDbType = dbLinkEntity.getDbType(); toDbType = dbLinkEntity1.getDbType(); @Cleanup Connection conn = PrepSqlDTO.getConn(dbLinkEntity); @Cleanup Connection conn1 = PrepSqlDTO.getConn(dbLinkEntity1); if (conn.getMetaData().getURL().equals(conn1.getMetaData().getURL())) { return ActionResult.fail(MsgCode.SYS011.get()); } vo.setCheckDbFlag(true); vo.setTableList(SqlFastUtil.getTableList(dbLinkEntity, null)); // 字段类型全部对应关系 Map> ruleMap = getConvertRules(fromDbType, toDbType).getData(); Map defaultRuleMap = getDefaultRules(fromDbType, toDbType).getData(); // 默认类型置顶 for (String key : defaultRuleMap.keySet()) { List list = ruleMap.get(key); if(list != null){ String rule = defaultRuleMap.get(key); list.remove(rule); list.add(0, rule + " (默认)"); ruleMap.put(key, list); } } vo.setConvertRuleMap(ruleMap); }catch (Exception e){ return ActionResult.fail(MsgCode.DB302.get()); } return ActionResult.success(vo); } /** * 执行数据同步 * * @param dbSyncForm 数据同步参数 * @return ignore */ @Operation(summary = "数据同步校验") @Parameters({ @Parameter(name = "dbSyncForm", description = "页面参数", required = true) }) @SaCheckPermission("systemData.dataSync") @PostMapping public ActionResult checkExecute(@RequestBody DbSyncForm dbSyncForm) { int status; try { status = dbSyncService.executeCheck(dbSyncForm.getDbConnectionFrom(), dbSyncForm.getDbConnectionTo(), dbSyncForm.getConvertRuleMap(), dbSyncForm.getDbTable()); } catch (Exception e) { e.printStackTrace(); return ActionResult.fail(e.getMessage()); } if (status == -1) { return ActionResult.fail(MsgCode.SYS012.get()); } return ActionResult.success(status); } /** * 执行数据同步 * * @param dbSyncForm 数据同步参数 * @return ignore */ @Operation(summary = "执行数据同步") @Parameters({ @Parameter(name = "dbSyncForm", description = "页面参数", required = true) }) @SaCheckPermission("systemData.dataSync") @PostMapping("/Actions/Execute") public ActionResult execute(@RequestBody DbSyncForm dbSyncForm) { try{ dbSyncService.execute(dbSyncForm.getDbConnectionFrom(), dbSyncForm.getDbConnectionTo(), dbSyncForm.getConvertRuleMap(), dbSyncForm.getDbTable()); }catch (Exception e){ e.printStackTrace(); return ActionResult.fail(MsgCode.SYS013.get(e.getMessage())); } return ActionResult.success(MsgCode.SU005.get()); } /** * 批量执行数据同步 * * @param dbSyncForm 数据同步参数 * @return ignore * @throws Exception ignore */ @Operation(summary = "批量执行数据同步") @Parameters({ @Parameter(name = "dbSyncForm", description = "页面参数", required = true) }) @SaCheckPermission("systemData.dataSync") @PostMapping("/Actions/batchExecute") public ActionResult> batchExecute(@RequestBody DbSyncForm dbSyncForm) throws Exception { Map result = dbSyncService.executeBatch(dbSyncForm.getDbConnectionFrom(), dbSyncForm.getDbConnectionTo(), dbSyncForm.getConvertRuleMap(), dbSyncForm.getDbTableList()); return ActionResult.success(MsgCode.SU005.get(), result); } /** * 获取数据类型默认转换规则 * 一对一 * @param fromDbType 被转换数据库类型 * @param toDbType 转换数据库类型 * @return 转换规则 * @throws Exception 未找到数库 */ @GetMapping("/Actions/getDefaultRules") @SaCheckPermission("systemData.dataSync") @Operation(summary = "获取一对一数据类型默认转换规则") public static ActionResult> getDefaultRules(String fromDbType, String toDbType) throws Exception{ Map map = new LinkedHashMap<>(); for (DtInterface dtInterface : DtInterface.getClz(fromDbType).getEnumConstants()) { DtInterface toFixCovert = DtSyncUtil.getToFixCovert(dtInterface, toDbType); if(toFixCovert != null){ map.put(dtInterface.getDataType(), toFixCovert.getDataType()); } } return ActionResult.success(map); } /** * 获取数据类型转换规则 * 一对多 * @param fromDbType 被转换数据库类型 * @param toDbType 转换数据库类型 * @return 转换规则 * @throws Exception 未找到数库 */ @Operation(summary = "获取一对多数据类型转换规则") @SaCheckPermission("systemData.dataSync") @GetMapping("/Actions/getConvertRules") public static ActionResult>> getConvertRules(String fromDbType, String toDbType) throws Exception{ Map> map = new LinkedHashMap<>(); for (DtInterface dtInterface : DtInterface.getClz(fromDbType).getEnumConstants()) { List list = new LinkedList<>(); DtInterface[] allConverts = DtSyncUtil.getAllConverts(dtInterface, toDbType); if(allConverts != null){ for (DtInterface allConvert : allConverts) { list.add(allConvert.getDataType()); } map.put(dtInterface.getDataType(), list); } } return ActionResult.success(map); } }