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; /** *

* 前端控制器 *

* @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 parentWrapper = new EntityWrapper().eq(Constant.PARENT_ID, id); List 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().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 fieldWrapper = new EntityWrapper().eq(Constant.PARENT_ID, id); List 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 fieldWrapper = new EntityWrapper().eq(Constant.PARENT_ID, id); List 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 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 fieldList = dbFieldService.selectList(new EntityWrapper().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 matcher = DbUtils.matcher(filter); for (String code : matcher) { SysAssembleParams sysAssembleParams = paramsService.selectOne(new EntityWrapper().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 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().eq(Constant.PARENT_ID, sysAssembleDb.getId())); if (!delete) { return Result.error(CodeMsg.DELETE_ERROR); } List 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); } } }