diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java index 91e8d5a3dc..3d491518ba 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java @@ -7,6 +7,7 @@ import io.dataease.controller.request.dataset.DataSetTableRequest; import io.dataease.datasource.dto.TableFiled; import io.dataease.service.dataset.DataSetTableService; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.util.List; @@ -86,4 +87,9 @@ public class DataSetTableController { public Map datasetDetail(@PathVariable String id) { return dataSetTableService.getDatasetDetail(id); } + + @PostMapping("excel/upload") + public Map excelUpload(@RequestParam("file") MultipartFile file) throws Exception { + return dataSetTableService.excelSaveAndParse(file); + } } diff --git a/backend/src/main/java/io/dataease/controller/panel/PanelTemplateController.java b/backend/src/main/java/io/dataease/controller/panel/PanelTemplateController.java index b161e021b2..491606ed93 100644 --- a/backend/src/main/java/io/dataease/controller/panel/PanelTemplateController.java +++ b/backend/src/main/java/io/dataease/controller/panel/PanelTemplateController.java @@ -31,9 +31,9 @@ public class PanelTemplateController { return panelTemplateService.save(request); } - @PostMapping("/deleteCircle/{id}") - public void deleteCircle(@PathVariable String id) { - panelTemplateService.deleteCircle(id); + @PostMapping("/delete/{id}") + public void delete(@PathVariable String id) { + panelTemplateService.delete(id); } @GetMapping("/findOne/{id}") diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index 0ca76754fe..2851e3cc9e 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -18,10 +18,26 @@ import io.dataease.dto.dataset.DataTableInfoDTO; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.*; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; import java.sql.ResultSet; +import java.text.DecimalFormat; import java.text.MessageFormat; import java.util.*; import java.util.stream.Collectors; @@ -42,6 +58,8 @@ public class DataSetTableService { private DataSetTableTaskService dataSetTableTaskService; @Resource private DatasetTableIncrementalConfigMapper datasetTableIncrementalConfigMapper; + @Value("${upload.file.path}") + private String path; public void batchInsert(List datasetTable) throws Exception { for (DatasetTable table : datasetTable) { @@ -434,4 +452,120 @@ public class DataSetTableService { } return map; } + + public Map excelSaveAndParse(MultipartFile file) throws Exception { + String filename = file.getOriginalFilename(); + String suffix = filename.substring(filename.lastIndexOf(".") + 1); + + List fields = new ArrayList<>(); + List data = new ArrayList<>(); + List> jsonArray = new ArrayList<>(); + + InputStream inputStream = file.getInputStream(); + if (StringUtils.equalsIgnoreCase(suffix, "xls")) { + HSSFWorkbook workbook = new HSSFWorkbook(inputStream); + HSSFSheet sheet0 = workbook.getSheetAt(0); + if (sheet0.getNumMergedRegions() > 0) { + throw new RuntimeException("Sheet have merged regions."); + } + int rows = Math.min(sheet0.getPhysicalNumberOfRows(), 100); + for (int i = 0; i < rows; i++) { + HSSFRow row = sheet0.getRow(i); + String[] r = new String[row.getPhysicalNumberOfCells()]; + for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { + if (i == 0) { + TableFiled tableFiled = new TableFiled(); + tableFiled.setFieldName(readCell(row.getCell(j))); + tableFiled.setRemarks(readCell(row.getCell(j))); + fields.add(tableFiled); + } else { + r[j] = readCell(row.getCell(j)); + } + } + if (i > 0) { + data.add(r); + } + } + } else if (StringUtils.equalsIgnoreCase(suffix, "xlsx")) { + XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream); + XSSFSheet sheet0 = xssfWorkbook.getSheetAt(0); + if (sheet0.getNumMergedRegions() > 0) { + throw new RuntimeException("Sheet have merged regions."); + } + int rows = Math.min(sheet0.getPhysicalNumberOfRows(), 100); + for (int i = 0; i < rows; i++) { + XSSFRow row = sheet0.getRow(i); + String[] r = new String[row.getPhysicalNumberOfCells()]; + for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { + if (i == 0) { + TableFiled tableFiled = new TableFiled(); + tableFiled.setFieldName(readCell(row.getCell(j))); + tableFiled.setRemarks(readCell(row.getCell(j))); + fields.add(tableFiled); + } else { + r[j] = readCell(row.getCell(j)); + } + } + if (i > 0) { + data.add(r); + } + } + } else if (StringUtils.equalsIgnoreCase(suffix, "csv")) { + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + String s = reader.readLine();// first line + String[] split = s.split(","); + for (String s1 : split) { + TableFiled tableFiled = new TableFiled(); + tableFiled.setFieldName(s1); + tableFiled.setRemarks(s1); + fields.add(tableFiled); + } + int num = 1; + String line = null; + while ((line = reader.readLine()) != null) { + if (num > 100) { + break; + } + data.add(line.split(",")); + num++; + } + } + + String[] fieldArray = fields.stream().map(TableFiled::getFieldName).toArray(String[]::new); + if (CollectionUtils.isNotEmpty(data)) { + jsonArray = data.stream().map(ele -> { + Map map = new HashMap<>(); + for (int i = 0; i < ele.length; i++) { + map.put(fieldArray[i], ele[i]); + } + return map; + }).collect(Collectors.toList()); + } + inputStream.close(); + + Map map = new HashMap<>(); + map.put("fields", fields); + map.put("data", jsonArray); + + return map; + } + + private String readCell(Cell cell) { + CellType cellTypeEnum = cell.getCellTypeEnum(); + if (cellTypeEnum.equals(CellType.STRING)) { + return cell.getStringCellValue(); + } else if (cellTypeEnum.equals(CellType.NUMERIC)) { + double d = cell.getNumericCellValue(); + try { + return new Double(d).longValue() + ""; + } catch (Exception e) { + BigDecimal b = new BigDecimal(d); + return b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue() + ""; + } + } else if (cellTypeEnum.equals(CellType.BOOLEAN)) { + return cell.getBooleanCellValue() ? "1" : "0"; + } else { + return ""; + } + } } diff --git a/backend/src/main/java/io/dataease/service/panel/PanelTemplateService.java b/backend/src/main/java/io/dataease/service/panel/PanelTemplateService.java index ad2c39cd4c..25ea6083fe 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelTemplateService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelTemplateService.java @@ -69,9 +69,9 @@ public class PanelTemplateService { } - public void deleteCircle(String id){ + public void delete(String id){ Assert.notNull(id, "id cannot be null"); - extPanelTemplateMapper.deleteCircle(id); + panelTemplateMapper.deleteByPrimaryKey(id); } diff --git a/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue b/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue index 47e3aaed06..84c3526cd5 100644 --- a/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue +++ b/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue @@ -1,13 +1,14 @@ diff --git a/frontend/src/components/canvas/components/Editor/index.vue b/frontend/src/components/canvas/components/Editor/index.vue index 2eb775dde6..b209b4d560 100644 --- a/frontend/src/components/canvas/components/Editor/index.vue +++ b/frontend/src/components/canvas/components/Editor/index.vue @@ -43,6 +43,7 @@ :style="getComponentStyle(item.style)" :prop-value="item.propValue" :element="item" + :filter="filter" /> + + @@ -26,8 +29,8 @@ - 取 消 - 确 定 + 取 消 + 确 定 @@ -37,10 +40,15 @@ import { post } from '@/api/panel/panel' export default { name: 'SaveToTemplate', + props: { + templateInfo: { + type: Object, + require: true + } + }, data() { return { data: [], - name: '', fieldName: 'name', tableRadio: null, keyWordSearch: '', @@ -53,26 +61,37 @@ export default { methods: { search() { const param = { - template_type: 'self', + templateType: 'self', level: '0' } post('/template/templateList', param).then(response => { this.data = response.data }) }, - - setCheckNodes() { - this.data.forEach(node => { - const nodeId = node.userId - this.shares.includes(nodeId) && this.$refs.table.toggleRowSelection(node, true) - }) - }, clickChange(item) { this.tableRadio = item + this.templateInfo.pid = item.id }, cancel() { - this.$refs[this.activeName].cancel() - this.$emit('close-grant', 0) + this.$emit('closeSaveDialog') + }, + save() { + if (!this.templateInfo.pid) { + this.$warning('请选择所属类别') + return false + } + if (!this.templateInfo.name) { + this.$warning('模板名称不能为空') + return false + } + post('/template/save', this.templateInfo).then(response => { + this.$message({ + message: '保存成功', + type: 'success', + showClose: true + }) + this.$emit('closeSaveDialog') + }) } } diff --git a/frontend/src/views/panel/template/component/SystemTemplateList.vue b/frontend/src/views/panel/template/component/SystemTemplateList.vue index 32030c7316..188ca726ce 100644 --- a/frontend/src/views/panel/template/component/SystemTemplateList.vue +++ b/frontend/src/views/panel/template/component/SystemTemplateList.vue @@ -1,18 +1,21 @@