Преглед изворни кода

实现导入数据的日志记录

William пре 2 година
родитељ
комит
5aef8405cd

+ 69 - 0
src/main/java/org/springblade/flow/datalog/controller/DataImportLogController.java

@@ -0,0 +1,69 @@
+package org.springblade.flow.datalog.controller;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.flow.datalog.model.DataImportLog;
+import org.springblade.flow.datalog.service.DataImportLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+import cn.hutool.core.io.IORuntimeException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 
+ * @author William
+ * @date 2022年12月2日 下午4:34:46
+ */
+@RestController
+@RequestMapping("/paas/visualdev/data/import")
+@Api(tags = "AA表单数据导入记录接口", value = "DataExportTasDataImportLogkLog")
+public class DataImportLogController {
+
+	@Value("${blade.file.formDir}")
+	private String formDir;
+
+	@Autowired
+	private DataImportLogService importLogService;
+
+	@GetMapping("/list")
+	@ApiOperation(value = "分页查询")
+	public R<IPage<DataImportLog>> list(String modelId, Integer current, Integer size) {
+		LambdaQueryWrapper<DataImportLog> wrapper = Wrappers.<DataImportLog>lambdaQuery();
+		wrapper.eq(DataImportLog::getModelId, modelId);
+		wrapper.orderByDesc(DataImportLog::getId);
+		Query query = new Query();
+		query.setCurrent(current);
+		query.setSize(size);
+		return R.data(importLogService.page(Condition.getPage(query), wrapper));
+	}
+
+	@PostMapping("/download")
+	@ApiOperation(value = "下载当时导入的Excel文件")
+	public void download(Long id, HttpServletResponse response) throws IORuntimeException, IOException {
+		DataImportLog dataLog = importLogService.getById(id);
+//		File file = new File(formDir + dataLog.getFileName());
+//		if (file != null && file.exists() && file.isFile()) {
+//			response.setContentType("application/vnd.ms-excel");
+//			response.setCharacterEncoding("utf-8");
+//			String fileName = URLEncoder.encode(dataLog.getName(), "UTF-8");
+//			response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+//			response.getOutputStream().write(FileUtil.readBytes(file));
+//			response.getOutputStream().flush();
+//		}
+	}
+}

+ 14 - 0
src/main/java/org/springblade/flow/datalog/mapper/DataImportLogMapper.java

@@ -0,0 +1,14 @@
+package org.springblade.flow.datalog.mapper;
+
+import org.springblade.flow.datalog.model.DataImportLog;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 
+ * @author William
+ * @date 2022年12月8日 上午11:49:07
+ */
+public interface DataImportLogMapper extends BaseMapper<DataImportLog>{
+
+}

+ 2 - 2
src/main/java/org/springblade/flow/datalog/model/DataExportTask.java

@@ -21,7 +21,7 @@ import lombok.Data;
 @Data
 @Builder
 @TableName("base_visualdev_export_task")
