Merge pull request #9853 from ulleo/dev

feat(X-Pack): 数据填报表单日期组件支持设置年/年月
This commit is contained in:
ulleo 2024-05-24 16:45:47 +08:00 committed by GitHub
commit 0b38e0ce77
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 153 additions and 113 deletions

View File

@ -42,7 +42,29 @@ public class CommentWriteHandler implements RowWriteHandler {
StringBuilder options = new StringBuilder();
switch (field.getSettings().getMapping().getType()) {
case datetime:
example = "\n(日期格式: yyyy/MM/dd" + (field.getSettings().isEnableTime() ? " HH:mm:ss" : "") + ")";
String dateFormat = "yyyy/MM/dd";
switch (field.getSettings().getDateType()) {
case "year":
dateFormat = "yyyy";
break;
case "month":
case "monthrange":
dateFormat = "yyyy/MM";
break;
case "datetime":
case "datetimerange":
dateFormat = "yyyy/MM/dd HH:mm:ss";
break;
case "date":
case "daterange":
dateFormat = "yyyy/MM/dd";
break;
default:
if (field.getSettings().isEnableTime()) { //兼容旧版
dateFormat = "yyyy/MM/dd HH:mm:ss";
}
}
example = "\n(日期格式: " + dateFormat + ")";
break;
case number:
example = "\n(整形数字)";

View File

@ -934,16 +934,53 @@ public class DataFillDataService {
return null;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //默认会拿到这种格式的
if (field.getSettings().isEnableTime()) {
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
switch (field.getSettings().getDateType()) {
case "year":
sdf = new SimpleDateFormat("yyyy");
break;
case "month":
case "monthrange":
sdf = new SimpleDateFormat("yyyy-MM");
break;
case "datetime":
case "datetimerange":
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
break;
case "date":
case "daterange":
sdf = new SimpleDateFormat("yyyy-MM-dd");
break;
default:
if (field.getSettings().isEnableTime()) { //兼容旧版
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
}
Date date = null;
try {
date = sdf.parse(excelRowData);
} catch (ParseException e) {
sdf = new SimpleDateFormat("yyyy/MM/dd"); //以防万一也加上这种
if (field.getSettings().isEnableTime()) {
sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
switch (field.getSettings().getDateType()) {
case "year":
sdf = new SimpleDateFormat("yyyy");
break;
case "month":
case "monthrange":
sdf = new SimpleDateFormat("yyyy/MM");
break;
case "datetime":
case "datetimerange":
sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
break;
case "date":
case "daterange":
sdf = new SimpleDateFormat("yyyy/MM/dd");
break;
default:
if (field.getSettings().isEnableTime()) { //兼容旧版
sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
}
}
date = sdf.parse(excelRowData);
}

View File

@ -648,6 +648,7 @@ export default {
start_hint_word: 'Start Hint Word',
end_hint_word: 'End Hint Word',
input_type: 'Input Type',
date_type: 'Date Format',
check: 'Check',
set_required: 'Set Required',
set_unique: 'Set Unique',

View File

@ -648,6 +648,7 @@ export default {
start_hint_word: '開始提示詞',
end_hint_word: '結束提示詞',
input_type: '格式類型',
date_type: '展示粒度',
check: '校驗',
set_required: '設置為必填項',
set_unique: '不允許重復值',

View File

@ -646,6 +646,7 @@ export default {
start_hint_word: '开始提示词',
end_hint_word: '结束提示词',
input_type: '格式类型',
date_type: '展示粒度',
check: '校验',
set_required: '设置为必填项',
set_unique: '不允许重复值',

View File

@ -91,6 +91,12 @@ export default {
forEach(this.forms, v => {
if (!v.removed) {
const f = cloneDeep(v)
if (f.type === 'date' && f.settings.dateType === undefined) { //
f.settings.dateType = f.settings.enableTime ? 'datetime' : 'date'
}
if (f.type === 'dateRange' && f.settings.dateType === undefined) { //
f.settings.dateType = f.settings.enableTime ? 'datetimerange' : 'daterange'
}
if (f.type === 'dateRange') {
const _start = this.data[f.settings.mapping.columnName1]
const _end = this.data[f.settings.mapping.columnName2]
@ -349,46 +355,22 @@ export default {
</el-checkbox>
</el-checkbox-group>
<el-date-picker
v-else-if="item.type === 'date' && !item.settings.enableTime"
v-else-if="item.type === 'date'"
v-model="item.value"
:required="item.settings.required"
:readonly="readonly"
type="date"
:type="item.settings.dateType"
:placeholder="item.settings.placeholder"
style="width: 100%"
size="small"
:picker-options="pickerOptions"
/>
<el-date-picker
v-else-if="item.type === 'date' && item.settings.enableTime"
v-else-if="item.type === 'dateRange'"
v-model="item.value"
:required="item.settings.required"
:readonly="readonly"
type="datetime"
:placeholder="item.settings.placeholder"
style="width: 100%"
size="small"
:picker-options="pickerOptions"
/>
<el-date-picker
v-else-if="item.type === 'dateRange' && !item.settings.enableTime"
v-model="item.value"
:required="item.settings.required"
:readonly="readonly"
type="daterange"
:range-separator="item.settings.rangeSeparator"
:start-placeholder="item.settings.startPlaceholder"
:end-placeholder="item.settings.endPlaceholder"
style="width: 100%"
size="small"
:picker-options="pickerOptions"
/>
<el-date-picker
v-else-if="item.type === 'dateRange' && item.settings.enableTime"
v-model="item.value"
:required="item.settings.required"
:readonly="readonly"
type="datetimerange"
:type="item.settings.dateType"
:range-separator="item.settings.rangeSeparator"
:start-placeholder="item.settings.startPlaceholder"
:end-placeholder="item.settings.endPlaceholder"

View File

@ -180,9 +180,9 @@
<span
v-if="c.date && scope.row.data[c.props]"
style="white-space:nowrap; width: fit-content"
:title="formatDate(scope.row.data[c.props], c.enableTime)"
:title="formatDate(scope.row.data[c.props], c.dateType)"
>
{{ formatDate(scope.row.data[c.props], c.enableTime) }}
{{ formatDate(scope.row.data[c.props], c.dateType) }}
</span>
<template v-else-if="(c.type === 'select' && c.multiple || c.type === 'checkbox') && scope.row.data[c.props]">
<div
@ -623,7 +623,7 @@ export default {
props: f.settings?.mapping?.columnName1,
label: f.settings?.name,
date: true,
enableTime: f.settings?.enableTime,
dateType: f.settings?.dateType ? f.settings?.dateType : (f.settings?.enableTime ? 'datetimerange' : 'daterange'),
type: f.type,
multiple: !!f.settings.multiple,
rangeIndex: 0
@ -632,7 +632,7 @@ export default {
props: f.settings?.mapping?.columnName2,
label: f.settings?.name,
date: true,
enableTime: f.settings?.enableTime,
dateType: f.settings?.dateType ? f.settings?.dateType : (f.settings?.enableTime ? 'datetimerange' : 'daterange'),
type: f.type,
multiple: !!f.settings.multiple,
rangeIndex: 1
@ -642,7 +642,7 @@ export default {
props: f.settings?.mapping?.columnName,
label: f.settings?.name,
date: f.type === 'date',
enableTime: f.type === 'date' && f.settings?.enableTime,
dateType: f.type === 'date' ? (f.settings?.dateType ? f.settings?.dateType : (f.settings?.enableTime ? 'datetime' : 'date')) : undefined,
type: f.type,
multiple: !!f.settings.multiple
})
@ -961,14 +961,21 @@ export default {
}).catch(() => {
})
},
formatDate(value, enableTime) {
formatDate(value, dateType) {
if (!value) {
return value
}
if (enableTime) {
return value.format('yyyy-MM-dd hh:mm:ss')
} else {
return value.format('yyyy-MM-dd')
switch (dateType) {
case 'year':
return value.format('yyyy')
case 'month':
case 'monthrange':
return value.format('yyyy-MM')
case 'datetime':
case 'datetimerange':
return value.format('yyyy-MM-dd hh:mm:ss')
default:
return value.format('yyyy-MM-dd')
}
},

View File

@ -30,6 +30,17 @@ export default {
disableCreateIndex: false,
requiredRule: { required: true, message: this.$t('commons.required'), trigger: ['blur', 'change'] },
duplicateOptionRule: { validator: checkDuplicateOptionValidator, trigger: ['blur', 'change'] },
dateTypes: [
{ name: this.$t('chart.y'), value: 'year' },
{ name: this.$t('chart.y_M'), value: 'month' },
{ name: this.$t('chart.y_M_d'), value: 'date' },
{ name: this.$t('chart.y_M_d_H_m_s'), value: 'datetime' }
],
dateRangeTypes: [
{ name: this.$t('chart.y_M'), value: 'monthrange' },
{ name: this.$t('chart.y_M_d'), value: 'daterange' },
{ name: this.$t('chart.y_M_d_H_m_s'), value: 'datetimerange' }
],
inputTypes: [
{ type: 'text', name: this.$t('data_fill.form.text'), rules: [] },
{ type: 'number', name: this.$t('data_fill.form.number'), rules: [] },
@ -150,7 +161,8 @@ export default {
id: undefined,
settings: {
name: this.$t('commons.component.date'),
enableTime: false,
enableTime: false, //
dateType: 'date',
placeholder: '',
required: false,
mapping: {
@ -169,7 +181,8 @@ export default {
id: undefined,
settings: {
name: this.$t('commons.component.dateRange'),
enableTime: false,
enableTime: false, //
dateType: 'daterange',
rangeSeparator: '-',
startPlaceholder: '',
endPlaceholder: '',
@ -265,13 +278,20 @@ export default {
this.formSettings = tempData
this.formSettings.table = tempData.tableName
this.formSettings.folder = tempData.pid
this.formSettings.forms = filter(JSON.parse(res.data.forms), f => !f.removed)
forEach(this.formSettings.forms, f => {
const tempForms = filter(JSON.parse(res.data.forms), f => !f.removed)
forEach(tempForms, f => {
f.old = true
if (f.type === 'checkbox' || f.type === 'select' && f.settings.multiple) {
f.value = []
}
if (f.type === 'date' && f.settings.dateType === undefined) { //
f.settings.dateType = f.settings.enableTime ? 'datetime' : 'date'
}
if (f.type === 'dateRange' && f.settings.dateType === undefined) { //
f.settings.dateType = f.settings.enableTime ? 'datetimerange' : 'daterange'
}
})
this.formSettings.forms = tempForms
this.formSettings.oldForms = JSON.parse(res.data.forms)
this.formSettings.tableIndexes = JSON.parse(res.data.tableIndexes)
@ -717,43 +737,21 @@ export default {
</el-checkbox>
</el-checkbox-group>
<el-date-picker
v-else-if="item.type === 'date' && !item.settings.enableTime"
v-else-if="item.type === 'date'"
:key="item.id + 'date'"
v-model="item.value"
:required="item.settings.required"
type="date"
:type="item.settings.dateType"
:placeholder="item.settings.placeholder"
style="width: 100%"
size="small"
/>
<el-date-picker
v-else-if="item.type === 'date' && item.settings.enableTime"
:key="item.id + 'dateEnableTime'"
v-else-if="item.type === 'dateRange'"
:key="item.id + 'dateRange'"
v-model="item.value"
:required="item.settings.required"
type="datetime"
:placeholder="item.settings.placeholder"
style="width: 100%"
size="small"
/>
<el-date-picker
v-else-if="item.type === 'dateRange' && !item.settings.enableTime"
:key="item.id + 'dateRangeEnableTime'"
v-model="item.value"
:required="item.settings.required"
type="daterange"
:range-separator="item.settings.rangeSeparator"
:start-placeholder="item.settings.startPlaceholder"
:end-placeholder="item.settings.endPlaceholder"
style="width: 100%"
size="small"
/>
<el-date-picker
v-else-if="item.type === 'dateRange' && item.settings.enableTime"
:key="item.id + 'datetimerangeRangeEnableTime'"
v-model="item.value"
:required="item.settings.required"
type="datetimerange"
:type="item.settings.dateType"
:range-separator="item.settings.rangeSeparator"
:start-placeholder="item.settings.startPlaceholder"
:end-placeholder="item.settings.endPlaceholder"
@ -918,6 +916,27 @@ export default {
</el-select>
</el-form-item>
<el-form-item
v-if="selectedComponentItem.type === 'date' || selectedComponentItem.type === 'dateRange'"
prop="dateType"
class="form-item"
:label="$t('data_fill.form.date_type')"
:rules="[requiredRule]"
>
<el-select
v-model="selectedComponentItem.settings.dateType"
style="width: 100%"
required
>
<el-option
v-for="(x) in selectedComponentItem.type === 'date' ? dateTypes : dateRangeTypes"
:key="x.value"
:label="x.name"
:value="x.value"
/>
</el-select>
</el-form-item>
<div class="right-check-div">
<div class="m-label-container">
<span style="width: unset; font-weight: bold">
@ -956,17 +975,6 @@ export default {
{{ $t('data_fill.form.set_multiple') }}
</el-checkbox>
</el-form-item>
<el-form-item
v-if="selectedComponentItem.type === 'date' || selectedComponentItem.type === 'dateRange'"
prop="enableTime"
class="form-item"
>
<el-checkbox
v-model="selectedComponentItem.settings.enableTime"
>
{{ $t('data_fill.form.use_datetime') }}
</el-checkbox>
</el-form-item>
</div>

View File

@ -212,39 +212,17 @@ export default {
this.selectedFormTitle = res.data.name
this.forms = JSON.parse(res.data.forms)
const _list = []
const dateFormatColumns = []
forEach(this.forms, f => {
if (f.type === 'dateRange') {
_list.push({
props: f.settings?.mapping?.columnName1,
label: f.settings?.name,
date: true,
enableTime: f.settings?.enableTime,
type: f.type,
multiple: !!f.settings.multiple,
rangeIndex: 0
})
_list.push({
props: f.settings?.mapping?.columnName2,
label: f.settings?.name,
date: true,
enableTime: f.settings?.enableTime,
type: f.type,
multiple: !!f.settings.multiple,
rangeIndex: 1
})
dateFormatColumns.push(f.settings?.mapping?.columnName1)
dateFormatColumns.push(f.settings?.mapping?.columnName2)
} else {
_list.push({
props: f.settings?.mapping?.columnName,
label: f.settings?.name,
date: f.type === 'date',
enableTime: f.type === 'date' && f.settings?.enableTime,
type: f.type,
multiple: !!f.settings.multiple
})
if (f.type === 'date') {
dateFormatColumns.push(f.settings?.mapping?.columnName)
}
}
})
const dateFormatColumns = map(filter(_list, c => c.date), 'props')
searchTable(row.formId, {
primaryKeyValue: row.valueId,

View File

@ -39,6 +39,7 @@ public class ExtTableField implements Serializable {
private ExtTableFieldMapping mapping;
//弃用
private boolean enableTime;
private String rangeSeparator;
@ -47,6 +48,8 @@ public class ExtTableField implements Serializable {
private String inputType;
private String dateType;
private String placeholder;
private String startPlaceholder;
private String endPlaceholder;