From cbf137661981db2dfbd01a75868cf694ec8b9101 Mon Sep 17 00:00:00 2001 From: ulleo Date: Thu, 20 Jun 2024 15:18:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(X-Pack):=20[=E6=95=B0=E6=8D=AE=E5=A1=AB?= =?UTF-8?q?=E6=8A=A5]=E9=80=89=E9=A1=B9=E5=80=BC=E7=9A=84=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=EF=BC=8C=E5=8F=AF=E4=BB=A5=E7=BB=91=E5=AE=9A=E6=8B=A5?= =?UTF-8?q?=E6=9C=89=E8=AF=BB=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E8=A1=A8=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datafill/DataFillController.java | 53 +- .../provider/ext/MysqlExtDDLProvider.java | 12 + .../service/datafill/DataFillDataService.java | 54 +- .../service/datafill/DataFillService.java | 15 + core/frontend/src/api/dataset/dataset.js | 11 +- core/frontend/src/api/system/datasource.js | 12 +- core/frontend/src/lang/en.js | 4 + core/frontend/src/lang/tw.js | 4 + core/frontend/src/lang/zh.js | 4 + .../views/dataFilling/form/EditFormData.vue | 76 ++- .../src/views/dataFilling/form/create.vue | 528 +++++++++++++++--- .../src/views/dataFilling/form/dataFilling.js | 8 + .../common/dto/datafill/ExtTableField.java | 5 + .../provider/DefaultExtDDLProvider.java | 5 + .../datasource/provider/ExtDDLProvider.java | 2 + 15 files changed, 692 insertions(+), 101 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java b/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java index 5a0fbad32a..55716013f5 100644 --- a/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java +++ b/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java @@ -3,6 +3,7 @@ package io.dataease.controller.datafill; import com.alibaba.excel.EasyExcel; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; +import com.google.gson.Gson; import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.PageUtils; import io.dataease.commons.utils.Pager; @@ -25,10 +26,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; @ApiIgnore @RequestMapping("dataFilling") @@ -193,20 +191,33 @@ public class DataFillController { @ApiIgnore @PostMapping("/form/{formId}/excel/template") public void getExcelTemplate(@PathVariable String formId, HttpServletResponse response) throws Exception { - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); - response.setCharacterEncoding("utf-8"); - // 这里URLEncoder.encode可以防止中文乱码 - String fileName = URLEncoder.encode("template", StandardCharsets.UTF_8).replaceAll("\\+", "%20"); - response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); - // 这里需要设置不关闭流 - EasyExcel.write(response.getOutputStream()) - .head(dataFillService.getExcelHead(formId)) - .automaticMergeHead(false) - .inMemory(true) - .registerWriteHandler(dataFillService.getCommentWriteHandler(formId)) - .autoCloseStream(Boolean.FALSE) - .sheet("模板") - .doWrite(new ArrayList()); + try { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + // 这里URLEncoder.encode可以防止中文乱码 + String fileName = URLEncoder.encode("template", StandardCharsets.UTF_8).replaceAll("\\+", "%20"); + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); + // 这里需要设置不关闭流 + EasyExcel.write(response.getOutputStream()) + .head(dataFillService.getExcelHead(formId)) + .automaticMergeHead(false) + .inMemory(true) + .registerWriteHandler(dataFillService.getCommentWriteHandler(formId)) + .autoCloseStream(Boolean.FALSE) + .sheet("模板") + .doWrite(new ArrayList()); + } catch (Exception e) { + e.printStackTrace(); + // 重置response + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.setStatus(500); + Map map = new HashMap<>(); + map.put("success", false); + map.put("message", e.getMessage()); + response.getWriter().println(new Gson().toJson(map)); + } } @ApiIgnore @@ -216,4 +227,10 @@ public class DataFillController { dataFillDataService.importExcelData(file, formId); } + @ApiIgnore + @PostMapping("/form/{optionDatasource}/{optionTable}/{optionColumn}/options/{optionOrder}") + public List listColumnData(@PathVariable String optionDatasource, @PathVariable String optionTable, @PathVariable String optionColumn, @PathVariable String optionOrder) throws Exception { + return dataFillDataService.listColumnData(optionDatasource, optionTable, optionColumn, optionOrder); + } + } diff --git a/core/backend/src/main/java/io/dataease/provider/ext/MysqlExtDDLProvider.java b/core/backend/src/main/java/io/dataease/provider/ext/MysqlExtDDLProvider.java index 694204a2b2..1867c9d091 100644 --- a/core/backend/src/main/java/io/dataease/provider/ext/MysqlExtDDLProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/ext/MysqlExtDDLProvider.java @@ -89,6 +89,18 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { return baseSql; } + @Override + public String searchColumnData(String table, String column, String order) { + String baseSql = "SELECT DISTINCT `$Column_Field$` FROM `$TABLE_NAME$` ORDER BY `$Column_Field$` $Column_Order$;"; + baseSql = baseSql.replace("$TABLE_NAME$", table).replace("$Column_Field$", column).replace("$Column_Field$", column); + if (StringUtils.equalsIgnoreCase(order, "desc")) { + baseSql = baseSql.replace("$Column_Order$", "DESC"); + } else { + baseSql = baseSql.replace("$Column_Order$", "ASC"); + } + return baseSql; + } + @Override public String whereSql(String tableName, List searchFields) { StringBuilder builder = new StringBuilder("WHERE 1 = 1 "); diff --git a/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java b/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java index 2634078592..c01139e487 100644 --- a/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java +++ b/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java @@ -689,6 +689,35 @@ public class DataFillDataService { return rowId; } + public List listColumnData(String optionDatasource, String optionTable, String optionColumn, String optionOrder) throws Exception { + Datasource ds = datasource.get(optionDatasource); + Provider datasourceProvider = ProviderFactory.getProvider(ds.getType()); + + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setDatasource(ds); + + ExtDDLProvider extDDLProvider = ProviderFactory.gerExtDDLProvider(ds.getType()); + + String sql = extDDLProvider.searchColumnData(optionTable, optionColumn, optionOrder); + + datasourceRequest.setQuery(sql); + + List data = datasourceProvider.getData(datasourceRequest); + + List result = new ArrayList<>(); + for (String[] datum : data) { + ExtTableField.Option option = new ExtTableField.Option(); + if (StringUtils.isBlank(datum[0])) { + continue; + } + option.setName(datum[0]); + option.setValue(datum[0]); + result.add(option); + } + + return result; + } + @Data public static class ExcelDataListener extends AnalysisEventListener> { private List> data = new ArrayList<>(); @@ -840,7 +869,16 @@ public class DataFillDataService { default: if (StringUtils.equalsIgnoreCase(field.getType(), "select") && !field.getSettings().isMultiple() || StringUtils.equalsIgnoreCase(field.getType(), "radio")) { boolean has = false; - for (ExtTableField.Option option : field.getSettings().getOptions()) { + List options = field.getSettings().getOptions(); + if (field.getSettings().getOptionSourceType() == 2 + && StringUtils.isNotBlank(field.getSettings().getOptionDatasource()) + && StringUtils.isNotBlank(field.getSettings().getOptionTable()) + && StringUtils.isNotBlank(field.getSettings().getOptionColumn()) + ) { + options = listColumnData(field.getSettings().getOptionDatasource(), field.getSettings().getOptionTable(), field.getSettings().getOptionColumn(), field.getSettings().getOptionOrder()); + } + + for (ExtTableField.Option option : options) { if (StringUtils.equals((String) option.getValue(), excelRowData)) { has = true; break; @@ -867,9 +905,19 @@ public class DataFillDataService { List result = new ArrayList<>(); if (CollectionUtils.isNotEmpty(list)) { + + List options = field.getSettings().getOptions(); + if (field.getSettings().getOptionSourceType() == 2 + && StringUtils.isNotBlank(field.getSettings().getOptionDatasource()) + && StringUtils.isNotBlank(field.getSettings().getOptionTable()) + && StringUtils.isNotBlank(field.getSettings().getOptionColumn()) + ) { + options = listColumnData(field.getSettings().getOptionDatasource(), field.getSettings().getOptionTable(), field.getSettings().getOptionColumn(), field.getSettings().getOptionOrder()); + } + for (String str : list) { boolean has = false; - for (ExtTableField.Option option : field.getSettings().getOptions()) { + for (ExtTableField.Option option : options) { if (StringUtils.equals((String) option.getValue(), str)) { has = true; break; @@ -877,6 +925,8 @@ public class DataFillDataService { } if (has) { result.add(str); + } else { + DataEaseException.throwException("[" + field.getSettings().getName() + "] 输入值[" + str + "]不在范围内"); } } if (CollectionUtils.isEmpty(result)) { diff --git a/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java b/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java index 0cef1c1548..d184e510a5 100644 --- a/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java +++ b/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java @@ -527,6 +527,21 @@ public class DataFillService { ExtTableField end = gson.fromJson(gson.toJson(field), ExtTableField.class); end.getSettings().getMapping().setColumnName(end.getSettings().getMapping().getColumnName2()); fields.add(end); + } else if (StringUtils.equalsIgnoreCase(field.getType(), "select") || StringUtils.equalsIgnoreCase(field.getType(), "radio") || StringUtils.equalsIgnoreCase(field.getType(), "checkbox")) { + if (field.getSettings().getOptionSourceType() == 2 + && StringUtils.isNotBlank(field.getSettings().getOptionDatasource()) + && StringUtils.isNotBlank(field.getSettings().getOptionTable()) + && StringUtils.isNotBlank(field.getSettings().getOptionColumn()) + ) { + List columnData = new ArrayList<>(); + try { + columnData = dataFillDataService.listColumnData(field.getSettings().getOptionDatasource(), field.getSettings().getOptionTable(), field.getSettings().getOptionColumn(), field.getSettings().getOptionOrder()); + } catch (Exception e) { + e.printStackTrace(); + } + field.getSettings().setOptions(columnData); + } + fields.add(field); } else { fields.add(field); } diff --git a/core/frontend/src/api/dataset/dataset.js b/core/frontend/src/api/dataset/dataset.js index 52904932f9..95ae8c5436 100644 --- a/core/frontend/src/api/dataset/dataset.js +++ b/core/frontend/src/api/dataset/dataset.js @@ -303,4 +303,13 @@ export function downloadFile(id) { }) } -export default { loadTable, getScene, addGroup, delGroup, addTable, delTable, groupTree, checkCustomDs, exportDataset } +export function getColumnList(datasource, table) { + return request({ + url: 'dataset/table/getFields', + method: 'post', + loading: true, + data: { dataSourceId: datasource, info: JSON.stringify({ table: table }) } + }) +} + +export default { loadTable, getScene, addGroup, delGroup, addTable, delTable, groupTree, checkCustomDs, exportDataset, getColumnList } diff --git a/core/frontend/src/api/system/datasource.js b/core/frontend/src/api/system/datasource.js index 0aa70d6556..8afb243690 100644 --- a/core/frontend/src/api/system/datasource.js +++ b/core/frontend/src/api/system/datasource.js @@ -163,4 +163,14 @@ export function getDatasourceDetail(id) { method: 'post' }) } -export default { getDatasourceDetail, dsGrid, addDs, editDs, delDs, validateDs, listDatasource, getSchema } + +export function getTableList(datasource) { + return request({ + url: 'datasource/getTables/' + datasource, + method: 'post', + loading: true, + data: {} + }) +} + +export default { getDatasourceDetail, dsGrid, addDs, editDs, delDs, validateDs, listDatasource, getSchema, getTableList } diff --git a/core/frontend/src/lang/en.js b/core/frontend/src/lang/en.js index 4ee3d2d25c..7245c75765 100644 --- a/core/frontend/src/lang/en.js +++ b/core/frontend/src/lang/en.js @@ -655,6 +655,9 @@ export default { set_multiple: 'Set Multiple', use_datetime: 'Use Datetime', custom: 'Custom', + use_datasource: 'Bind Datasource', + bind_column: 'Bind Column', + bind_complete: 'Bind', option_value: 'Options', add_option: 'Add Option', form_name_cannot_none: 'Form name cannot be null', @@ -670,6 +673,7 @@ export default { index_name: 'Index Name', create_index_hint: 'MySQL versions earlier than 8.0 or MariaDB versions earlier than 10.8.0 do not support Descending indexes', index_column: 'Index Column', + order: 'Sort', order_asc: 'Asc', order_desc: 'Desc', order_none: 'Default Order', diff --git a/core/frontend/src/lang/tw.js b/core/frontend/src/lang/tw.js index 485141a1db..de26a41a32 100644 --- a/core/frontend/src/lang/tw.js +++ b/core/frontend/src/lang/tw.js @@ -655,6 +655,9 @@ export default { set_multiple: '允許多選', use_datetime: '使用日期時間', custom: '自定義', + use_datasource: '綁定數據源', + bind_column: '綁定字段', + bind_complete: '已綁定', option_value: '選項值', add_option: '添加選項值', form_name_cannot_none: '表單名稱不能為空', @@ -670,6 +673,7 @@ export default { index_name: '索引名稱', create_index_hint: 'MySQL 8.0 或 MariaDB 10.8.0 以下版本不支持索引降序排序', index_column: '索引字段', + order: '排序', order_asc: '升序', order_desc: '降序', order_none: '默認排序', diff --git a/core/frontend/src/lang/zh.js b/core/frontend/src/lang/zh.js index c69cd4b868..a5f1afd377 100644 --- a/core/frontend/src/lang/zh.js +++ b/core/frontend/src/lang/zh.js @@ -653,6 +653,9 @@ export default { set_multiple: '允许多选', use_datetime: '使用日期时间', custom: '自定义', + use_datasource: '绑定数据源', + bind_column: '绑定字段', + bind_complete: '已绑定', option_value: '选项值', add_option: '添加选项值', form_name_cannot_none: '表单名称不能为空', @@ -668,6 +671,7 @@ export default { index_name: '索引名称', create_index_hint: 'MySQL 8.0 或 MariaDB 10.8.0 以下版本不支持索引降序排序', index_column: '索引字段', + order: '排序', order_asc: '升序', order_desc: '降序', order_none: '默认排序', diff --git a/core/frontend/src/views/dataFilling/form/EditFormData.vue b/core/frontend/src/views/dataFilling/form/EditFormData.vue index ab6b4724cb..4d060b77c6 100644 --- a/core/frontend/src/views/dataFilling/form/EditFormData.vue +++ b/core/frontend/src/views/dataFilling/form/EditFormData.vue @@ -1,7 +1,12 @@ - diff --git a/core/frontend/src/views/dataFilling/form/dataFilling.js b/core/frontend/src/views/dataFilling/form/dataFilling.js index ac8107d692..baa8e85498 100644 --- a/core/frontend/src/views/dataFilling/form/dataFilling.js +++ b/core/frontend/src/views/dataFilling/form/dataFilling.js @@ -168,3 +168,11 @@ export function userFillFormData(userTaskId, data) { data }) } + +export function getTableColumnData(optionDatasource, optionTable, optionColumn, optionOrder) { + return request({ + url: `dataFilling/form/${optionDatasource}/${optionTable}/${optionColumn}/options/${optionOrder}`, + method: 'post', + loading: true + }) +} diff --git a/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/dto/datafill/ExtTableField.java b/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/dto/datafill/ExtTableField.java index 2aaea51937..af93ac2272 100644 --- a/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/dto/datafill/ExtTableField.java +++ b/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/dto/datafill/ExtTableField.java @@ -56,6 +56,11 @@ public class ExtTableField implements Serializable { private Integer optionSourceType; + private String optionDatasource; + private String optionTable; + private String optionColumn; + private String optionOrder; + private boolean multiple; private List