Commit 1c9f891b authored by 陈祥烨's avatar 陈祥烨

应用导出优化

parent 59b80ec9
......@@ -46,6 +46,7 @@ DataApiResource {
/**
* 依据参数导出 应用快搭增量脚本
*
* @throws SQLException
*/
@TycloudOperation(ApiLevel = UserType.ANONYMOUS, needAuth = false)
......@@ -54,17 +55,19 @@ DataApiResource {
public void generateSQL(
@RequestParam("resourceCode") String resourceCode,
@RequestParam("dimension") String dimension,
@RequestParam("ipSeq") Long ipSeq,
HttpServletRequest request,
HttpServletResponse response) throws SQLException {
Map<String, Object> variables = new HashMap<>();
Enumeration<String> keys = request.getParameterNames();
while(keys.hasMoreElements()){
String name = (String)keys.nextElement();
while (keys.hasMoreElements()) {
String name = (String) keys.nextElement();
String value = request.getParameter(name);
variables.put(name, value);
}
variables.remove("resourceCode");
variables.remove("dimension");
studioResourceService.generateSQL(resourceCode, dimension, variables, response);
variables.remove("ipSeq");
studioResourceService.generateSQL(resourceCode, dimension, ipSeq, variables, response);
}
}
......@@ -2,13 +2,14 @@ package com.yeejoin.amos.api.tool.face.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.Query;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.api.tool.enums.SourceEnum;
import com.yeejoin.amos.api.tool.face.model.DataBaseLinkModel;
import com.yeejoin.amos.api.tool.face.orm.entity.StudioResource;
import com.yeejoin.amos.api.tool.face.model.StudioResourceModel;
import com.yeejoin.amos.api.tool.face.orm.dao.StudioResourceMapper;
import com.yeejoin.amos.api.tool.face.orm.entity.TableColumn;
import com.yeejoin.amos.api.tool.utils.DataBaseUtils;
import com.yeejoin.amos.api.tool.utils.DateUtils;
import com.yeejoin.amos.api.tool.utils.SqlHelper;
import org.apache.commons.lang3.time.DateFormatUtils;
......@@ -22,10 +23,11 @@ import org.typroject.tyboot.component.emq.EmqKeeper;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import java.io.*;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;
......@@ -41,19 +43,19 @@ import java.util.Map;
@Component
public class StudioResourceService extends BaseService<StudioResourceModel, StudioResource, StudioResourceMapper> {
/**
* 数据库备份路径
*/
public static final String BACKUP_PATH = "/db/";
/**
* 数据库备份文本前缀
*/
public static String ONESQL_PREFIX = "";
private static String SUFFIX = "sql";
private static String BR = "\r\n";
private static String SLASH = "/";
private static String BRANCH = ";";
/**
* 数据库备份路径
*/
public static final String BACKUP_PATH = "/db/";
/**
* 数据库备份文本前缀
*/
public static String ONESQL_PREFIX = "";
private static String SUFFIX = "sql";
private static String BR = "\r\n";
private static String SLASH = "/";
private static String BRANCH = ";";
private static String SPLIT = "`";
private static String SPACE = " ";
private static String INSERT_INTO = " INSERT INTO ";
......@@ -65,17 +67,20 @@ public class StudioResourceService extends BaseService<StudioResourceModel, Stud
private static String COMMA = ",";
private static String DISABLEFOREIGN = "SET FOREIGN_KEY_CHECKS = 0;\r\n";
private static String ABLEFOREIGN = "SET FOREIGN_KEY_CHECKS = 1;\r\n";
private static String DELIMITER = "###################################";
@Autowired
JdbcTemplate jdbcTemplate;
@Autowired
DataSource datasource;
private static String DELIMITER = "###################################";
@Autowired
JdbcTemplate jdbcTemplate;
@Autowired
DataSource datasource;
@Autowired
private DataBaseLinkService dataBaseLinkService;
@Autowired
private SqlHelper sqlHelper;
@Autowired
private SqlHelper sqlHelper;
@Autowired
EmqKeeper emqKeeper;
@Autowired
EmqKeeper emqKeeper;
/**
* 列表查询 示例
......@@ -84,215 +89,181 @@ public class StudioResourceService extends BaseService<StudioResourceModel, Stud
return this.queryForList("", false, resourceCode);
}
public void generateSQL(String resourceCode, String dimension,Map<String, Object> variables, HttpServletResponse response) {
try {
public void generateSQL(String resourceCode, String dimension,Long ipSeq, Map<String, Object> variables, HttpServletResponse response) {
try {
// if (resourceCode.equals("StudioApplication")){
// ApplicationModel model = applicationService.queryBySeq(Long.valueOf(variables.get(dimension).toString()));
// variables.put("agencyCode", model.getAgencyCode());
// }
//返回需要查询的数据,dimension ----> seq
List<StudioResourceModel> resourceList = queryForStudioResourceList(resourceCode);
File directory = new File("");// 参数为空
String coursePath = directory.getCanonicalPath();
File parentFile = new File(coursePath).getParentFile();
String backPath = parentFile.getCanonicalPath() + BACKUP_PATH;
File sqlDirectory = new File(backPath);
if (!sqlDirectory.exists()) {
sqlDirectory.mkdir();
}
print(variables.get(dimension).toString(),"开始执行","start");
// 备份文件路径名称
String fileName = (SourceEnum.IDX.getSource().equals(resourceCode.toLowerCase()) ? (resourceCode.toLowerCase() + "_") : "studio_") + DateFormatUtils.format(new Date(), "yyyyMMdd") + "." + SUFFIX;
String sqlFilePath = backPath + SLASH + fileName;
File file = new File(sqlFilePath);
FileOutputStream out;
OutputStreamWriter writer = null;
out = new FileOutputStream(file);
writer = new OutputStreamWriter(out, "utf8");
StringBuffer deleteSql = new StringBuffer();
StringBuffer insertSql = new StringBuffer();
for (StudioResourceModel model : resourceList) {
//检查是否有appSeq
if (!validationParameters(model, variables)) {
continue;
}
if (!ObjectUtils.isEmpty(model.getResourceDeleteSql())) {
String json = format(model.getResourceDeleteSql(), variables);
JSONObject dimensionData = JSONObject.parseObject(json);
String deleteAllSql = dimensionData.getString(dimension);
deleteAllSql.replaceAll(";", ";" + BR);
deleteSql.append(deleteAllSql).append(BRANCH).append(BR);
}
if (!ObjectUtils.isEmpty(model.getResourceInsertSql())) {
String sql = buildInsertSql(model,dimension, variables);
if (!ObjectUtils.isEmpty(sql)) insertSql.append(sql);
}
}
if (deleteSql.length() > 0) {
print(variables.get(dimension).toString(),"开始创建delete语句...","running");
writer.write(BR + DELIMITER + BR);
writer.write("/**" + BR + "* 删除历史资源数据 " + BR + "**/" + BR);
writer.write(BR + DELIMITER + BR);
writer.write(deleteSql.toString());
writer.write(BR + BR + DELIMITER + BR);
print(variables.get(dimension).toString(),"delete语句创建完成...","running");
}
if (insertSql.length() > 0) {
print(variables.get(dimension).toString(),"开始创建insert语句...","running");
writer.write(BR + DELIMITER + BR);
writer.write("/**" + BR + "* 资源数据" + BR + "**/" + BR);
writer.write(BR + DELIMITER + BR);
writer.write(insertSql.toString());
writer.write(BR + BR + DELIMITER + BR);
print(variables.get(dimension).toString(),"insert语句创建完成...","running");
}
writer.flush();
writer.close();
out.close();
if(deleteSql.length() == 0 && insertSql.length() == 0){
print(variables.get(dimension).toString(),"该项目下数据路径字段为空,不支持导出...","start");
return;
}
download(response, fileName, sqlFilePath);
print(variables.get(dimension).toString(),"执行结束","end");
} catch (IOException e) {
e.printStackTrace();
}
}
private boolean validationParameters(StudioResourceModel model, Map<String, Object> variables) {
String text = model.getResourceParams();
JSONArray fields = JSONObject.parseArray(text);
for (int i = 0; i < fields.size(); i++) {
if (!variables.containsKey(fields.getJSONObject(i).getString("name"))) {
return false;
}
}
return true;
}
private String buildInsertSql(StudioResourceModel resource, String dimension, Map<String, Object> variables) {
List<StudioResourceModel> resourceList = queryForStudioResourceList(resourceCode);
File directory = new File("");// 参数为空
String coursePath = directory.getCanonicalPath();
File parentFile = new File(coursePath).getParentFile();
String backPath = parentFile.getCanonicalPath() + BACKUP_PATH;
File sqlDirectory = new File(backPath);
if (!sqlDirectory.exists()) {
sqlDirectory.mkdir();
}
print(variables.get(dimension).toString(), "开始执行", "start");
// 备份文件路径名称
String fileName = (SourceEnum.IDX.getSource().equals(resourceCode.toLowerCase()) ? (resourceCode.toLowerCase() + "_") : "studio_") + DateFormatUtils.format(new Date(), "yyyyMMdd") + "." + SUFFIX;
String sqlFilePath = backPath + SLASH + fileName;
File file = new File(sqlFilePath);
FileOutputStream out;
OutputStreamWriter writer = null;
out = new FileOutputStream(file);
writer = new OutputStreamWriter(out, "utf8");
StringBuffer deleteSql = new StringBuffer();
StringBuffer insertSql = new StringBuffer();
for (StudioResourceModel model : resourceList) {
if (!validationParameters(model, variables)) {
continue;
}
if (!ObjectUtils.isEmpty(model.getResourceDeleteSql())) {
String json = format(model.getResourceDeleteSql(), variables);
JSONObject dimensionData = JSONObject.parseObject(json);
String deleteAllSql = dimensionData.getString(dimension);
deleteAllSql.replaceAll(";", ";" + BR);
deleteSql.append(deleteAllSql).append(BRANCH).append(BR);
}
if (!ObjectUtils.isEmpty(model.getResourceInsertSql())) {
String sql = buildInsertSql(model, dimension,ipSeq, variables);
if (!ObjectUtils.isEmpty(sql)) insertSql.append(sql);
}
}
if (deleteSql.length() > 0) {
print(variables.get(dimension).toString(), "开始创建delete语句...", "running");
writer.write(BR + DELIMITER + BR);
writer.write("/**" + BR + "* 删除历史资源数据 " + BR + "**/" + BR);
writer.write(BR + DELIMITER + BR);
writer.write(deleteSql.toString());
writer.write(BR + BR + DELIMITER + BR);
print(variables.get(dimension).toString(), "delete语句创建完成...", "running");
}
if (insertSql.length() > 0) {
print(variables.get(dimension).toString(), "开始创建insert语句...", "running");
writer.write(BR + DELIMITER + BR);
writer.write("/**" + BR + "* 资源数据" + BR + "**/" + BR);
writer.write(BR + DELIMITER + BR);
writer.write(insertSql.toString());
writer.write(BR + BR + DELIMITER + BR);
print(variables.get(dimension).toString(), "insert语句创建完成...", "running");
}
writer.flush();
writer.close();
out.close();
if (deleteSql.length() == 0 && insertSql.length() == 0) {
print(variables.get(dimension).toString(), "该项目下数据路径字段为空,不支持导出...", "start");
return;
}
download(response, fileName, sqlFilePath);
print(variables.get(dimension).toString(), "执行结束", "end");
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
private boolean validationParameters(StudioResourceModel model, Map<String, Object> variables) {
String text = model.getResourceParams();
JSONArray fields = JSONObject.parseArray(text);
for (int i = 0; i < fields.size(); i++) {
if (!variables.containsKey(fields.getJSONObject(i).getString("name"))) {
return false;
}
}
return true;
}
private String buildInsertSql(StudioResourceModel resource, String dimension, Long ipSeq, Map<String, Object> variables) throws SQLException {
StringBuffer sbsql = new StringBuffer();
String json = format(resource.getResourceInsertSql(), variables);
JSONObject dimensionData = JSONObject.parseObject(json);
JSONObject selectAllSql = dimensionData.getJSONObject(dimension);
if (ObjectUtils.isEmpty(selectAllSql.keySet())) {
return "";
}
for (String tableName : selectAllSql.keySet()) {
List<TableColumn> columns = null;
List<Map<String, Object>> dataList = null;
String selectsql = format(selectAllSql.getString(tableName), variables);
if (SourceEnum.IDX.getSource().equals(resource.getResourceCode().toLowerCase())) {
String sql = sqlHelper.getNamespaceSql("com.yeejoin.amos.api.studio.face.orm.dao.StudioResourceMapper.queryForListByTableName", tableName);
Query query = new Query();
query.setSql(sql);
List result = IndicatorsManager.indicatorClient.queryBySql(query).getResult();
List<TableColumn> finalColumns = new ArrayList<>();
result.stream().forEach(x -> {
TableColumn column = JsonUtils.jsonToBean(JSON.toJSONString(x), TableColumn.class);
finalColumns.add(column);
});
columns = finalColumns;
query.setSql(selectsql);
dataList = IndicatorsManager.indicatorClient.queryBySql(query).getResult();
} else {
columns = this.getBaseMapper().queryForListByTableName(tableName);
dataList = jdbcTemplate.queryForList(selectsql.toString());
}
for (Map<String, Object> map : dataList) {
sbsql.append(INSERT_INTO);
sbsql.append(SPACE).append(tableName).append(SPACE);
sbsql.append(LEFTBRACE);
for (TableColumn column : columns) {
sbsql.append(SPLIT);
sbsql.append(column.getColumnName());
sbsql.append(SPLIT);
sbsql.append(COMMA);
}
sbsql.deleteCharAt(sbsql.length() - 1);
sbsql.append(RIGHTBRACE);
sbsql.append(VALUES);
sbsql.append(LEFTBRACE);
for (TableColumn column : columns) {
if (column.getColumnType().contains("bigint") ||
column.getColumnType().contains("int") ||
column.getColumnType().contains("bit(1)")) {
if (!ObjectUtils.isEmpty(map.get(column.getColumnName()))) {
sbsql.append(map.get(column.getColumnName()));
}else {
sbsql.append("0");
}
} else {
if (!ObjectUtils.isEmpty(map.get(column.getColumnName()))) {
sbsql.append("'").append(map.get(column.getColumnName())).append("'");
} else {
sbsql.append("null");
}
}
sbsql.append(COMMA);
}
sbsql.deleteCharAt(sbsql.length() - 1);
sbsql.append(RIGHTBRACE);
sbsql.append(BRANCH).append(BR);
}
}
JSONObject dimensionData = JSONObject.parseObject(json);
JSONObject selectAllSql = dimensionData.getJSONObject(dimension);
DataBaseLinkModel dataBaseLinkModel = dataBaseLinkService.queryBySeq(ipSeq);
for (String tableName : selectAllSql.keySet()) {
List<TableColumn> columns = null;
List<Map<String, Object>> dataList = null;
String selectsql = format(selectAllSql.getString(tableName), variables);
if (SourceEnum.IDX.getSource().equals(resource.getResourceCode().toLowerCase())) {
// String sql = sqlHelper.getNamespaceSql("com.yeejoin.amos.api.studio.face.orm.dao.StudioResourceMapper.queryForListByTableName", tableName);
// Query query = new Query();
// query.setSql(sql);
// List result = IndicatorsManager.indicatorClient.queryBySql(query).getResult();
// List<TableColumn> finalColumns = new ArrayList<>();
// result.stream().forEach(x -> {
// TableColumn column = JsonUtils.jsonToBean(JSON.toJSONString(x), TableColumn.class);
// finalColumns.add(column);
// });
// columns = finalColumns;
//
// query.setSql(selectsql);
// dataList = IndicatorsManager.indicatorClient.queryBySql(query).getResult();
} else {
if (dimension.equals("appSeq")) {
dataBaseLinkModel.setDbName("amos_studio");
} else if (dimension.equals("projectSeq")) {
dataBaseLinkModel.setDbName("amos_idx");
}
Connection connection = dataBaseLinkService.connectNewDatabase(dataBaseLinkModel);
if (ObjectUtils.isEmpty(selectAllSql.keySet())) {
return "";
}
columns = DataBaseUtils.getTableColumn(tableName,connection);
dataList = DataBaseUtils.getMaps(selectsql,connection);
sbsql.append(DataBaseUtils.getInsertSQL(dataList,columns,tableName));
}
}
return sbsql.toString();
}
public static String format(String sqlTemplate, Map<String, Object> parameter) {
StringSubstitutor ss = new StringSubstitutor(parameter);
String newTemplateStr = ss.replace(sqlTemplate);
return newTemplateStr;
}
public void download(HttpServletResponse response, String fileName, String sqlFilePath) throws IOException {
File f = new File(sqlFilePath);
BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
byte[] buf = new byte[1024];
int len = 0;
response.reset(); // 非常重要
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
OutputStream out = response.getOutputStream();
while ((len = br.read(buf)) > 0)
out.write(buf, 0, len);
br.close();
out.close();
}
private void print(String id,String msg,String step) {
String percent = "0";
percent = ValidationUtil.equals(step,"end") ? "100" : ValidationUtil.equals(step,"running") ? "50" : "10";
JSONObject event = new JSONObject();
event.put("percent",percent);
event.put("status", "running");
event.put("logInfo", msg);
event.put("time", DateUtils.toDateStr(DateUtils.format()));
try {
emqKeeper.getMqttClient().publish("/topicTable/solidify/" + (id.indexOf(',') != -1 ? id.split(",")[0] : id), event.toString().getBytes(), 0, false);
} catch (MqttException e) {
e.printStackTrace();
}
}
}
public static String format(String sqlTemplate, Map<String, Object> parameter) {
StringSubstitutor ss = new StringSubstitutor(parameter);
String newTemplateStr = ss.replace(sqlTemplate);
return newTemplateStr;
}
public void download(HttpServletResponse response, String fileName, String sqlFilePath) throws IOException {
File f = new File(sqlFilePath);
BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
byte[] buf = new byte[1024];
int len = 0;
response.reset(); // 非常重要
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
OutputStream out = response.getOutputStream();
while ((len = br.read(buf)) > 0)
out.write(buf, 0, len);
br.close();
out.close();
}
private void print(String id, String msg, String step) {
String percent = "0";
percent = ValidationUtil.equals(step, "end") ? "100" : ValidationUtil.equals(step, "running") ? "50" : "10";
JSONObject event = new JSONObject();
event.put("percent", percent);
event.put("status", "running");
event.put("logInfo", msg);
event.put("time", DateUtils.toDateStr(DateUtils.format()));
try {
emqKeeper.getMqttClient().publish("/topicTable/solidify/" + (id.indexOf(',') != -1 ? id.split(",")[0] : id), event.toString().getBytes(), 0, false);
} catch (MqttException e) {
e.printStackTrace();
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment