iet-kpi-service/src/main/java/iet/ustb/sf/service/impl/TableColumnServiceImpl.java

152 lines
5.6 KiB
Java

package iet.ustb.sf.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlRunner;
import iet.ustb.sf.domain.Columns;
import iet.ustb.sf.domain.TableColumn;
import iet.ustb.sf.domain.Tables;
import iet.ustb.sf.exception.ThrowUtils;
import iet.ustb.sf.mapper.ColumnsMapper;
import iet.ustb.sf.mapper.TablesMapper;
import iet.ustb.sf.service.TableColumnService;
import iet.ustb.sf.mapper.TableColumnMapper;
import iet.ustb.sf.util.CheckUtils;
import iet.ustb.sf.vo.ColumnVo;
import iet.ustb.sf.vo.TableVo;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author hyy
* @description 针对表【mbgk_table_column】的数据库操作Service实现
* @createDate 2025-08-05 12:33:36
*/
@Service
public class TableColumnServiceImpl extends ServiceImpl<TableColumnMapper, TableColumn>
implements TableColumnService {
@Resource
private TableColumnMapper tableColumnMapper;
@Resource
private TablesMapper tablesMapper;
@Resource
private ColumnsMapper columnsMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public String syncTableData(String tableName) {
CheckUtils.checkTableName(tableName);
List<TableColumn> list = tableColumnMapper.selectList(new QueryWrapper<TableColumn>().eq("table_name", tableName));
if (list == null) {
list = new ArrayList<>();
}
List<String> columnList = list.stream().map(TableColumn::getColumnName).toList();
List<Columns> oriList = columnsMapper.selectList(new QueryWrapper<Columns>().in("table_name", tableName));
if (oriList == null) {
oriList = new ArrayList<>();
}
List<String> oriColumns = oriList.stream().map(Columns::getColumnName).toList();
Tables tables = tablesMapper.selectOne(new QueryWrapper<Tables>().eq("table_name", tableName));
List<TableColumn> saveList = new ArrayList<>();
Date now = new Date();
int addCount = 0;
for (Columns columns : oriList) {
if (columnList.contains(columns.getColumnName())) {
continue;
}
TableColumn ori = TableColumn.builder()
.id(UUID.randomUUID().toString())
.tableName(tableName)
.tableNameCn(tables.getTableComment())
.columnName(columns.getColumnName())
.columnNameCn(columns.getColumnComment())
.colnumnType(columns.getDataType())
.schema(columns.getTableSchema())
.isDelete(0)
.isPrimary("UNI".equals(columns.getColumnKey()) ? 1 : 0)
.createTime(now)
.updateTime(now)
.sort(list.size())
.build();
saveList.add(ori);
list.add(ori);
addCount++;
}
int delCount = 0;
for (TableColumn tableColumn : list) {
if (!oriColumns.contains(tableColumn.getColumnName())) {
tableColumn.setIsDelete(1);
tableColumn.setUpdateTime(now);
saveList.add(tableColumn);
delCount++;
}
}
tableColumnMapper.insert(saveList);
return "添加" + addCount + "个字段,删除" + delCount + "个字段";
}
@Override
@Transactional(rollbackFor = Exception.class)
public String syncTableDataByDb(String dbName) {
List<Tables> tablesList = tablesMapper.selectList(new QueryWrapper<Tables>().eq("table_schema", dbName));
ThrowUtils.throwIf(tablesList.size() <= 0, new RuntimeException("数据库不存在!"));
StringBuilder result = new StringBuilder();
for (Tables tables : tablesList) {
String tableName = tables.getTableName();
result.append("\n" + "数据库表:").append(tableName);
result.append(syncTableData(tableName));
}
return result.toString();
}
@Override
public List<TableVo> getTablesInfo() {
return tableColumnMapper.getTablesInfo();
}
@Override
public List<ColumnVo> getColumnsByTableName(String tableName) {
CheckUtils.checkTableName(tableName);
return tableColumnMapper.getColumnsByTableName(tableName);
}
@Override
public Page<?> getDataByTableName(JSONObject params) {
String columns = params.getString("columns");
String tableName = params.getString("tableName");
int pageIndex = Optional.ofNullable(params.getInteger("pageIndex")).orElse(1);
int pageSize = Optional.ofNullable(params.getInteger("pageSize")).orElse(10);
if (StringUtils.isEmpty(columns)) {
return new Page<>(pageIndex, pageSize);
}
CheckUtils.checkColumns(columns, tableName);
String countSql = "SELECT COUNT(1) FROM " + tableName;
long total = SqlRunner.db().selectCount(countSql);
Page<Map<String, Object>> page = new Page<>(pageIndex, pageSize);
page.setTotal(total);
long offset = (long) (pageIndex - 1) * pageSize;
String sql = "SELECT " + columns + " FROM " + tableName + " LIMIT " + pageSize + " OFFSET " + offset;
return SqlRunner.db().selectPage(page, sql);
}
}