package com.highdatas.mdm.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.highdatas.mdm.entity.SysAssemble;
import com.highdatas.mdm.entity.SysAssembleDb;
import com.highdatas.mdm.entity.SysAssembleDbField;
import com.highdatas.mdm.entity.SysAssembleDbTable;
import com.highdatas.mdm.pojo.CodeMsg;
import com.highdatas.mdm.pojo.Result;
import com.highdatas.mdm.service.ISysAssembleDbFieldService;
import com.highdatas.mdm.service.ISysAssembleDbService;
import com.highdatas.mdm.service.ISysAssembleDbTableService;
import com.highdatas.mdm.service.ISysAssembleService;
import com.highdatas.mdm.util.Constant;
import com.highdatas.mdm.util.DbUtils;
import lombok.extern.slf4j.Slf4j;
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.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 前端控制器
*
*
* @author kimi
* @since 2020-02-19
*/
@RestController
@Slf4j
@RequestMapping("/assemble/db")
public class SysAssembleDbController {
@Autowired
ISysAssembleDbService dbService;
@Autowired
ISysAssembleDbTableService dbTableService;
@Autowired
ISysAssembleDbFieldService dbFieldService;
@Autowired
ISysAssembleService assembleService;
/**
*
* @description: 通过汇集id获取保存的源信息
* @param id 汇集id
* @return: 源list
*
*/
@RequestMapping(value = "/get/parent/{id}", method = RequestMethod.GET)
public Result get(@PathVariable String id, HttpServletRequest request) {
//通过assemble 获取汇集信息
SysAssemble assemble = assembleService.selectById(id);
if (assemble == null) {
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
}
//未分页 看需求 cnt
Wrapper parentWrapper = new EntityWrapper().eq(Constant.PARENT_ID, id);
List sysAssembleDbs = dbService.selectList(parentWrapper);
ArrayList result = new ArrayList<>();
for (SysAssembleDb sysAssembleDb : sysAssembleDbs) {
JSONObject o = (JSONObject) JSON.toJSON(sysAssembleDb);
String dbId = sysAssembleDb.getId();
Wrapper eq = new EntityWrapper().eq(Constant.PARENT_ID, dbId);
int i = dbTableService.selectCount(eq);
o.fluentPut("cnt", i);
o.fluentPut("type", "db");
result.add(o);
}
return Result.success(result);
}
/**
*
* @description: 测试连接
* @param id 数据源id
* @return: 测试连接结果
*
*/
@RequestMapping(value = "/testConnection/{id}", method = RequestMethod.GET)
public Result testConnection(@PathVariable String id, HttpServletRequest request) {
boolean b = dbService.testConnection(id);
return Result.success(b);
}
/**
*
* @description: 测试连接
* @param id 数据源id
* @return: 测试连接结果
*
*/
@ResponseBody
@RequestMapping(value = "/testConnection", method = RequestMethod.POST)
public Result testConnection(@RequestBody SysAssembleDb sysAssembleDb) {
if (sysAssembleDb == null) {
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
}
boolean b = dbService.testConnection(sysAssembleDb);
return Result.success(b);
}
/**
*
* @description: 获取目前用到的数据源list
* @return: 数据源list
*
*/
@RequestMapping(value = "/getSet", method = RequestMethod.GET)
public Result getSet(HttpServletRequest request) {
List dbList = dbService.selectList(null);
HashSet result = new HashSet<>();
for (SysAssembleDb sysAssembleDb : dbList) {
result.add(sysAssembleDb.getDatasourceName());
}
return Result.success(result);
}
/**
*
* @description: 数据源获取表list
* @param id 数据源id
* @return: 源表list
*
*/
@RequestMapping(value = "/getTableList/{id}", method = RequestMethod.GET)
public Result getTable(@PathVariable String id, HttpServletRequest request) {
Connection connection = null;
try {
SysAssembleDb sysAssembleDb = dbService.selectById(id);
String username = sysAssembleDb.getDatasourceUser();
connection = dbService.getConnection(id);
DatabaseMetaData metaData = connection.getMetaData();
String dbStr = sysAssembleDb.toString();
log.info(dbStr);
ResultSet tables = metaData.getTables(null, "%", "%", new String[]{ "TABLE" } );
ArrayList tableNameList = new ArrayList<>();
while (tables.next()) {
String tableName = tables.getString(Constant.TABLE_NAME);
log.info(tableName);
tableNameList.add(tableName);
}
List tableList = dbTableService.selectList(new EntityWrapper().eq(Constant.PARENT_ID, id));
List selectedTableNameList = tableList.stream().map(sysAssembleDbTable -> sysAssembleDbTable.getTableName()).collect(Collectors.toList());
List result = tableNameList.stream().filter(s -> !selectedTableNameList.contains(s)).collect(Collectors.toList());
return Result.success(result);
}
catch (Exception e) {
e.printStackTrace();
return Result.error(new CodeMsg(6003, e.getMessage()));
}
finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
return Result.error(new CodeMsg(6003, e.getMessage()));
}
}
}
}
/**
*
* @description: 源表获取字段list
* @param id 数据源表id
* @return: 源表字段list
*
*/
@RequestMapping(value = "/getFields/{id}", method = RequestMethod.GET)
public Result getFields(@PathVariable String id, @RequestParam String tableName, HttpServletRequest request) {
List fieldsByTableName = dbService.getFieldsByTableName(id, tableName);
if (fieldsByTableName == null){
return Result.error(new CodeMsg(6008, "获取字段失败"));
}
return Result.success(fieldsByTableName);
}
/**
*
* @description: 删除数据源
* @param id 数据源id
* @return: 删除结果
*
*/
@Transactional(rollbackFor=Exception.class)
@RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
public Result delete(@PathVariable String id) {
SysAssembleDb sysAssembleDb = dbService.selectById(id);
if (sysAssembleDb == null) {
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
}
// delete tables;
Wrapper tablesWrapper = new EntityWrapper().eq("parent_id", id);
List sysAssembleDbTables = dbTableService.selectList(tablesWrapper);
for (SysAssembleDbTable dbTable : sysAssembleDbTables) {
String tableId = dbTable.getId();
boolean delete = dbFieldService.delete(new EntityWrapper().eq("parent_id", tableId));
if (delete) {
delete = dbTable.deleteById();
if (!delete) {
return Result.error(CodeMsg.DELETE_ERROR);
}
}else {
return Result.error(CodeMsg.DELETE_ERROR);
}
}
boolean delete = sysAssembleDb.deleteById();
if (delete) {
return Result.success(sysAssembleDb);
}else {
return Result.error(CodeMsg.UPDATE_ERROR);
}
}
/**
*
* @description: 添加数据源
* @return: 数据源添加结果
*
*/
@ResponseBody
@RequestMapping(value = "/addOrUpdate", method = RequestMethod.POST)
public Result addOne(@RequestBody SysAssembleDb sysAssembleDb) {
if (sysAssembleDb == null) {
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
}
if (StringUtils.isEmpty(sysAssembleDb.getId())) {
sysAssembleDb.setId(DbUtils.getUUID()).setCreateTime(new Date());
}
sysAssembleDb.setUpdateTime(new Date());
boolean update = sysAssembleDb.insertOrUpdate();
if (update) {
return Result.success(sysAssembleDb);
}else {
return Result.error(CodeMsg.UPDATE_ERROR);
}
}
}