package com.oying.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ZipUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import com.oying.utils.FileUtil; import com.oying.utils.PageResult; import com.oying.utils.PageUtil; import com.oying.utils.StringUtils; import com.oying.domain.GenConfig; import com.oying.domain.ColumnInfo; import com.oying.domain.dto.TableInfo; import com.oying.exception.BadRequestException; import com.oying.mapper.ColumnInfoMapper; import com.oying.service.GeneratorService; import com.oying.utils.GenUtil; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author Z * @date 2019-01-02 */ @Slf4j @Service @RequiredArgsConstructor public class GeneratorServiceImpl extends ServiceImpl implements GeneratorService { private final ColumnInfoMapper columnInfoMapper; private final String CONFIG_MESSAGE = "请先配置生成器"; @Override public PageResult getTables(String name, Page page) { return PageUtil.toPage(columnInfoMapper.getTables(name, page)); } @Override @Transactional(rollbackFor = Exception.class) public List getColumns(String tableName) { List columnInfos = columnInfoMapper.findByTableNameOrderByIdAsc(tableName); if (CollectionUtil.isNotEmpty(columnInfos)) { return columnInfos; } else { columnInfos = query(tableName); saveBatch(columnInfos); return columnInfos; } } @Override public List query(String tableName) { List columnInfos = columnInfoMapper.getColumns(tableName); for (ColumnInfo columnInfo : columnInfos) { columnInfo.setTableName(tableName); if(GenUtil.PK.equalsIgnoreCase(columnInfo.getKeyType()) && GenUtil.EXTRA.equalsIgnoreCase(columnInfo.getExtra())){ columnInfo.setNotNull(false); } } return columnInfos; } @Override @Transactional(rollbackFor = Exception.class) public void sync(List columnInfos, List columnInfoList) { // 第一种情况,数据库类字段改变或者新增字段 for (ColumnInfo columnInfo : columnInfoList) { // 根据字段名称查找 List columns = columnInfos.stream().filter(c -> c.getColumnName().equals(columnInfo.getColumnName())).collect(Collectors.toList()); // 如果能找到,就修改部分可能被字段 if (CollectionUtil.isNotEmpty(columns)) { ColumnInfo column = columns.get(0); column.setColumnType(columnInfo.getColumnType()); column.setExtra(columnInfo.getExtra()); column.setKeyType(columnInfo.getKeyType()); if (StringUtils.isBlank(column.getRemark())) { column.setRemark(columnInfo.getRemark()); } saveOrUpdate(column); } else { // 如果找不到,则保存新字段信息 save(columnInfo); } } // 第二种情况,数据库字段删除了 for (ColumnInfo columnInfo : columnInfos) { // 根据字段名称查找 List columns = columnInfoList.stream().filter(c -> c.getColumnName().equals(columnInfo.getColumnName())).collect(Collectors.toList()); // 如果找不到,就代表字段被删除了,则需要删除该字段 if (CollectionUtil.isEmpty(columns)) { removeById(columnInfo); } } } @Override @Transactional(rollbackFor = Exception.class) public void save(List columnInfos) { saveOrUpdateBatch(columnInfos); } @Override public void generator(GenConfig genConfig, List columns) { if (genConfig.getId() == null) { throw new BadRequestException(CONFIG_MESSAGE); } try { GenUtil.generatorCode(columns, genConfig); } catch (IOException e) { log.error(e.getMessage(), e); throw new BadRequestException("生成失败,请手动处理已生成的文件"); } } @Override public ResponseEntity preview(GenConfig genConfig, List columns) { if (genConfig.getId() == null) { throw new BadRequestException(CONFIG_MESSAGE); } List> genList = GenUtil.preview(columns, genConfig); return new ResponseEntity<>(genList, HttpStatus.OK); } @Override public void download(GenConfig genConfig, List columns, HttpServletRequest request, HttpServletResponse response) { if (genConfig.getId() == null) { throw new BadRequestException(CONFIG_MESSAGE); } try { File file = new File(GenUtil.download(columns, genConfig)); String zipPath = file.getPath() + ".zip"; ZipUtil.zip(file.getPath(), zipPath); FileUtil.downloadFile(request, response, new File(zipPath), true); } catch (IOException e) { throw new BadRequestException("打包失败"); } } }