package com.highdatas.mdm.controller;
|
|
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.baomidou.mybatisplus.mapper.Wrapper;
|
import com.highdatas.mdm.entity.*;
|
import com.highdatas.mdm.pojo.CodeMsg;
|
import com.highdatas.mdm.pojo.Result;
|
import com.highdatas.mdm.pojo.SysAssembleTableType;
|
import com.highdatas.mdm.pojo.kettle.BigDataDataSourceInfo;
|
import com.highdatas.mdm.pojo.kettle.DataSourceInfo;
|
import com.highdatas.mdm.pojo.kettle.UnBigDataDataSourceInfo;
|
import com.highdatas.mdm.service.*;
|
import com.highdatas.mdm.util.Constant;
|
import com.highdatas.mdm.util.DbUtils;
|
import com.highdatas.mdm.util.RedisClient;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.web.bind.annotation.*;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.text.MessageFormat;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Set;
|
import java.util.stream.Collectors;
|
|
/**
|
* <p>
|
* 前端控制器
|
* </p>
|
* @desctiption 汇集源表接口
|
* @author kimi
|
* @since 2020-02-20
|
*/
|
@RestController
|
@RequestMapping("/assemble/db/table")
|
public class SysAssembleDbTableController {
|
@Autowired
|
ISysAssembleService assembleService;
|
@Autowired
|
ISysAssembleDbService dbService;
|
@Autowired
|
ISysAssembleDbTableService dbTableService;
|
@Autowired
|
ISysAssembleDbFieldService dbFieldService;
|
@Autowired
|
ISysAssembleParamsService paramsService;
|
@Autowired
|
UnBigDataDataSourceInfo unBigDataDataSourceInfo;
|
@Autowired
|
BigDataDataSourceInfo bigDataDataSourceInfo;
|
@Autowired
|
RedisClient redisClient;
|
|
/**
|
*
|
* @description: 获取汇集任务用到的源表list
|
* @param id 数据源id
|
* @return: 源表list
|
*
|
*/
|
@RequestMapping(value = "/get/parent/{id}", method = RequestMethod.GET)
|
public Result get(@PathVariable String id, HttpServletRequest request) {
|
//获取数据源信息
|
SysAssembleDb sysAssembleDb = dbService.selectById(id);
|
if (sysAssembleDb == null) {
|
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
|
}
|
//check 是否需要额外字段
|
Wrapper<SysAssembleDbTable> parentWrapper = new EntityWrapper<SysAssembleDbTable>().eq(Constant.PARENT_ID, id);
|
List<SysAssembleDbTable> sysAssembleDbs = dbTableService.selectList(parentWrapper);
|
return Result.success(sysAssembleDbs);
|
|
}
|
|
/**
|
*
|
* @description: 删除汇集任务用到的源表
|
* @param id 源表id
|
* @return: 源表
|
*
|
*/
|
@Transactional(rollbackFor=Exception.class)
|
@RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
|
public Result delete(@PathVariable String id) {
|
SysAssembleDbTable sysAssembleDb = dbTableService.selectById(id);
|
if (sysAssembleDb == null) {
|
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
|
}
|
boolean delete = dbFieldService.delete(new EntityWrapper<SysAssembleDbField>().eq("parent_id", id));
|
if (!delete) {
|
return Result.error(CodeMsg.DELETE_ERROR);
|
}
|
delete = sysAssembleDb.deleteById();
|
|
if (delete) {
|
return Result.success(sysAssembleDb);
|
} else {
|
return Result.error(CodeMsg.DELETE_ERROR);
|
}
|
}
|
|
/**
|
*
|
* @description: 获取汇集任务用到的源表
|
* @param id 源表id
|
* @return: 源表信息
|
*
|
*/
|
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
|
public Result get(@PathVariable String id) {
|
SysAssembleDbTable sysAssembleDb = dbTableService.selectById(id);
|
if (sysAssembleDb == null) {
|
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
|
}
|
//获取原表关联的字段list
|
Wrapper<SysAssembleDbField> fieldWrapper = new EntityWrapper<SysAssembleDbField>().eq(Constant.PARENT_ID, id);
|
List<SysAssembleDbField> sysAssembleDbFields = dbFieldService.selectList(fieldWrapper);
|
sysAssembleDb.setFieldList(sysAssembleDbFields);
|
return Result.success(sysAssembleDb);
|
}
|
|
/**
|
*
|
* @description: 获取原表用到的字段list
|
* @param id 源表id
|
* @return: 字段list
|
*
|
*/
|
@RequestMapping(value = "/getField/{id}", method = RequestMethod.GET)
|
public Result check(@PathVariable String id) {
|
SysAssembleDbTable sysAssembleDb = dbTableService.selectById(id);
|
if (sysAssembleDb == null) {
|
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
|
}
|
Wrapper<SysAssembleDbField> fieldWrapper = new EntityWrapper<SysAssembleDbField>().eq(Constant.PARENT_ID, id);
|
List<SysAssembleDbField> sysAssembleDbFields = dbFieldService.selectList(fieldWrapper);
|
sysAssembleDb.setFieldList(sysAssembleDbFields);
|
return Result.success(sysAssembleDb);
|
}
|
/**
|
*
|
* @description: 获取源sql用到的字段list
|
* @param id 源sql id
|
* @return: 字段list
|
*
|
*/
|
@RequestMapping(value = "/getSqlField/{id}", method = RequestMethod.GET)
|
public Result getSqlField(@PathVariable String id) {
|
SysAssembleDbTable sysAssembleDb = dbTableService.selectById(id);
|
if (sysAssembleDb == null || !sysAssembleDb.getType().equals(SysAssembleTableType.sql)) {
|
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
|
}
|
String sql = sysAssembleDb.getSql();
|
//通过sql 获取字段;list
|
List<String> fieldsBySql = dbService.getFieldsBySql(sysAssembleDb.getParentId(), sql);
|
|
return Result.success(fieldsBySql);
|
}
|
|
/**
|
*
|
* @description: 更新源表的筛选sql
|
* @param id 源表id
|
* @return: 源表信息
|
*
|
*/
|
@RequestMapping(value = "/setFilterSql/{id}", method = RequestMethod.GET)
|
public Result setFilterSql(@PathVariable String id,@RequestParam String filter, HttpServletRequest request) {
|
SysAssembleDbTable sysAssembleDbTable = dbTableService.selectById(id);
|
if (sysAssembleDbTable == null) {
|
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
|
}
|
sysAssembleDbTable.setFilter(filter).updateById();
|
return Result.success(sysAssembleDbTable);
|
}
|
|
/**
|
*
|
* @description: 测试源表的filter sql
|
* @param id 汇集任务id
|
* @return: 是否通过
|
*
|
*/
|
@RequestMapping(value = "/testFilter/{id}", method = RequestMethod.GET)
|
public Result testFilter(@PathVariable String id, @RequestParam String filter) {
|
SysAssembleDbTable sysAssembleDbTable = dbTableService.selectById(id);
|
if (sysAssembleDbTable == null) {
|
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
|
}
|
String parentId = sysAssembleDbTable.getParentId();
|
if (StringUtils.isEmpty(parentId)) {
|
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
|
}
|
SysAssembleDb sysAssembleDb = dbService.selectById(parentId);
|
if (sysAssembleDb == null) {
|
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
|
}
|
String assembleId = sysAssembleDb.getParentId();
|
//获取字段信息
|
List<SysAssembleDbField> fieldList = dbFieldService.selectList(new EntityWrapper<SysAssembleDbField>().eq(Constant.PARENT_ID, id));
|
String fields = fieldList.stream().map(SysAssembleDbField::getField).collect(Collectors.joining(Constant.COMMA));
|
SysAssembleTableType type = sysAssembleDbTable.getType();
|
String tableName = null;
|
//获取内部的子表
|
if (type.equals(SysAssembleTableType.sql)) {
|
tableName = sysAssembleDbTable.getSql();
|
} else if (type.equals(SysAssembleTableType.table)) {
|
tableName = sysAssembleDbTable.getTableName();
|
}
|
|
//组装filter
|
if (StringUtils.isEmpty(filter)) {
|
filter = Constant.WHERE_DEFAULT;
|
} else {
|
//有变量的需要替换掉
|
Set<String> matcher = DbUtils.matcher(filter);
|
for (String code : matcher) {
|
SysAssembleParams sysAssembleParams = paramsService.selectOne(new EntityWrapper<SysAssembleParams>().eq(Constant.PARENT_ID, assembleId).eq(Constant.Code, code));
|
if (sysAssembleParams == null){
|
return Result.error(new CodeMsg(6009, assembleId + "有变量未匹配到:"+ code));
|
}
|
String val = sysAssembleParams.getVal();
|
if (StringUtils.isEmpty(val)) {
|
return Result.error(new CodeMsg(6009, assembleId + "有变量未获取到值:"+ code));
|
}
|
val = DbUtils.quotedStr(val);
|
filter = filter.replace(DbUtils.assemblParam(code), val);
|
}
|
}
|
//根据不同类型走不同的sql
|
String runSqlTemplate = null;
|
if (type.equals(SysAssembleTableType.table)){
|
runSqlTemplate = Constant.selectFieldTableTemplate;
|
}else if(type.equals(SysAssembleTableType.sql)){
|
runSqlTemplate = Constant.selectFieldSqlTemplate;
|
}
|
//组装sql
|
String sql = MessageFormat.format(runSqlTemplate, fields, tableName, filter);
|
boolean b = dbService.testSql(parentId, sql);
|
return Result.success(b);
|
}
|
|
/**
|
*
|
* @description: 添加或者更新源表信息
|
* @return: 是否更新成功
|
*
|
*/
|
@ResponseBody
|
@RequestMapping(value = "/addOrUpdate", method = RequestMethod.POST)
|
public Result addOne(@RequestBody SysAssembleDbTable sysAssembleDb) {
|
if (sysAssembleDb == null) {
|
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
|
}
|
//校验必传字段
|
if (StringUtils.isEmpty(sysAssembleDb.getId())) {
|
sysAssembleDb.setId(DbUtils.getUUID());
|
if (StringUtils.isEmpty(sysAssembleDb.getSqlId()) && sysAssembleDb.getType().equals(SysAssembleTableType.sql)) {
|
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
|
}
|
}
|
|
if (StringUtils.isEmpty(sysAssembleDb.getTableName()) && sysAssembleDb.getType().equals(SysAssembleTableType.table)){
|
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
|
}
|
|
SysAssemble assemble = assembleService.selectById(sysAssembleDb.getAssembleId());
|
if (assemble == null) {
|
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
|
}
|
Boolean bigdata = assemble.getBigdata();
|
DataSourceInfo dataSourceInfo = null;
|
if (bigdata) {
|
dataSourceInfo = bigDataDataSourceInfo;
|
}else {
|
dataSourceInfo = unBigDataDataSourceInfo;
|
}
|
//获取字段列表
|
List<String> fieldStrList = sysAssembleDb.getFieldList().stream().map(SysAssembleDbField::getField).collect(Collectors.toList());
|
String suffix = null;
|
try {
|
suffix = DbUtils.Bit16(assemble.getId());
|
} catch (Exception e) {
|
e.printStackTrace();
|
suffix = DbUtils.getUUID(16);
|
}
|
//生成临时表名
|
String tempTableName = null;
|
if (sysAssembleDb.getType().equals(SysAssembleTableType.table)) {
|
tempTableName = (Constant.AssembleTempTable + sysAssembleDb.getTableName() + Constant.UnderLine + suffix);
|
}else {
|
tempTableName = (Constant.AssembleTempSql + DbUtils.getUUID(5) + Constant.UnderLine + suffix);
|
String redisVal = redisClient.getRedisVal(sysAssembleDb.getSqlId());
|
if (StringUtils.isEmpty(redisVal)) {
|
return Result.error(new CodeMsg(6008,"获取sql失败"));
|
}
|
sysAssembleDb.setSql(redisVal);
|
redisClient.deleteRedisVal(sysAssembleDb.getSqlId());
|
}
|
|
sysAssembleDb.setTempTableName(tempTableName);
|
//创建汇集用到的临时表
|
boolean created = dataSourceInfo.createTable(tempTableName, fieldStrList);
|
if (!created) {
|
return Result.error(new CodeMsg(6008,"创建表失败:" + tempTableName));
|
}
|
boolean update = sysAssembleDb.insertOrUpdate();
|
if (update) {
|
// update field
|
boolean delete = dbFieldService.delete(new EntityWrapper<SysAssembleDbField>().eq(Constant.PARENT_ID, sysAssembleDb.getId()));
|
if (!delete) {
|
return Result.error(CodeMsg.DELETE_ERROR);
|
}
|
List<SysAssembleDbField> fieldList = sysAssembleDb.getFieldList();
|
for (SysAssembleDbField sysAssembleDbField : fieldList) {
|
sysAssembleDbField.setId(DbUtils.getUUID()).setCreateTime(new Date()).setParentId(sysAssembleDb.getId()).insert();
|
}
|
return Result.success(sysAssembleDb);
|
}else {
|
return Result.error(CodeMsg.UPDATE_ERROR);
|
}
|
}
|
}
|