feat(X-Pack): [数据填报]选项值的绑定,可以绑定拥有读数据权限的数据源表字段

This commit is contained in:
ulleo
2024-06-20 15:18:22 +08:00
parent 4ff059eb70
commit cbf1376619
15 changed files with 692 additions and 101 deletions

View File

@@ -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<String, Object> 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<ExtTableField.Option> listColumnData(@PathVariable String optionDatasource, @PathVariable String optionTable, @PathVariable String optionColumn, @PathVariable String optionOrder) throws Exception {
return dataFillDataService.listColumnData(optionDatasource, optionTable, optionColumn, optionOrder);
}
}

View File

@@ -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<TableField> searchFields) {
StringBuilder builder = new StringBuilder("WHERE 1 = 1 ");

View File

@@ -689,6 +689,35 @@ public class DataFillDataService {
return rowId;
}
public List<ExtTableField.Option> 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<String[]> data = datasourceProvider.getData(datasourceRequest);
List<ExtTableField.Option> 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<Map<Integer, String>> {
private List<List<String>> 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<ExtTableField.Option> 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<String> result = new ArrayList<>();
if (CollectionUtils.isNotEmpty(list)) {
List<ExtTableField.Option> 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)) {

View File

@@ -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<ExtTableField.Option> 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);
}