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 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 list = tableColumnMapper.selectList(new QueryWrapper().eq("table_name", tableName)); if (list == null) { list = new ArrayList<>(); } List columnList = list.stream().map(TableColumn::getColumnName).toList(); List oriList = columnsMapper.selectList(new QueryWrapper().in("table_name", tableName)); if (oriList == null) { oriList = new ArrayList<>(); } List oriColumns = oriList.stream().map(Columns::getColumnName).toList(); Tables tables = tablesMapper.selectOne(new QueryWrapper().eq("table_name", tableName)); List 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 tablesList = tablesMapper.selectList(new QueryWrapper().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 getTablesInfo() { return tableColumnMapper.getTablesInfo(); } @Override public List 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> 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); } }