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.sql.Connection; import java.text.MessageFormat; import java.util.Date; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** *

* 前端控制器 *

* * @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; @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); } @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); } } @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); } Wrapper fieldWrapper = new EntityWrapper().eq(Constant.PARENT_ID, id); List sysAssembleDbFields = dbFieldService.selectList(fieldWrapper); sysAssembleDb.setFieldList(sysAssembleDbFields); return Result.success(sysAssembleDb); } @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); } @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(); List fieldsBySql = dbService.getFieldsBySql(sysAssembleDb.getParentId(), sql); return Result.success(fieldsBySql); } @RequestMapping(value = "/setFilterSql/{id}", method = RequestMethod.GET) public Result setFilterSql(@PathVariable String id,@RequestParam String filter, HttpServletRequest request) { //TODO 对filter 做检验? SysAssembleDbTable sysAssembleDbTable = dbTableService.selectById(id); if (sysAssembleDbTable == null) { return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED); } sysAssembleDbTable.setFilter(filter).updateById(); return Result.success(sysAssembleDbTable); } @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(); } 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); } String runSqlTemplate = null; if (type.equals(SysAssembleTableType.table)){ runSqlTemplate = Constant.selectFieldTableTemplate; }else if(type.equals(SysAssembleTableType.sql)){ runSqlTemplate = Constant.selectFieldSqlTemplate; } String sql = MessageFormat.format(runSqlTemplate, fields, tableName, filter); boolean b = dbService.testSql(parentId, sql); return Result.success(b); } @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); } } }