-@ApiModel(value = "visualdev_export_task", description = "系统菜单")
+@ApiModel(value = "visualdev_export_task", description = "导出任务")
 public class DataExportTask {
 	@ApiModelProperty(value = "ID", name = "id", required = true)
 	@TableId(type = IdType.ASSIGN_ID)
@@ -34,7 +34,7 @@ public class DataExportTask {
 	private String modelId;
 
 	@ApiModelProperty(value = "数据集ID", name = "cubeId", required = false)
-	private String cubeId;
+	private Integer cubeId;
 
 	@ApiModelProperty(value = "是否导出全部(0-非全部;1-全部)", name = "isAll", required = true)
 	private int isAll;

+ 77 - 0
src/main/java/org/springblade/flow/datalog/model/DataImportLog.java

@@ -0,0 +1,77 @@
+package org.springblade.flow.datalog.model;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 表单数据导入实体类
+ * 
+ * @author William
+ * @date 2022年12月2日 上午11:18:34
+ */
+@Data
+@Builder
+@TableName("base_visualdev_import_log")
+@ApiModel(value = "base_visualdev_import_log", description = "导入记录")
+public class DataImportLog {
+	@ApiModelProperty(value = "ID", name = "id", required = true)
+	@TableId(type = IdType.ASSIGN_ID)
+	private Long id;
+	
+	@ApiModelProperty(value = "备注", name = "name", required = false)
+	private String name;
+
+	@ApiModelProperty(value = "表单ID", name = "modelId", required = true)
+	private String modelId;
+
+	@ApiModelProperty(value = "数据集ID", name = "cubeId", required = false)
+	private Integer cubeId;
+
+	@ApiModelProperty(value = "是否清空(0-否;1-是)", name = "isTruncate", required = true)
+	private int isTruncate;
+
+	@ApiModelProperty(value = "导出规则", name = "rule", required = false)
+	private String rule;
+
+	@ApiModelProperty(value = "操作人", name = "operator", required = false)
+	private String operator;
+
+	@ApiModelProperty(value = "操作人ID", name = "operatorId", required = false)
+	private Long operatorId;
+
+	@ApiModelProperty(value = "导入时间", name = "createTime", required = false)
+	private Date createTime;
+
+	@ApiModelProperty(value = "完成时间", name = "finishTime", required = false)
+	private Date finishTime;
+
+	@ApiModelProperty(value = "任务状态(0-进行中;1-成功;2-失败;)", name = "status", required = false)
+	private int status;
+
+	@ApiModelProperty(value = "文件路径", name = "filePath", required = false)
+	private String filePath;
+	
+	@ApiModelProperty(value = "文件大小", name = "fileSize", required = false)
+	private long fileSize;
+	
+	@ApiModelProperty(value = "导出条数", name = "count", required = false)
+	private long count;
+
+	@ApiModelProperty(value = "扩展信息,比如导出失败时的错误信息", name = "ext", required = false)
+	private String ext;
+	
+	@ApiModelProperty(value = "耗时(单位:秒)", name = "takeUpTime", required = false)
+	private BigDecimal takeUpTime;
+	
+	@ApiModelProperty(value = "是否带表头(0-不带;1-带)", name = "status", required = false)
+	private Integer withHeader;
+}

+ 61 - 0
src/main/java/org/springblade/flow/datalog/service/DataImportLogService.java

@@ -0,0 +1,61 @@
+package org.springblade.flow.datalog.service;
+
+import java.io.File;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.flow.datalog.mapper.DataImportLogMapper;
+import org.springblade.flow.datalog.model.DataImportLog;
+import org.springblade.flow.visual.onlinedev.common.excel.ExcelFormParam;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * 
+ * @author William
+ * @date 2022年11月17日 上午11:55:38
+ */
+@Service
+public class DataImportLogService extends ServiceImpl<DataImportLogMapper, DataImportLog> {
+	@Value("${blade.file.uploadPath}")
+	private String uploadDir;
+
+	/**
+	 * 保存导入日志
+	 * 
+	 * @param params
+	 * @param count
+	 * @param cubeId
+	 */
+	public void saveLog(ExcelFormParam params, long count, Integer cubeId, float takeUpTime) {
+		long fileSize = 0;
+		String filePath = uploadDir + params.getFile().replace("uploads/", "");
+		File excelFile = new File(filePath);
+		if (excelFile != null && excelFile.exists()) {
+			fileSize = excelFile.length();
+		}
+
+		DataImportLog bean = DataImportLog.builder()
+				.count(count)
+				.createTime(new Date())
+				.cubeId(cubeId)
+				.filePath(params.getFile())
+				.fileSize(fileSize)
+				.finishTime(new Date())
+				.isTruncate(params.isTruncate() ? 1 : 0)
+				.modelId(params.getModelId())
+				.name(params.getName())
+				.operatorId(SecureUtil.getUserId())
+				.operator(SecureUtil.getNickName())
+				.rule(JSON.toJSONString(params.getList()))
+				.status(1)
+				.takeUpTime(BigDecimal.valueOf(takeUpTime))
+				.withHeader(params.getWithHeader() ? 1 : 0)
+				.build();
+		save(bean);
+	}
+}

+ 11 - 6
src/main/java/org/springblade/flow/visual/onlinedev/common/excel/ExcelFormParam.java

@@ -15,6 +15,8 @@ import lombok.Data;
 @Data
 @ApiModel(value = "ExcelFormParam", description = "批量导入表单数据参数")
 public class ExcelFormParam {
+	@ApiModelProperty(value = "备注", name = "name", required = false)
+	private String name;
 
 	@ApiModelProperty(value = "表单ID", name = "modelId", required = true)
 	private String modelId;
@@ -27,11 +29,20 @@ public class ExcelFormParam {
 
 	@ApiModelProperty(value = "字段ID和Excel列索引映射关系", name = "list", required = true)
 	private List<ExcelFieldIndex> list;
+	
+	@ApiModelProperty(value = "是否清空原有数据", name = "isTruncate", required = true)
+	private boolean isTruncate;
 
 	@Data
 	@ApiModel(value = "ExcelFieldIndex", description = "字段ID和Excel列索引映射关系")
 	public static class ExcelFieldIndex {
 
+		@ApiModelProperty(value = "Excel列索引(从0开始)", name = "index", required = true)
+		private int index;
+
+		@ApiModelProperty(value = "字段ID", name = "fieldId", required = true)
+		private int fieldId;
+
 		public ExcelFieldIndex() {
 		}
 
@@ -40,11 +51,5 @@ public class ExcelFormParam {
 			this.index = index;
 			this.fieldId = fieldId;
 		}
-
-		@ApiModelProperty(value = "Excel列索引(从0开始)", name = "index", required = true)
-		private int index;
-
-		@ApiModelProperty(value = "字段ID", name = "fieldId", required = true)
-		private int fieldId;
 	}
 }

+ 0 - 2
src/main/java/org/springblade/flow/visual/onlinedev/common/excel/ExcelRead4MultipleTableListener.java

@@ -12,7 +12,6 @@ import org.springblade.bi.client.model.DataSourceModel;
 import org.springblade.cube.dto.TableLinkJoin;
 import org.springblade.cube.dto.TableLinkJoin.JoinKey;
 import org.springblade.cube.enums.ViewColumnTypeEnum;
-import org.springblade.flow.database.model.DbLinkEntity;
 import org.springblade.flow.util.JsonUtil;
 import org.springblade.flow.visual.base.entity.VisualdevEntity;
 import org.springblade.flow.visual.onlinedev.common.dynamic.DataSourceService;
@@ -75,7 +74,6 @@ public class ExcelRead4MultipleTableListener extends AnalysisEventListener<Linke
 //				.collect(Collectors.toList());
 
 		this.fieldList = new ArrayList<>();
-		DbLinkEntity linkEntity = dataSourceService.getInfo(formInfo.getDbLinkId());
 		String tables = formInfo.getTables();
 		List<RelationField> sourceFieldList = JSON.parseArray(tables, RelationField.class);
 		for (RelationField rf : sourceFieldList) {

+ 52 - 4
src/main/java/org/springblade/flow/visual/onlinedev/common/formdata/FormDataWithTableService.java

@@ -4,9 +4,11 @@ import java.io.File;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.springblade.bi.client.model.CubeDataModel;
@@ -42,8 +44,10 @@ import org.springblade.sqlfly.config.Column;
 import org.springblade.sqlfly.opt.IFly;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -333,6 +337,46 @@ public class FormDataWithTableService {
 		return sqlBuffer.toString();
 	}
 
+	@Transactional
+	public void truncate(CubeDataModel cubeData, VisualdevEntity formInfo) {
+		try {
+			String tableJson = formInfo.getTables();
+			List<RelationField> dataList = JSON.parseArray(tableJson, RelationField.class);
+			if (CollUtil.isNotEmpty(dataList)) {
+				Set<String> tableList = new HashSet<>();
+				dataList.forEach(item -> {
+					tableList.add(item.getTableName());
+				});
+
+				if (CollUtil.isNotEmpty(tableList)) {
+					DataSourceModel ds = dataSourceService.getReportDatasource(String.valueOf(cubeData.getId()));
+					tableList.forEach(table -> {
+						String sql = "TRUNCATE TABLE "+table;
+						dynamicDataService.executeSql(ds, sql);
+					});
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	public ActionResult<Kv> batchAdd(CubeDataModel cubeData, boolean withHeader,
+			VisualdevEntity formInfo, List<ExcelFieldIndex> indexList, File excelFile, boolean isMultipleTable)
+			throws SQLException {
+		long startTime = System.currentTimeMillis();
+		ActionResult<Kv> ret = null;
+		if (isMultipleTable) {
+			ret = batchAddForMultipleTable(cubeData, withHeader, formInfo, indexList, excelFile);
+		} else {
+			ret = batchAddForSingleTable(cubeData, withHeader, formInfo, indexList, excelFile);
+		}
+		long endTime = System.currentTimeMillis();
+		float takeUpTime = (endTime - startTime) / 1000.f;
+		ret.getData().set("takeUpTime", takeUpTime);
+		return ret;
+	}
+
 	/**
 	 * 多表批量导入数据
 	 * 
@@ -344,13 +388,15 @@ public class FormDataWithTableService {
 	 * @return
 	 * @throws SQLException
 	 */
-	public ActionResult<String> batchAddForMultipleTable(CubeDataModel cubeData, boolean withHeader,
+	private ActionResult<Kv> batchAddForMultipleTable(CubeDataModel cubeData, boolean withHeader,
 			VisualdevEntity formInfo, List<ExcelFieldIndex> indexList, File excelFile) throws SQLException {
 		DataSourceModel ds = dataSourceService.getReportDatasource(String.valueOf(cubeData.getId()));
 		ExcelRead4MultipleTableListener listener = new ExcelRead4MultipleTableListener(this, dataSourceService,
 				cubeData, dynamicDataService, ds, formInfo, indexList);
 		EasyExcel.read(excelFile, listener).sheet().headRowNumber(withHeader ? 1 : 0).doRead();
-		return ActionResult.success("共导入" + listener.getTableTotal() + "张表," + listener.getDataTotal() + "条数据");
+		Kv kv = Kv.create();
+		kv.set("count", listener.getDataTotal());
+		return ActionResult.success("共导入" + listener.getTableTotal() + "张表," + listener.getDataTotal() + "条数据", kv);
 	}
 
 	/**
@@ -364,13 +410,15 @@ public class FormDataWithTableService {
 	 * @return
 	 * @throws SQLException
 	 */
-	public ActionResult<String> batchAddForSingleTable(CubeDataModel cubeData, boolean withHeader,
+	private ActionResult<Kv> batchAddForSingleTable(CubeDataModel cubeData, boolean withHeader,
 			VisualdevEntity formInfo, List<ExcelFieldIndex> indexList, File excelFile) throws SQLException {
 		DataSourceModel ds = dataSourceService.getReportDatasource(String.valueOf(cubeData.getId()));
 		ExcelRead4SingleTableListener listener = new ExcelRead4SingleTableListener(this, dataSourceService, cubeData,
 				dynamicDataService, ds, formInfo, indexList);
 		EasyExcel.read(excelFile, listener).sheet().headRowNumber(withHeader ? 1 : 0).doRead();
-		return ActionResult.success("共导入1张表" + listener.getTotal() + "条数据");
+		Kv kv = Kv.create();
+		kv.set("count", listener.getTotal());
+		return ActionResult.success("共导入1张表" + listener.getTotal() + "条数据", kv);
 	}
 
 	/**

+ 79 - 71
src/main/java/org/springblade/flow/visual/onlinedev/controller/VisualdevModelDataController.java

@@ -1,9 +1,7 @@
 package org.springblade.flow.visual.onlinedev.controller;
 
 import java.io.File;
-import java.io.IOException;
 import java.sql.SQLException;
-import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
@@ -17,6 +15,7 @@ import org.springblade.bi.client.model.CubeDataModel;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.support.Kv;
 import org.springblade.flow.base.ActionResult;
 import org.springblade.flow.base.util.FlowDataUtil;
 import org.springblade.flow.config.ConfigValueUtil;
@@ -25,16 +24,13 @@ import org.springblade.flow.datalog.common.ExportService;
 import org.springblade.flow.datalog.model.DataExportTask;
 import org.springblade.flow.datalog.params.DataExportParam;
 import org.springblade.flow.datalog.service.DataExportTaskService;
+import org.springblade.flow.datalog.service.DataImportLogService;
 import org.springblade.flow.datalog.service.FormDataLogService;
 import org.springblade.flow.engine.entity.FlowEngineEntity;
 import org.springblade.flow.engine.service.FlowEngineService;
 import org.springblade.flow.engine.service.FlowTaskService;
 import org.springblade.flow.exception.WorkFlowException;
-import org.springblade.flow.model.visiual.OnlineDevData;
-import org.springblade.flow.model.visiual.fields.FieldsModel;
-import org.springblade.flow.util.CacheKeyUtil;
 import org.springblade.flow.util.JsonUtil;
-import org.springblade.flow.util.JsonUtilEx;
 import org.springblade.flow.util.RedisUtil;
 import org.springblade.flow.util.StringUtil;
 import org.springblade.flow.util.UserProvider;
@@ -46,24 +42,19 @@ import org.springblade.flow.visual.base.entity.VisualdevEntity;
 import org.springblade.flow.visual.base.service.VisualdevService;
 import org.springblade.flow.visual.base.service.impl.DataPermissionUserService;
 import org.springblade.flow.visual.base.service.impl.VisualdevDataPermissionService;
-import org.springblade.flow.visual.base.util.VisualUtils;
 import org.springblade.flow.visual.onlinedev.common.dynamic.DataSourceService;
 import org.springblade.flow.visual.onlinedev.common.excel.ExcelFormParam;
 import org.springblade.flow.visual.onlinedev.common.formdata.FormDataWithTableService;
 import org.springblade.flow.visual.onlinedev.common.relation.RelationField;
 import org.springblade.flow.visual.onlinedev.common.relation.RelationUtil;
-import org.springblade.flow.visual.onlinedev.entity.VisualdevModelDataEntity;
 import org.springblade.flow.visual.onlinedev.model.BatchRemoveIdsVo;
 import org.springblade.flow.visual.onlinedev.model.ColumnDataInfoVO;
 import org.springblade.flow.visual.onlinedev.model.DataInfoVO;
 import org.springblade.flow.visual.onlinedev.model.FlowTemplateInfoVo;
 import org.springblade.flow.visual.onlinedev.model.FormDataInfoVO;
-import org.springblade.flow.visual.onlinedev.model.PaginationModel;
 import org.springblade.flow.visual.onlinedev.model.VisualdevModelDataCrForm;
-import org.springblade.flow.visual.onlinedev.model.VisualdevModelDataInfoVO;
 import org.springblade.flow.visual.onlinedev.model.VisualdevModelDataUpForm;
 import org.springblade.flow.visual.onlinedev.service.VisualdevModelDataService;
-import org.springblade.flow.visual.onlinedev.util.AutoFeildsUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.DeleteMapping;
@@ -146,6 +137,9 @@ public class VisualdevModelDataController extends BladeController {
 	@Autowired
 	private ExportService exportService;
 
+	@Autowired
+	private DataImportLogService importLogService;
+
 	@ApiOperation("表单操作 - 获取列表表单配置JSON")
 	@GetMapping("/{modelId}/Config")
 	public ActionResult<Object> getData(@PathVariable("modelId") String modelId) {
@@ -195,55 +189,66 @@ public class VisualdevModelDataController extends BladeController {
 		return ActionResult.success(vo);
 	}
 
-	@ApiOperation("数据操作 - 分页查询")
-	@PostMapping("/{modelId}/List")
-	public ActionResult<?> list(@PathVariable("modelId") String modelId, @RequestBody PaginationModel paginationModel)
-			throws ParseException, IOException, SQLException, DataException {
-		VisualdevEntity visualdevEntity = visualdevService.getInfo(modelId);
-		return formDataWithTableService.list(visualdevEntity, paginationModel);
-	}
-
-	@ApiOperation("数据操作 - 数据详情")
-	@GetMapping("/{modelId}/{id}")
-	public ActionResult<VisualdevModelDataInfoVO> info(@PathVariable("id") String id,
-			@PathVariable("modelId") String modelId) throws DataException, ParseException, SQLException, IOException {
-		VisualdevEntity visualdevEntity = visualdevService.getInfo(modelId);
-		// 有表
-		if (!StringUtil.isEmpty(visualdevEntity.getTables())
-				&& !OnlineDevData.TABLE_CONST.equals(visualdevEntity.getTables())) {
-			VisualdevModelDataInfoVO vo = visualdevModelDataService.tableInfo(id, visualdevEntity);
-			return ActionResult.success(vo);
-		}
-		// 无表
-		VisualdevModelDataEntity entity = visualdevModelDataService.getInfo(id);
-		Map<String, Object> formData = JsonUtil.stringToMap(visualdevEntity.getFormData());
-		List<FieldsModel> modelList = JsonUtil.getJsonToList(formData.get("fields").toString(), FieldsModel.class);
-		// 去除模板多级控件
-		modelList = VisualUtils.deleteMore(modelList);
-		String data = AutoFeildsUtil.autoFeilds(modelList, entity.getData());
-		entity.setData(data);
-		VisualdevModelDataInfoVO vo = JsonUtilEx.getJsonToBeanEx(entity, VisualdevModelDataInfoVO.class);
-		return ActionResult.success(vo);
-	}
-
-	@ApiOperation("数据操作 - 详情(带转换数据)")
-	@GetMapping("/{modelId}/{id}/DataChange")
-	public ActionResult<VisualdevModelDataInfoVO> infoWithDataChange(@PathVariable("modelId") String modelId,
-			@PathVariable("id") String id) throws DataException, ParseException, IOException, SQLException {
-		VisualdevEntity visualdevEntity = visualdevService.getInfo(modelId);
-		if (redisUtil.exists(CacheKeyUtil.VISIUALDATA + modelId)) {
-			redisUtil.remove(CacheKeyUtil.VISIUALDATA + modelId);
-		}
-		// 有表
-		if (!StringUtil.isEmpty(visualdevEntity.getTables())
-				&& !OnlineDevData.TABLE_CONST.equals(visualdevEntity.getTables())) {
-			VisualdevModelDataInfoVO vo = visualdevModelDataService.tableInfoDataChange(id, visualdevEntity);
-			return ActionResult.success(vo);
-		}
-		// 无表
-		VisualdevModelDataInfoVO vo = visualdevModelDataService.infoDataChange(id, visualdevEntity);
-		return ActionResult.success(vo);
-	}
+	// @ApiOperation("数据操作 - 分页查询")
+	// @PostMapping("/{modelId}/List")
+	// public ActionResult<?> list(@PathVariable("modelId") String modelId,
+	// @RequestBody PaginationModel paginationModel)
+	// throws ParseException, IOException, SQLException, DataException {
+	// VisualdevEntity visualdevEntity = visualdevService.getInfo(modelId);
+	// return formDataWithTableService.list(visualdevEntity, paginationModel);
+	// }
+
+	// @ApiOperation("数据操作 - 数据详情")
+	// @GetMapping("/{modelId}/{id}")
+	// public ActionResult<VisualdevModelDataInfoVO> info(@PathVariable("id") String
+	// id,
+	// @PathVariable("modelId") String modelId) throws DataException,
+	// ParseException, SQLException, IOException {
+	// VisualdevEntity visualdevEntity = visualdevService.getInfo(modelId);
+	// // 有表
+	// if (!StringUtil.isEmpty(visualdevEntity.getTables())
+	// && !OnlineDevData.TABLE_CONST.equals(visualdevEntity.getTables())) {
+	// VisualdevModelDataInfoVO vo = visualdevModelDataService.tableInfo(id,
+	// visualdevEntity);
+	// return ActionResult.success(vo);
+	// }
+	// // 无表
+	// VisualdevModelDataEntity entity = visualdevModelDataService.getInfo(id);
+	// Map<String, Object> formData =
+	// JsonUtil.stringToMap(visualdevEntity.getFormData());
+	// List<FieldsModel> modelList =
+	// JsonUtil.getJsonToList(formData.get("fields").toString(), FieldsModel.class);
+	// // 去除模板多级控件
+	// modelList = VisualUtils.deleteMore(modelList);
+	// String data = AutoFeildsUtil.autoFeilds(modelList, entity.getData());
+	// entity.setData(data);
+	// VisualdevModelDataInfoVO vo = JsonUtilEx.getJsonToBeanEx(entity,
+	// VisualdevModelDataInfoVO.class);
+	// return ActionResult.success(vo);
+	// }
+	//
+	// @ApiOperation("数据操作 - 详情(带转换数据)")
+	// @GetMapping("/{modelId}/{id}/DataChange")
+	// public ActionResult<VisualdevModelDataInfoVO>
+	// infoWithDataChange(@PathVariable("modelId") String modelId,
+	// @PathVariable("id") String id) throws DataException, ParseException,
+	// IOException, SQLException {
+	// VisualdevEntity visualdevEntity = visualdevService.getInfo(modelId);
+	// if (redisUtil.exists(CacheKeyUtil.VISIUALDATA + modelId)) {
+	// redisUtil.remove(CacheKeyUtil.VISIUALDATA + modelId);
+	// }
+	// // 有表
+	// if (!StringUtil.isEmpty(visualdevEntity.getTables())
+	// && !OnlineDevData.TABLE_CONST.equals(visualdevEntity.getTables())) {
+	// VisualdevModelDataInfoVO vo =
+	// visualdevModelDataService.tableInfoDataChange(id, visualdevEntity);
+	// return ActionResult.success(vo);
+	// }
+	// // 无表
+	// VisualdevModelDataInfoVO vo = visualdevModelDataService.infoDataChange(id,
+	// visualdevEntity);
+	// return ActionResult.success(vo);
+	// }
 
 	@ApiOperation("数据操作 - 添加")
 	@PostMapping("/{modelId}")
@@ -255,7 +260,7 @@ public class VisualdevModelDataController extends BladeController {
 
 	@ApiOperation("数据操作 - Excel导入")
 	@PostMapping("/createBatch")
-	public ActionResult<String> createBatch(@RequestBody ExcelFormParam params) throws WorkFlowException, SQLException {
+	public ActionResult<Kv> createBatch(@RequestBody ExcelFormParam params) throws WorkFlowException, SQLException {
 		if (params == null) {
 			return ActionResult.fail("缺少参数");
 		}
@@ -275,21 +280,24 @@ public class VisualdevModelDataController extends BladeController {
 		if (formInfo == null) {
 			return ActionResult.fail("表单不存在");
 		}
-
+		
 		CubeDataModel cubeData = dataSourceService.getCubeData(formInfo.getDbLinkId());
-		if (RelationUtil.hasLinkTable(cubeData)) {
-			return formDataWithTableService.batchAddForMultipleTable(cubeData,
-					params.getWithHeader(),
-					formInfo,
-					params.getList(),
-					excelFile);
+		if(params.isTruncate()) {
+			//先清空数据
+			formDataWithTableService.truncate(cubeData,formInfo);
 		}
 
-		return formDataWithTableService.batchAddForSingleTable(cubeData,
+		boolean isMultipleTable = RelationUtil.hasLinkTable(cubeData);
+		ActionResult<Kv> ret = formDataWithTableService.batchAdd(cubeData,
 				params.getWithHeader(),
 				formInfo,
 				params.getList(),
-				excelFile);
+				excelFile,
+				isMultipleTable);
+		long total = ret.getData().getLong("count");
+		float takeUpTime = ret.getData().getFloat("takeUpTime");
+		importLogService.saveLog(params, total, cubeData.getId(), takeUpTime);
+		return ret;
 	}
 
 	@ApiOperation("数据操作 - 更新")
@@ -419,7 +427,7 @@ public class VisualdevModelDataController extends BladeController {
 		DataExportTask task = DataExportTask.builder()
 				.id(taskId)
 				.modelId(param.getModelId())
-				.cubeId(form.getDbLinkId())
+				.cubeId(Integer.parseInt(form.getDbLinkId()))
 				.name(param.getTaskName())
 				.isAll(param.isAll() ? 1 : 0)
 				.name(param.getTaskName())