package com.monkeylessey.sys.service.impl; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.monkeylessey.gen.domain.ReturnColumn; import com.monkeylessey.gen.utils.WordsUtils; import com.monkeylessey.sys.domain.entity.SysGenSet; import com.monkeylessey.sys.domain.entity.SysTable; import com.monkeylessey.gen.domain.GenerateData; import com.monkeylessey.gen.utils.GenerateCodeUtil; import com.monkeylessey.sys.domain.vo.TableColumnVO; import com.monkeylessey.sys.mapper.SysGenSetMapper; import com.monkeylessey.sys.mapper.SysTableMapper; import com.monkeylessey.response.Result; import com.monkeylessey.sys.service.SysTableService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * @author 29443 * @date 2022/5/22 */ @Service @RequiredArgsConstructor public class SysTableServiceImpl implements SysTableService { private final List excludeTable = Arrays.asList("QRTZ_BLOB_TRIGGERS", "QRTZ_CALENDARS", "QRTZ_CRON_TRIGGERS", "QRTZ_FIRED_TRIGGERS", "QRTZ_JOB_DETAILS", "QRTZ_LOCKS", "QRTZ_PAUSED_TRIGGER_GRPS", "QRTZ_SCHEDULER_STATE", "QRTZ_SIMPLE_TRIGGERS", "QRTZ_SIMPROP_TRIGGERS", "QRTZ_TRIGGERS", "sys_file", "sys_op_log"); private final List excludeColumn = Arrays.asList("deleted"); private final SysTableMapper tableMapper; private final SysGenSetMapper genSetMapper; private final GenerateCodeUtil generateCodeUtil; @Override public Result getTableNames(String dataBaseName) { List tables = tableMapper.getTableNames(dataBaseName); List exclude = new ArrayList<>(); for (SysTable table : tables) { if (excludeTable.contains(table.getTableName())) { exclude.add(table); } } tables.removeAll(exclude); return Result.ok().data(tables); } @Override public Result getTableColumns(String tableName, String dataBaseName) throws JsonProcessingException { if (! StringUtils.hasText(dataBaseName) || ! StringUtils.hasText(tableName)) { throw new IllegalArgumentException("参数错误"); } List tableColumns = tableMapper.getTableColumns(tableName, dataBaseName); SysGenSet set = new LambdaQueryChainWrapper<>(genSetMapper) .eq(SysGenSet::getTableName, tableName) .one(); if (Objects.nonNull(set)) { ObjectMapper json = new ObjectMapper(); return Result.ok().data(json.readValue(set.getContent(), GenerateData.class).getColumns()); } List data = tableColumns.stream() .filter(item -> !excludeColumn.contains(item.getColumnName())) .collect(Collectors.toList()); data.stream().forEach(item -> { if (item.getColumnName().equals("id")) { item.setAddRequired(Boolean.FALSE); item.setEditRequired(Boolean.TRUE); } else { item.setAddRequired(Boolean.TRUE); item.setEditRequired(Boolean.TRUE); } item.setInputWay("input"); }); return Result.ok().data(data); } @Override public Result getTableColumnsSelect(String tableName, String dataBaseName, String keyword) { if (! StringUtils.hasText(dataBaseName) || ! StringUtils.hasText(tableName)) { throw new IllegalArgumentException("参数错误"); } List tableColumns = tableMapper.getTableColumnsSelect(tableName, dataBaseName, keyword); return Result.ok().data(tableColumns); } @Override public Result generateCode(GenerateData data) throws JsonProcessingException { data.getColumns().stream().forEach(item -> { // 处理一下,方便模板使用 if (!CollectionUtils.isEmpty(item.getReturnColumnList())) { item.getReturnColumnList().stream().forEach(returnC -> { returnC.setProperty(WordsUtils.convertToCamelCase(returnC.getColumn())); }); } // 转换类型 if ("int".equals(item.getColumnType())) { item.setColumnType("Integer"); } else if ("bigint".equals(item.getColumnType())) { item.setColumnType("Long"); } else if ("varchar".equals(item.getColumnType()) || "text".equals(item.getColumnType())) { item.setColumnType("String"); } else if ("char".equals(item.getColumnType())) { item.setColumnType("String"); } else if ("datetime".equals(item.getColumnType())) { item.setColumnType("LocalDateTime"); } if ("decimal".equals(item.getColumnType())) { item.setColumnType("BigDecimal"); } // 字段名转换 item.setPropertyName(WordsUtils.convertToCamelCase(item.getColumnName())); if (StringUtils.hasText(item.getRefTableName())) { item.setRefTableVoName(WordsUtils.firstWordToUp(WordsUtils.convertToCamelCase(item.getRefTableName())) + "VO"); item.setRefTableProperty(WordsUtils.firstWordToUp(WordsUtils.convertToCamelCase(item.getRefTableName())) + "VO"); } }); SysGenSet set = new LambdaQueryChainWrapper<>(genSetMapper) .eq(SysGenSet::getTableName, data.getTableName()) .one(); ObjectMapper json = new ObjectMapper(); String jstr = json.writeValueAsString(data); if (Objects.isNull(set)) { set = new SysGenSet(); set.setTableName(data.getTableName()); set.setContent(jstr); genSetMapper.insert(set); } else { set.setContent(jstr); genSetMapper.updateById(set); } generateCodeUtil.generateCode(data); return Result.ok("代码生成成功"); } }