Merge branch 'dev' into v1.18

This commit is contained in:
taojinlong 2023-03-07 11:33:33 +08:00
commit 5661af36fd
23 changed files with 143 additions and 39 deletions

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>dataease-server</artifactId>
<groupId>io.dataease</groupId>
<version>1.18.4</version>
<version>${dataease.version}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@ -204,7 +204,7 @@
<dependency>
<groupId>io.dataease</groupId>
<artifactId>dataease-plugin-interface</artifactId>
<version>1.18.4</version>
<version>${dataease.version}</version>
<exclusions>
<exclusion>
<artifactId>guava</artifactId>
@ -215,12 +215,12 @@
<dependency>
<groupId>io.dataease</groupId>
<artifactId>dataease-plugin-view</artifactId>
<version>1.18.4</version>
<version>${dataease.version}</version>
</dependency>
<dependency>
<groupId>io.dataease</groupId>
<artifactId>dataease-plugin-datasource</artifactId>
<version>1.18.4</version>
<version>${dataease.version}</version>
</dependency>
<!-- kettle及数据源依赖 -->
<dependency>

View File

@ -56,11 +56,7 @@ public class MysqlDDLProvider extends DDLProviderImpl {
Integer size = datasetTableField.getSize() * 4;
switch (datasetTableField.getDeExtractType()) {
case 0:
if (size < 65533) {
Column_Fields.append("varchar(length)".replace("length", String.valueOf(datasetTableField.getSize()))).append(",`");
}else {
Column_Fields.append("longtext").append(",`");
}
Column_Fields.append("longtext").append(",`");
break;
case 1:
size = size < 50? 50 : size;

View File

@ -71,6 +71,8 @@ import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@ -1795,8 +1797,7 @@ public class ChartViewService {
}
private String handleVariable(String sql, ChartExtRequest requestList, QueryProvider qp, DataSetTableDTO table, Datasource ds) throws Exception {
List<SqlVariableDetails> sqlVariables = new Gson().fromJson(table.getSqlVariableDetails(), new TypeToken<List<SqlVariableDetails>>() {
}.getType());
List<SqlVariableDetails> sqlVariables = new Gson().fromJson(table.getSqlVariableDetails(), new TypeToken<List<SqlVariableDetails>>() {}.getType());
if (requestList != null && CollectionUtils.isNotEmpty(requestList.getFilter())) {
for (ChartExtFilterRequest chartExtFilterRequest : requestList.getFilter()) {
if (CollectionUtils.isEmpty(chartExtFilterRequest.getValue())) {
@ -1845,7 +1846,7 @@ public class ChartViewService {
}
}
}
sql = dataSetTableService.removeVariables(sql, ds.getType());
sql = dataSetTableService.handleVariableDefaultValue(sql, null, ds.getType());
return sql;
}

View File

@ -123,7 +123,6 @@ public class ViewPluginBaseServiceImpl implements ViewPluginBaseService {
case SQL:
String sql = dataTableInfoDTO.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfoDTO.getSql())) : dataTableInfoDTO.getSql();
tableName = dataSetTableService.handleVariableDefaultValue(sql, null, pluginViewSet.getDsType());
tableName = "(" + sqlFix(tableName) + ")";
break;
case CUSTOM:

View File

@ -144,7 +144,7 @@ public class DataSetTableService {
private static boolean isUpdatingDatasetTableStatus = false;
private static final String lastUpdateTime = "${__last_update_time__}";
private static final String currentUpdateTime = "${__current_update_time__}";
private static final String regex = "\\$\\{(.*?)\\}";
public static final String regex = "\\$\\{(.*?)\\}";
private static final String SubstitutedParams = "DATAEASE_PATAMS_BI";
private static final String SubstitutedSql = " 'BI' = 'BI' ";
@ -701,7 +701,7 @@ public class DataSetTableService {
datasourceRequest.setDatasource(ds);
DataTableInfoDTO dataTableInfo = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class);
String sql = dataTableInfo.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfo.getSql())) : dataTableInfo.getSql();
sql = handleVariableDefaultValue(sql, null, ds.getType());
sql = handleVariableDefaultValue(sql, datasetTable.getSqlVariableDetails(), ds.getType());
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
datasourceRequest.setQuery(
qp.createQuerySQLWithPage(sql, fields, page, pageSize, realSize, false, null, rowPermissionsTree));
@ -1058,15 +1058,15 @@ public class DataSetTableService {
Matcher matcher = pattern.matcher(sql);
while (matcher.find()) {
SqlVariableDetails defaultsSqlVariableDetail = null;
List<SqlVariableDetails> defaultsSqlVariableDetails = new Gson().fromJson(sqlVariableDetails, new TypeToken<List<SqlVariableDetails>>() {
}.getType());
List<SqlVariableDetails> defaultsSqlVariableDetails = new Gson().fromJson(sqlVariableDetails, new TypeToken<List<SqlVariableDetails>>() {}.getType());
for (SqlVariableDetails sqlVariableDetail : defaultsSqlVariableDetails) {
if (matcher.group().substring(2, matcher.group().length() - 1).equalsIgnoreCase(sqlVariableDetail.getVariableName())) {
defaultsSqlVariableDetail = sqlVariableDetail;
break;
}
}
if (defaultsSqlVariableDetail != null && StringUtils.isNotEmpty(defaultsSqlVariableDetail.getDefaultValue())) {
if (defaultsSqlVariableDetail != null && defaultsSqlVariableDetail.getDefaultValueScope() != null &&
defaultsSqlVariableDetail.getDefaultValueScope().equals(SqlVariableDetails.DefaultValueScope.ALLSCOPE) && StringUtils.isNotEmpty(defaultsSqlVariableDetail.getDefaultValue())) {
sql = sql.replace(matcher.group(), defaultsSqlVariableDetail.getDefaultValue());
}
}
@ -2264,6 +2264,9 @@ public class DataSetTableService {
}
Set<String> nameSet = new HashSet<>();
for (DataSetTableRequest table : datasetTable) {
if(StringUtils.isEmpty(table.getName())){
throw new RuntimeException(Translator.get("I18n_name_cant_empty"));
}
nameSet.add(table.getName());
}
if (nameSet.size() != datasetTable.size()) {

View File

@ -70,6 +70,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
@ -741,6 +742,39 @@ public class ExtractDataService {
totalSheets = excelXlsxReader.totalSheets;
}
if (StringUtils.equalsIgnoreCase(suffix, "csv")) {
List<TableField> fields = new ArrayList<>();
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(excelSheetData.getPath()), StandardCharsets.UTF_8));
String s = reader.readLine();// first line
String[] split = s.split(",");
for (String s1 : split) {
TableField tableFiled = new TableField();
tableFiled.setFieldName(s1);
tableFiled.setRemarks(s1);
tableFiled.setFieldType("TEXT");
fields.add(tableFiled);
}
List<List<String>> csvData = new ArrayList<>();
String line;
while ((line = reader.readLine()) != null) {
if(line.endsWith(",")){
List<String> list = new ArrayList<>(Arrays.asList(line.split(",")));
list.add("");
csvData.add(list);
}else {
csvData.add(Arrays.asList(line.split(",")));
}
}
ExcelSheetData csvSheetData = new ExcelSheetData();
String[] fieldArray = fields.stream().map(TableField::getFieldName).toArray(String[]::new);
csvSheetData.setFields(fields);
csvSheetData.setData(csvData);
csvSheetData.setExcelLabel(excelSheetData.getExcelLabel());
csvSheetData.setFieldsMd5(Md5Utils.md5(StringUtils.join(fieldArray, ",")));
totalSheets = Arrays.asList(csvSheetData);
}
for (ExcelSheetData sheet : totalSheets) {
if (sheet.getExcelLabel().equalsIgnoreCase(excelSheetData.getExcelLabel())) {
for (List<String> dataItem : sheet.getData()) {

View File

@ -171,7 +171,7 @@ public class DirectFieldService implements DataSetFieldService {
if (dataTableInfoDTO.isBase64Encryption()) {
sql = new String(java.util.Base64.getDecoder().decode(sql));
}
sql = dataSetTableService.removeVariables(sql, ds.getType());
sql = dataSetTableService.handleVariableDefaultValue(sql, datasetTable.getSqlVariableDetails(), ds.getType());
datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields));
} else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.CUSTOM.toString())) {
DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class);

View File

@ -363,7 +363,7 @@ public class PanelAppTemplateService {
//替换datasetId
chartViewField.setTableId(datasetsRealMap.get(chartViewField.getTableId()));
//替换chartViewId
chartViewField.setChartId(chartViewsRealMap.get(chartViewField.getId()));
chartViewField.setChartId(chartViewsRealMap.get(chartViewField.getChartId()));
//替换datasetFieldId
datasetFieldsRealMap.forEach((k, v) -> {
chartViewField.setOriginName(chartViewField.getOriginName().replaceAll(k, v));

View File

@ -272,3 +272,4 @@ I18N_PANEL_PDF_TEMPLATE_ONLY_PIC=Default template only screenshot
\u8FB9\u68468=Border 8
\u8FB9\u68469=Border 9
\u8FB9\u684610=Border 10
I18n_name_cant_empty=Name can not be empty!

View File

@ -262,4 +262,5 @@ I18N_LOG_FORMAT_PREFIX=\u4EE5%s\u3010%s\u3011\u6743\u9650
I18N_CRON_ERROR=cron\u8868\u8FBE\u5F0F\u9519\u8BEF
I18N_PANEL_PDF_TEMPLATE_WITH_PARAMS=\u9ED8\u8BA4\u6A21\u677F(\u52A0\u53C2\u6570\u6837\u5F0F)
I18N_PANEL_PDF_TEMPLATE_ONLY_PIC=\u9ED8\u8BA4\u6A21\u677F(\u53EA\u622A\u56FE)
I18n_name_cant_empty=名称不能为空!

View File

@ -268,3 +268,4 @@ I18N_PANEL_PDF_TEMPLATE_ONLY_PIC=\u9ED8\u8A8D\u6A21\u677F(\u53EA\u622A\u5716)
\u8FB9\u68468=\u908A\u6846 8
\u8FB9\u68469=\u908A\u6846 9
\u8FB9\u684610=\u908A\u6846 10
I18n_name_cant_empty=名稱不能為空!

View File

@ -1,6 +1,6 @@
{
"name": "dataease",
"version": "1.18.4",
"version": "1.18.5",
"description": "dataease front",
"private": true,
"scripts": {

View File

@ -6,7 +6,7 @@
<parent>
<artifactId>dataease-server</artifactId>
<groupId>io.dataease</groupId>
<version>1.18.4</version>
<version>${dataease.version}</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -1519,12 +1519,14 @@ export default {
p_center: 'Center'
},
dataset: {
scope_edit: 'Effective only when editing',
scope_all: 'Effect globally when the dataset is previewed',
spend_time: 'Spend',
sql: 'SQL',
sql_result: 'Result',
parse_filed: 'Parse Field',
field_rename: 'Rename Field',
params_work: 'Effective only when editing SQL',
params_work: 'Effective only when editing: parameter values are effective only when editing data sets; Global Effective: It takes effect in dataset view, preview, and view where dataset is used.',
sql_variable_limit_1: '1、SQL variables can only be used in where conditions',
sql_variable_limit_2: '2、Exampleselect * from table_name where column_name1=\'${param_name1}\' and column_name2 in \'${param_name2}\'',
select_year: 'Select Year',

View File

@ -1513,12 +1513,14 @@ export default {
p_center: '居中'
},
dataset: {
scope_edit: '僅編輯時生效',
scope_all: '數据集預覽時全域生效',
spend_time: '耗時',
sql: 'SQL 語句',
sql_result: '運行結果',
parse_filed: '解析字段',
field_rename: '字段重命名',
params_work: '僅在編輯 sql 時生效',
params_work: '僅編輯時生效:參數值僅數据集編輯時生效 全域生效:在數据集查看、預覽、以及用到數据集的視圖中均生效。',
sql_variable_limit_1: '1、SQL變數只能在WHERE條件中使用',
sql_variable_limit_2: '2、示例select * from table_name where column_name1=\'${param_name1}\' and column_name2 in \'${param_name2}\'',
selesql_variable_limit_2ct_year: '選擇年',

View File

@ -1512,12 +1512,14 @@ export default {
p_center: '居中'
},
dataset: {
scope_edit: '仅编辑时生效',
scope_all: '数据集预览时全局生效',
spend_time: '耗时',
sql: 'SQL 语句',
sql_result: '运行结果',
parse_filed: '解析字段',
field_rename: '字段重命名',
params_work: '仅在编辑sql时生效',
params_work: '仅编辑时生效:参数值仅数据集编辑时生效;全局生效:在数据集查看、预览、以及用到数据集的视图中均生效。',
select_year: '选择年',
sql_variable_limit_1: '1、SQL 变量只能在 WHERE 条件中使用',
sql_variable_limit_2: '2、示例select * from table_name where column_name1=\'${param_name1}\' and column_name2 in \'${param_name2}\'',

View File

@ -478,8 +478,21 @@
v-model="scope.row.defaultValue"
size="small"
type="text"
:placeholder="$t('fu.search_bar.please_input')"
/>
:placeholder="$t('fu.search_bar.please_input')">
<el-select
slot="prepend"
v-model="scope.row.defaultValueScope"
style="width: 100px"
size="small"
>
<el-option
v-for="item in defaultValueScopeList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-input>
<el-input
v-if="
scope.row.type[0] === 'LONG' ||
@ -489,8 +502,36 @@
size="small"
:placeholder="$t('fu.search_bar.please_input')"
type="number"
/>
>
<el-select
slot="prepend"
v-model="scope.row.defaultValueScope"
style="width: 100px"
size="small"
>
<el-option
v-for="item in defaultValueScopeList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-input>
<div v-if="['DATETIME-YEAR', 'DATETIME-YEAR-MONTH', 'DATETIME-YEAR-MONTH-DAY', 'DATETIME'].includes(scope.row.type[0])" class="el-input-group el-input-group--prepend de-group__prepend">
<div class="el-input-group__prepend">
<el-select
v-model="scope.row.defaultValueScope"
style="width: 100px"
size="small"
>
<el-option
v-for="item in defaultValueScopeList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
<el-date-picker
v-if="scope.row.type[0] === 'DATETIME-YEAR'"
v-model="scope.row.defaultValue"
@ -529,6 +570,7 @@
:value-format="scope.row.type[1]"
:placeholder="$t('dataset.select_time')"
/>
</div>
</template>
</el-table-column>
</el-table>
@ -653,6 +695,9 @@ export default {
dialogTitle: '',
variables: [],
variablesTmp: [],
defaultValueScopeList: [
{ label: this.$t('dataset.scope_edit'), value: 'EDIT' },
{ label: this.$t('dataset.scope_all'), value: 'ALLSCOPE' }],
fieldOptions: [
{ label: this.$t('dataset.text'), value: 'TEXT' },
{ label: this.$t('dataset.value'), value: 'LONG' },
@ -1038,6 +1083,9 @@ export default {
for (let i = 0; i < this.variables.length; i++) {
if (this.variables[i].variableName === name) {
obj = this.variables[i]
if(!obj.hasOwnProperty("defaultValueScope")){
obj.defaultValueScope = 'EDIT'
}
}
}
if (obj === undefined) {
@ -1047,7 +1095,8 @@ export default {
type: [],
required: false,
defaultValue: '',
details: ''
details: '',
defaultValueScope: 'EDIT'
}
obj.type.push('TEXT')
}
@ -1093,8 +1142,13 @@ export default {
padding-bottom: 80px;
}
.de-group__prepend {
width: 100%;
}
.el-date-editor {
width: 100%;
display: inline-block;
}
.select-type {

View File

@ -574,7 +574,7 @@ export default {
startTime: '',
rate: 'SIMPLE',
cron: '',
endTime: '',
endTime: 0,
end: '0',
extraData: {
simple_cron_type: 'hour',
@ -779,6 +779,7 @@ export default {
this.taskForm.name =
this.table.name + ' ' + this.$t('dataset.task_update')
this.taskForm.startTime = new Date()
this.taskForm.endTime = new Date()
this.update_task_dialog_title = this.$t('dataset.task_add_title')
} else {
// update
@ -908,6 +909,7 @@ export default {
}
this.incrementalConfig.tableId = this.table.id
task.startTime = new Date(task.startTime).getTime()
console.log(task.endTime)
task.endTime = new Date(task.endTime).getTime()
task.tableId = this.table.id
const form = JSON.parse(JSON.stringify(task))
@ -1030,7 +1032,7 @@ export default {
onRateChange() {
if (this.taskForm.rate === 'SIMPLE') {
this.taskForm.end = '0'
this.taskForm.endTime = ''
this.taskForm.endTime = 0
this.taskForm.cron = ''
this.showCron = false
}

View File

@ -530,7 +530,7 @@ export default {
startTime: '',
rate: 'SIMPLE',
cron: '',
endTime: '',
endTime: 0,
end: '0',
extraData: {
simple_cron_type: 'hour',
@ -707,6 +707,7 @@ export default {
this.resetTaskForm()
this.taskForm.name = this.table.name + ' ' + this.$t('dataset.task_update')
this.taskForm.startTime = new Date()
this.taskForm.endTime = new Date()
this.update_task_dialog_title = this.$t('dataset.task_add_title')
} else {
this.taskForm = JSON.parse(JSON.stringify(task))
@ -854,7 +855,7 @@ export default {
onRateChange() {
if (this.taskForm.rate === 'SIMPLE') {
this.taskForm.end = '0'
this.taskForm.endTime = ''
this.taskForm.endTime = 0
this.taskForm.cron = ''
}
if (this.taskForm.rate === 'SIMPLE_CRON') {

View File

@ -295,7 +295,7 @@ export default {
tableId: '',
rate: 'SIMPLE',
cron: '',
endTime: '',
endTime: 0,
end: '0',
extraData: {
simple_cron_type: 'hour',
@ -391,6 +391,7 @@ export default {
this.taskDetail = { datasetName, id, tableId }
if (!id) {
this.taskForm.startTime = new Date()
this.taskForm.endTime = new Date()
return
}
this.getTaskDetail(id)
@ -418,7 +419,7 @@ export default {
onRateChange() {
if (this.taskForm.rate === 'SIMPLE') {
this.taskForm.end = '0'
this.taskForm.endTime = ''
this.taskForm.endTime = 0
this.taskForm.cron = ''
this.showCron = false
}

View File

@ -1,6 +1,6 @@
{
"name": "dataease-mobile",
"version": "1.18.4",
"version": "1.18.5",
"private": true,
"scripts": {
"serve": "npm run dev:h5",

View File

@ -6,7 +6,7 @@
<parent>
<artifactId>dataease-server</artifactId>
<groupId>io.dataease</groupId>
<version>1.18.4</version>
<version>${dataease.version}</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>io.dataease</groupId>
<artifactId>dataease-server</artifactId>
<version>1.18.4</version>
<version>${dataease.version}</version>
<packaging>pom</packaging>
<parent>
@ -15,6 +15,10 @@
<relativePath/>
</parent>
<properties>
<dataease.version>1.18.5</dataease.version>
</properties>
<name>dataease</name>
<modules>