package com.smart.generator.command.impl;
import com.smart.framework.util.StringUtil;
import com.smart.generator.bean.Column;
import com.smart.generator.bean.Table;
import com.smart.generator.command.impl.builder.Builder;
import com.smart.generator.command.impl.builder.impl.EntityBuilder;
import com.smart.generator.command.impl.builder.impl.SQLBuilder;
import com.smart.generator.command.Command;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import org.apache.log4j.Logger;
public class LoadDictCommand extends Command {
private static final Logger logger = Logger.getLogger(LoadDictCommand.class);
private String appPath;
private String dictPath;
@Override
public int getParamsLength() {
// 返回参数个数
return 2;
}
@Override
public void initVariables(String... params) {
// 获取命令参数
appPath = params[0];
dictPath = params[1];
}
@Override
public void generateFiles() {
// 获取应用信息
String appName = getAppName(appPath);
String appPackage = getAppPackage(appPath);
// 获取 Excel 表格数据
Map
> tableMap = createTableMap(dictPath);
// 生成 SQL
generateSQL(tableMap, appName);
// 生成 Enttiy
generateEntity(tableMap, appPackage);
}
private void generateSQL(Map> tableMap, String appName) {
// 获取相关数据
String outputPath = appPath + "/doc";
// 生成代码
Builder sqlBuilder = new SQLBuilder(outputPath, tableMap, appName);
sqlBuilder.build();
}
private void generateEntity(Map> tableMap, String appPackage) {
// 获取相关数据
String outputPath = appPath + "/src/main/java/" + appPackage.replace('.', '/') + "/entity";
String packageName = appPackage + ".entity";
// 生成代码
Builder entityBuilder = new EntityBuilder(outputPath, tableMap, packageName);
entityBuilder.build();
}
private Map> createTableMap(String inputPath) {
// 定义一个 Table Map,用于建立表与列的一对多映射关系
Map> tableMap = new LinkedHashMap>();
// 定义 Workbook,表示整个 Excel 文件
Workbook workbook = null;
try {
// 获取 Workbook
workbook = Workbook.getWorkbook(new File(inputPath));
// 处理 Workbook
handleWorkbook(workbook, tableMap);
} catch (IOException e) {
logger.error("读取 Excel 出错!", e);
throw new RuntimeException(e);
} catch (BiffException e) {
logger.error("解析 Excel 出错!", e);
throw new RuntimeException(e);
} finally {
// 释放资源
if (workbook != null) {
workbook.close();
}
}
return tableMap;
}
private void handleWorkbook(Workbook workbook, Map> tableMap) {
// 读取 Workbook(从第二个开始)
for (int i = 1; i < workbook.getNumberOfSheets(); i++) {
// 获取 Sheet
Sheet sheet = workbook.getSheet(i);
// 处理 Sheet
handleSheet(sheet, tableMap);
}
}
private void handleSheet(Sheet sheet, Map> tableMap) {
// 获取表名
String tableName = sheet.getName().toLowerCase();
// 定义表主键
String tablePK = "";
// 定义一个 Column List,用于封装 Sheet 数据
List columnList = new ArrayList();
// 读取 Sheet(从第二行开始)
for (int row = 1; row < sheet.getRows(); row++) {
// 获取 Cell 数据
String name = getData(sheet, 0, row);
String type = getData(sheet, 1, row);
String length = getData(sheet, 2, row);
String precision = getData(sheet, 3, row);
String notnull = getData(sheet, 4, row);
String pk = getData(sheet, 5, row);
String comment = getData(sheet, 6, row);
// 将 Cell 数据封装为 Column,并添加到 Column List 中
columnList.add(new Column(name, type, length, precision, notnull, pk, comment));
// 初始化表主键
if (StringUtil.isNotEmpty(pk)) {
tablePK = name;
}
}
// 将 Sheet 数据封装为 Table,并添加到 Table Map 中
tableMap.put(new Table(tableName, tablePK), columnList);
}
private String getData(Sheet sheet, int column, int row) {
// 获取 Cell 数据,去除了前后空格
return sheet.getCell(column, row).getContents().trim();
}
}