three-trees-ui 1.0.68 → 1.0.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/three-trees-ui.common.js +17574 -16324
- package/lib/three-trees-ui.css +1 -1
- package/lib/three-trees-ui.umd.js +17574 -16324
- package/lib/three-trees-ui.umd.min.js +1 -1
- package/package.json +1 -1
- package/packages/CustomDialog/src/customDialog.vue +74 -12
- package/packages/DataLists/src/main.vue +2 -3
- package/packages/QuerySqlPreview/src/QuerySqlPreview.vue +43 -1
- package/packages/Subtable/src/SubExportDialog.vue +92 -1
- package/packages/Subtable/src/SubImportDialog.vue +171 -8
- package/packages/TableSearchField/src/main.vue +5 -0
- package/packages/TemplatePreview/src/TemplatePreview.vue +43 -0
- package/src/directive/formulas.js +1 -1
- package/src/mixins/onlineSubtable.js +301 -0
- package/src/mixins/querySqlPreview.js +299 -21
- package/src/mixins/templatePreview.js +518 -42
- package/src/services/SubPagination.js +40 -1
- package/src/utils.js +32 -1
package/package.json
CHANGED
|
@@ -1137,8 +1137,11 @@
|
|
|
1137
1137
|
}
|
|
1138
1138
|
const pInst = utils.getOnlineFormInstance(this)
|
|
1139
1139
|
this.selectOrgs = this.convertComment2Field(str, field)
|
|
1140
|
-
|
|
1141
|
-
|
|
1140
|
+
this.custdialog.custDialog.mappingConf.forEach((con) => {
|
|
1141
|
+
let val = ''
|
|
1142
|
+
let bindValue = ''
|
|
1143
|
+
//改造,绑定值,表单列表查询字段绑定对话框时,新增的绑定字段选项
|
|
1144
|
+
const bindValueField = con.bindValue && con.bindValue.toLowerCase()
|
|
1142
1145
|
str.forEach((item, index) => {
|
|
1143
1146
|
// 此处添加url跳转参数保存逻辑
|
|
1144
1147
|
if (
|
|
@@ -1159,6 +1162,10 @@
|
|
|
1159
1162
|
},`
|
|
1160
1163
|
} else {
|
|
1161
1164
|
val += item[con.from] + ','
|
|
1165
|
+
//绑定字段处理
|
|
1166
|
+
if (bindValueField) {
|
|
1167
|
+
bindValue += item[bindValueField] + ','
|
|
1168
|
+
}
|
|
1162
1169
|
}
|
|
1163
1170
|
})
|
|
1164
1171
|
if (this.modelName == 'data.' + con['target'][0]) {
|
|
@@ -1169,12 +1176,29 @@
|
|
|
1169
1176
|
thisIndex
|
|
1170
1177
|
)
|
|
1171
1178
|
} else if (this.modelName == 'searchForm.' + con['target'][0]) {
|
|
1179
|
+
const bInst = pInst['searchForm'] ? pInst: pInst.data
|
|
1172
1180
|
utils.setValueByPath(
|
|
1173
|
-
|
|
1181
|
+
bInst,
|
|
1174
1182
|
'searchForm.' + con['target'][0],
|
|
1175
1183
|
val.substring(0, val.length - 1),
|
|
1176
1184
|
thisIndex
|
|
1177
1185
|
)
|
|
1186
|
+
//绑定字段值处理,bindValue: {target: {id: xxx}}, bindKey: {target: id }
|
|
1187
|
+
if (bindValue && bindValueField) {
|
|
1188
|
+
const bindValueObj = {}
|
|
1189
|
+
//显示value对象
|
|
1190
|
+
bindValueObj[bindValueField] = bindValue.substring(0, bindValue.length - 1)
|
|
1191
|
+
|
|
1192
|
+
const anInst = pInst['searchForm'] ? pInst['searchForm'] : pInst.data.searchForm
|
|
1193
|
+
//若bindKey不存在,则默认空对象,若存在,则取出bindKey
|
|
1194
|
+
anInst.bindKey = anInst.bindKey || {}
|
|
1195
|
+
//格式 {target: id }
|
|
1196
|
+
anInst.bindKey[con['target'][0]] = bindValueField
|
|
1197
|
+
//若bindValue不存在,则默认空对象,若存在,则取出bindValue
|
|
1198
|
+
anInst.bindValue = anInst.bindValue || {}
|
|
1199
|
+
//格式 {target: {id: xxx}}
|
|
1200
|
+
anInst.bindValue[con['target'][0]] = bindValueObj
|
|
1201
|
+
}
|
|
1178
1202
|
} else {
|
|
1179
1203
|
let configAttr = con['target'][0].split('.')
|
|
1180
1204
|
let path = con['target'][0]
|
|
@@ -1199,10 +1223,26 @@
|
|
|
1199
1223
|
}
|
|
1200
1224
|
utils.setValueByPath(
|
|
1201
1225
|
pInst,
|
|
1202
|
-
`${pInst.data ? 'data.' : 'model.'}${path}`,
|
|
1226
|
+
`${pInst.data ? 'data.' : 'model.'}${this.modelName.includes('searchForm') ? `searchForm.${path}` : path}`,
|
|
1203
1227
|
_val,
|
|
1204
1228
|
thisIndex
|
|
1205
1229
|
)
|
|
1230
|
+
//绑定字段值处理,bindValue: {target: {id: xxx}}, bindKey: {target: id }
|
|
1231
|
+
if (bindValue && bindValueField) {
|
|
1232
|
+
const bindValueObj = {}
|
|
1233
|
+
//显示value对象
|
|
1234
|
+
bindValueObj[bindValueField] = bindValue.substring(0, bindValue.length - 1)
|
|
1235
|
+
|
|
1236
|
+
const anInst = pInst['searchForm'] ? pInst['searchForm'] : pInst.data.searchForm
|
|
1237
|
+
//若bindKey不存在,则默认空对象,若存在,则取出bindKey
|
|
1238
|
+
anInst.bindKey = anInst.bindKey || {}
|
|
1239
|
+
//格式 {target: id }
|
|
1240
|
+
anInst.bindKey[con['target'][0]] = bindValueField
|
|
1241
|
+
//若bindValue不存在,则默认空对象,若存在,则取出bindValue
|
|
1242
|
+
anInst.bindValue = anInst.bindValue || {}
|
|
1243
|
+
//格式 {target: {id: xxx}}
|
|
1244
|
+
anInst.bindValue[con['target'][0]] = bindValueObj
|
|
1245
|
+
}
|
|
1206
1246
|
}
|
|
1207
1247
|
}
|
|
1208
1248
|
})
|
|
@@ -1856,8 +1896,11 @@
|
|
|
1856
1896
|
}
|
|
1857
1897
|
const pInst = utils.getOnlineFormInstance(this)
|
|
1858
1898
|
this.custdialog.custDialog.mappingConf.forEach((con) => {
|
|
1859
|
-
|
|
1860
|
-
|
|
1899
|
+
let val = ''
|
|
1900
|
+
let bindValue = ''
|
|
1901
|
+
const from = con.from.toLowerCase()
|
|
1902
|
+
//改造,绑定值,表单列表查询字段绑定对话框时,新增的绑定字段选项
|
|
1903
|
+
const bindValueField = con.bindValue && con.bindValue.toLowerCase()
|
|
1861
1904
|
str.forEach((item) => {
|
|
1862
1905
|
// 如果有绑定url跳转参数 需获取跳转参数的key
|
|
1863
1906
|
if (item) {
|
|
@@ -1885,6 +1928,10 @@
|
|
|
1885
1928
|
)}¯${jumpParamKey}:${decodeURIComponent(item[returnMapKey])},`
|
|
1886
1929
|
} else {
|
|
1887
1930
|
val += decodeURIComponent(item[from]) + ','
|
|
1931
|
+
//绑定字段处理
|
|
1932
|
+
if (bindValueField) {
|
|
1933
|
+
bindValue += decodeURIComponent(item[bindValueField]) + ','
|
|
1934
|
+
}
|
|
1888
1935
|
}
|
|
1889
1936
|
}
|
|
1890
1937
|
})
|
|
@@ -1900,13 +1947,28 @@
|
|
|
1900
1947
|
this.modelName &&
|
|
1901
1948
|
this.modelName.startsWith('searchForm.')
|
|
1902
1949
|
) {
|
|
1950
|
+
const currentValue = val.substring(0, val.length - 1)
|
|
1951
|
+
if (this.modelName && this.modelName.endsWith(con['target'][0])) {
|
|
1952
|
+
this.$emit('updateInput', currentValue);
|
|
1953
|
+
}
|
|
1903
1954
|
let prePath = pInst['searchForm'] ? '' : 'data.'
|
|
1904
|
-
utils.setValueByPath(
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1955
|
+
utils.setValueByPath(pInst, prePath + 'searchForm.' + con['target'][0], currentValue, thisIndex)
|
|
1956
|
+
//绑定字段值处理,bindValue: {target: {id: xxx}}, bindKey: {target: id }
|
|
1957
|
+
if (bindValue && bindValueField) {
|
|
1958
|
+
const bindValueObj = {}
|
|
1959
|
+
//显示value对象
|
|
1960
|
+
bindValueObj[bindValueField] = bindValue.substring(0, bindValue.length - 1)
|
|
1961
|
+
|
|
1962
|
+
const anInst = pInst['searchForm'] ? pInst['searchForm'] : pInst.data.searchForm
|
|
1963
|
+
//若bindKey不存在,则默认空对象,若存在,则取出bindKey
|
|
1964
|
+
anInst.bindKey = anInst.bindKey || {}
|
|
1965
|
+
//格式 {target: id }
|
|
1966
|
+
anInst.bindKey[con['target'][0]] = bindValueField
|
|
1967
|
+
//若bindValue不存在,则默认空对象,若存在,则取出bindValue
|
|
1968
|
+
anInst.bindValue = anInst.bindValue || {}
|
|
1969
|
+
//格式 {target: {id: xxx}}
|
|
1970
|
+
anInst.bindValue[con['target'][0]] = bindValueObj
|
|
1971
|
+
}
|
|
1910
1972
|
} else {
|
|
1911
1973
|
let configAttr = con['target'][0].split('.')
|
|
1912
1974
|
let path = con['target'][0]
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
</template>
|
|
34
34
|
<script>
|
|
35
35
|
import permission from '@/mixins/permission.js'
|
|
36
|
-
export default {
|
|
36
|
+
export default {
|
|
37
37
|
name: 'HtDataLists',
|
|
38
38
|
mixins: [permission],
|
|
39
39
|
props: {
|
|
@@ -56,7 +56,6 @@ export default {
|
|
|
56
56
|
watch: {
|
|
57
57
|
options: {
|
|
58
58
|
handler(val) {
|
|
59
|
-
debugger
|
|
60
59
|
if (val) {
|
|
61
60
|
this.tabPaneList = JSON.parse(val)
|
|
62
61
|
this.activeName = this.tabPaneList[0].dataTemplateKey
|
|
@@ -114,4 +113,4 @@ export default {
|
|
|
114
113
|
margin-top: 24px;
|
|
115
114
|
}
|
|
116
115
|
}
|
|
117
|
-
</style>
|
|
116
|
+
</style>
|
|
@@ -163,4 +163,46 @@ export default {
|
|
|
163
163
|
font-weight: bold;
|
|
164
164
|
color: #f56c6c;
|
|
165
165
|
}
|
|
166
|
-
|
|
166
|
+
::v-deep .page-btn-count {
|
|
167
|
+
margin: 0 24px;
|
|
168
|
+
float: left;
|
|
169
|
+
padding: 10px 0;
|
|
170
|
+
}
|
|
171
|
+
::v-deep .page-btn-total {
|
|
172
|
+
margin: 5px 0px;
|
|
173
|
+
float: left;
|
|
174
|
+
padding: 11px 0px;
|
|
175
|
+
color: #606266;
|
|
176
|
+
font-weight: normal;
|
|
177
|
+
font-size: 13px;
|
|
178
|
+
}
|
|
179
|
+
::v-deep .pagination {
|
|
180
|
+
display: flex;
|
|
181
|
+
justify-content: flex-end;
|
|
182
|
+
padding: 10px 0;
|
|
183
|
+
float: right;
|
|
184
|
+
.el-select {
|
|
185
|
+
width: 100px;
|
|
186
|
+
}
|
|
187
|
+
.page-btn {
|
|
188
|
+
margin: 0 24px;
|
|
189
|
+
}
|
|
190
|
+
.target-page {
|
|
191
|
+
display: flex;
|
|
192
|
+
align-items: center;
|
|
193
|
+
color: #606266;
|
|
194
|
+
font-weight: normal;
|
|
195
|
+
font-size: 13px;
|
|
196
|
+
.el-input {
|
|
197
|
+
width: 50px;
|
|
198
|
+
margin: 0 3px;
|
|
199
|
+
}
|
|
200
|
+
//::v-deep input::-webkit-outer-spin-button, ::v-deep input::-webkit-inner-spin-button {
|
|
201
|
+
// -webkit-appearance: none !important;
|
|
202
|
+
//}
|
|
203
|
+
//::v-deep input[type='number'] {
|
|
204
|
+
// -moz-appearnce: textfield !important
|
|
205
|
+
//}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
</style>
|
|
@@ -35,6 +35,16 @@
|
|
|
35
35
|
type: String,
|
|
36
36
|
default: '子表数据',
|
|
37
37
|
},
|
|
38
|
+
exportMaxRow: {
|
|
39
|
+
type: [String, Number],
|
|
40
|
+
},
|
|
41
|
+
exportField: {
|
|
42
|
+
// 禁止导出的字段集合
|
|
43
|
+
type: String,
|
|
44
|
+
},
|
|
45
|
+
exportFieldTransformData: {
|
|
46
|
+
type: String,
|
|
47
|
+
},
|
|
38
48
|
},
|
|
39
49
|
computed: {
|
|
40
50
|
columns: function() {
|
|
@@ -47,6 +57,46 @@
|
|
|
47
57
|
}
|
|
48
58
|
},
|
|
49
59
|
methods: {
|
|
60
|
+
async sqlChange(config, value = '') {
|
|
61
|
+
return new Promise((resolve) => {
|
|
62
|
+
let sqlStr = config.relevancyValue
|
|
63
|
+
? config.relevancyValue.replace(/{val}/g, value)
|
|
64
|
+
: ''
|
|
65
|
+
sqlStr = sqlStr ? sqlStr.replace(/\n/g, '') : ''
|
|
66
|
+
let params = {
|
|
67
|
+
dsName: config.dataSource,
|
|
68
|
+
sql: sqlStr,
|
|
69
|
+
}
|
|
70
|
+
this.$requestConfig.getValueBySql(params).then((res) => {
|
|
71
|
+
resolve(res)
|
|
72
|
+
})
|
|
73
|
+
})
|
|
74
|
+
},
|
|
75
|
+
transformFieldData(data) {
|
|
76
|
+
return new Promise(async (resolve) => {
|
|
77
|
+
let fieldTransformData = JSON.parse(
|
|
78
|
+
decode(this.exportFieldTransformData)
|
|
79
|
+
)
|
|
80
|
+
for (let i = 0; i < data.length; i++) {
|
|
81
|
+
for (let j = 0; j < fieldTransformData.length; j++) {
|
|
82
|
+
if (fieldTransformData[j].relevancyType == 'value') {
|
|
83
|
+
data[i][fieldTransformData[j].field] =
|
|
84
|
+
fieldTransformData[j].relevancyValue
|
|
85
|
+
} else {
|
|
86
|
+
// 动态时 请求接口修改数据
|
|
87
|
+
let result = await this.sqlChange(
|
|
88
|
+
fieldTransformData[j],
|
|
89
|
+
data[i][fieldTransformData[j].field]
|
|
90
|
+
)
|
|
91
|
+
if (result) {
|
|
92
|
+
data[i][fieldTransformData[j].field] = result
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
resolve(data)
|
|
98
|
+
})
|
|
99
|
+
},
|
|
50
100
|
// 配置的数据字典 导出时翻译为汉字
|
|
51
101
|
changeDictionary(data) {
|
|
52
102
|
return new Promise(async (resolve, reject) => {
|
|
@@ -76,10 +126,18 @@
|
|
|
76
126
|
},
|
|
77
127
|
changeRowKey(rows) {
|
|
78
128
|
var exportData = []
|
|
129
|
+
let exportFieldArr = null
|
|
130
|
+
if (this.exportField) {
|
|
131
|
+
exportFieldArr = this.exportField.split(',')
|
|
132
|
+
}
|
|
79
133
|
rows.forEach((row) => {
|
|
80
134
|
var exportRow = {}
|
|
81
135
|
this.columns.forEach((col) => {
|
|
82
|
-
if (
|
|
136
|
+
if (
|
|
137
|
+
col.ctrlType != 'suntable' &&
|
|
138
|
+
(!exportFieldArr ||
|
|
139
|
+
(exportFieldArr && !exportFieldArr.includes(col.name)))
|
|
140
|
+
) {
|
|
83
141
|
exportRow[col.desc] = row[col.name]
|
|
84
142
|
}
|
|
85
143
|
})
|
|
@@ -87,6 +145,25 @@
|
|
|
87
145
|
})
|
|
88
146
|
return exportData
|
|
89
147
|
},
|
|
148
|
+
getConfirmValue(rows, count) {
|
|
149
|
+
return new Promise((resolve) => {
|
|
150
|
+
this.$confirm(
|
|
151
|
+
`导出数据量超出导出限制【${count}】,将导出${count}条,是否继续?`,
|
|
152
|
+
'提示',
|
|
153
|
+
{
|
|
154
|
+
confirmButtonText: '确定',
|
|
155
|
+
cancelButtonText: '取消',
|
|
156
|
+
type: 'warning',
|
|
157
|
+
}
|
|
158
|
+
)
|
|
159
|
+
.then(() => {
|
|
160
|
+
resolve(rows.slice(0, count))
|
|
161
|
+
})
|
|
162
|
+
.catch(() => {
|
|
163
|
+
resolve(false)
|
|
164
|
+
})
|
|
165
|
+
})
|
|
166
|
+
},
|
|
90
167
|
handleCommand(type) {
|
|
91
168
|
const pInst = utils.getOnlineFormInstance(this)
|
|
92
169
|
SubPagination.exportData(
|
|
@@ -97,6 +174,20 @@
|
|
|
97
174
|
)
|
|
98
175
|
.then(async (data) => {
|
|
99
176
|
data = JSON.parse(JSON.stringify(data))
|
|
177
|
+
if (this.exportMaxRow && Number(this.exportMaxRow) < data.length) {
|
|
178
|
+
let result = await this.getConfirmValue(
|
|
179
|
+
data,
|
|
180
|
+
Number(this.exportMaxRow)
|
|
181
|
+
)
|
|
182
|
+
if (result === false) {
|
|
183
|
+
return
|
|
184
|
+
}
|
|
185
|
+
data = result
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (this.exportFieldTransformData) {
|
|
189
|
+
data = await this.transformFieldData(data)
|
|
190
|
+
}
|
|
100
191
|
// 导出时 字典转换
|
|
101
192
|
await this.changeDictionary(data)
|
|
102
193
|
let exportData = this.changeRowKey(data)
|
|
@@ -102,6 +102,45 @@
|
|
|
102
102
|
type: String,
|
|
103
103
|
required: true,
|
|
104
104
|
},
|
|
105
|
+
importMaxRow: {
|
|
106
|
+
type: [String, Number],
|
|
107
|
+
default: null,
|
|
108
|
+
},
|
|
109
|
+
templateType: {
|
|
110
|
+
// 导入模板类型 default 系统默认 custom 自定义
|
|
111
|
+
type: String,
|
|
112
|
+
default: 'default',
|
|
113
|
+
},
|
|
114
|
+
customTemplate: {
|
|
115
|
+
// 自定义的导入模板文件
|
|
116
|
+
type: String,
|
|
117
|
+
default: '',
|
|
118
|
+
},
|
|
119
|
+
importTransform: {
|
|
120
|
+
// 是否有转换字段
|
|
121
|
+
type: String,
|
|
122
|
+
default: '0',
|
|
123
|
+
},
|
|
124
|
+
importModes: {
|
|
125
|
+
// 导入模式选项显示
|
|
126
|
+
type: String,
|
|
127
|
+
default: 'append,override,merge',
|
|
128
|
+
},
|
|
129
|
+
fieldTransformData: {
|
|
130
|
+
// 转换字段配置
|
|
131
|
+
type: String,
|
|
132
|
+
default: '',
|
|
133
|
+
},
|
|
134
|
+
conditionRule: {
|
|
135
|
+
// 条件模式配置
|
|
136
|
+
type: String,
|
|
137
|
+
default: '',
|
|
138
|
+
},
|
|
139
|
+
conditionType: {
|
|
140
|
+
// 条件模式配置
|
|
141
|
+
type: String,
|
|
142
|
+
default: 'cover',
|
|
143
|
+
},
|
|
105
144
|
},
|
|
106
145
|
data() {
|
|
107
146
|
return {
|
|
@@ -110,11 +149,6 @@
|
|
|
110
149
|
showRowData: false,
|
|
111
150
|
mergeFunc: null,
|
|
112
151
|
mode: 'append',
|
|
113
|
-
modeOptions: [
|
|
114
|
-
{ mode: 'append', desc: '追加导入' },
|
|
115
|
-
{ mode: 'override', desc: '覆盖导入' },
|
|
116
|
-
{ mode: 'merge', desc: '合并导入', disabled: true },
|
|
117
|
-
],
|
|
118
152
|
cacheDicData: {}, // 缓存字典数据
|
|
119
153
|
}
|
|
120
154
|
},
|
|
@@ -122,6 +156,30 @@
|
|
|
122
156
|
columns: function() {
|
|
123
157
|
return eval(decode(this.dataColumns))
|
|
124
158
|
},
|
|
159
|
+
modeOptions() {
|
|
160
|
+
let options = [
|
|
161
|
+
{ mode: 'append', desc: '追加导入' },
|
|
162
|
+
{ mode: 'override', desc: '覆盖导入' },
|
|
163
|
+
{ mode: 'merge', desc: '合并导入' },
|
|
164
|
+
{ mode: 'condition', desc: '条件导入' },
|
|
165
|
+
]
|
|
166
|
+
return options.filter((k) => {
|
|
167
|
+
return this.importModes.includes(k.mode)
|
|
168
|
+
})
|
|
169
|
+
},
|
|
170
|
+
conditionConfig() {
|
|
171
|
+
let config = {}
|
|
172
|
+
if (this.conditionRule) {
|
|
173
|
+
config = JSON.parse(decode(this.conditionRule))
|
|
174
|
+
config.conditionArr.forEach((k) => {
|
|
175
|
+
k.exportField = this.getNameByDesc(k.exportField)
|
|
176
|
+
})
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
conditionType: this.conditionType,
|
|
180
|
+
...config,
|
|
181
|
+
}
|
|
182
|
+
},
|
|
125
183
|
},
|
|
126
184
|
watch: {
|
|
127
185
|
dialogVisible: {
|
|
@@ -139,7 +197,7 @@
|
|
|
139
197
|
handler: function(newVal) {
|
|
140
198
|
if (newVal) {
|
|
141
199
|
// 如果有导入合并的代码,则允许选择合并导入模式
|
|
142
|
-
this.$set(this.modeOptions[2], 'disabled', false)
|
|
200
|
+
// this.$set(this.modeOptions[2], 'disabled', false)
|
|
143
201
|
// 并设置默认为 合并导入
|
|
144
202
|
this.mode = 'merge'
|
|
145
203
|
// 解码合并的代码
|
|
@@ -156,6 +214,9 @@
|
|
|
156
214
|
}
|
|
157
215
|
},
|
|
158
216
|
mounted() {
|
|
217
|
+
if (this.importModes) {
|
|
218
|
+
this.mode = this.importModes.split(',')[0]
|
|
219
|
+
}
|
|
159
220
|
// 初始化导入时需要的参数
|
|
160
221
|
const pInst = utils.getOnlineFormInstance(this)
|
|
161
222
|
let formUid = pInst && pInst._uid ? pInst._uid : ''
|
|
@@ -174,6 +235,48 @@
|
|
|
174
235
|
SubPagination.clear(this.dataSubname, this)
|
|
175
236
|
},
|
|
176
237
|
methods: {
|
|
238
|
+
transformFieldData(data) {
|
|
239
|
+
return new Promise(async (resolve) => {
|
|
240
|
+
if (this.importTransform === '0') {
|
|
241
|
+
resolve(data)
|
|
242
|
+
return
|
|
243
|
+
}
|
|
244
|
+
let fieldTransformData = JSON.parse(decode(this.fieldTransformData))
|
|
245
|
+
for (let i = 0; i < data.length; i++) {
|
|
246
|
+
for (let j = 0; j < fieldTransformData.length; j++) {
|
|
247
|
+
if (fieldTransformData[j].relevancyType == 'value') {
|
|
248
|
+
data[i][fieldTransformData[j].field] =
|
|
249
|
+
fieldTransformData[j].relevancyValue
|
|
250
|
+
} else {
|
|
251
|
+
// 动态时 请求接口修改数据
|
|
252
|
+
let result = await this.sqlChange(
|
|
253
|
+
fieldTransformData[j],
|
|
254
|
+
data[i][fieldTransformData[j].field]
|
|
255
|
+
)
|
|
256
|
+
if (result) {
|
|
257
|
+
data[i][fieldTransformData[j].field] = result
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
resolve(data)
|
|
263
|
+
})
|
|
264
|
+
},
|
|
265
|
+
async sqlChange(config, value = '') {
|
|
266
|
+
return new Promise((resolve) => {
|
|
267
|
+
let sqlStr = config.relevancyValue
|
|
268
|
+
? config.relevancyValue.replace(/{val}/g, value)
|
|
269
|
+
: ''
|
|
270
|
+
sqlStr = sqlStr ? sqlStr.replace(/\n/g, '') : ''
|
|
271
|
+
let params = {
|
|
272
|
+
dsName: config.dataSource,
|
|
273
|
+
sql: sqlStr,
|
|
274
|
+
}
|
|
275
|
+
this.$requestConfig.getValueBySql(params).then((res) => {
|
|
276
|
+
resolve(res)
|
|
277
|
+
})
|
|
278
|
+
})
|
|
279
|
+
},
|
|
177
280
|
changeDictionary(data) {
|
|
178
281
|
return new Promise(async (resolve) => {
|
|
179
282
|
for (let i = 0; i < data.length; i++) {
|
|
@@ -214,6 +317,28 @@
|
|
|
214
317
|
},
|
|
215
318
|
//子表模板导出
|
|
216
319
|
exportFormSub() {
|
|
320
|
+
// 如果是自定义模板
|
|
321
|
+
if (this.templateType == 'custom' && this.customTemplate) {
|
|
322
|
+
let file = JSON.parse(decode(this.customTemplate))[0]
|
|
323
|
+
this.$requestConfig
|
|
324
|
+
.download(file.response.fileId)
|
|
325
|
+
.then(({ data, headers }) => {
|
|
326
|
+
if (data && headers) {
|
|
327
|
+
// 附件下载
|
|
328
|
+
const fileName = decodeURIComponent(
|
|
329
|
+
headers['content-disposition']
|
|
330
|
+
.split(';')[1]
|
|
331
|
+
.split('filename=')[1]
|
|
332
|
+
)
|
|
333
|
+
const blob = new Blob([data])
|
|
334
|
+
saveAs(blob, fileName)
|
|
335
|
+
}
|
|
336
|
+
})
|
|
337
|
+
.catch((err) => {
|
|
338
|
+
this.$message.error(`附件下载失败:${err}`)
|
|
339
|
+
})
|
|
340
|
+
return
|
|
341
|
+
}
|
|
217
342
|
let columns = this.columns.filter((item) => {
|
|
218
343
|
return !(
|
|
219
344
|
item.ctrlType &&
|
|
@@ -263,6 +388,7 @@
|
|
|
263
388
|
let count = this.importRows.length
|
|
264
389
|
if (count > maxRowInt && maxRowInt != 0) {
|
|
265
390
|
this.$message.error('子表数据已超过最大行数【' + maxRowInt + '】')
|
|
391
|
+
this.$refs.selectFile.value = ''
|
|
266
392
|
return
|
|
267
393
|
}
|
|
268
394
|
} else if (this.mode == 'append') {
|
|
@@ -290,13 +416,16 @@
|
|
|
290
416
|
}
|
|
291
417
|
}
|
|
292
418
|
}
|
|
293
|
-
let importRows = await this.changeDictionary(this.importRows)
|
|
294
419
|
const pInst = utils.getOnlineFormInstance(this.$parent.$parent)
|
|
420
|
+
let importRows = await this.changeDictionary(this.importRows)
|
|
421
|
+
// 导入如果有数据转换的此处做转换
|
|
422
|
+
importRows = await this.transformFieldData(importRows)
|
|
295
423
|
SubPagination.importData(
|
|
296
424
|
this.dataSubname,
|
|
297
425
|
importRows,
|
|
298
426
|
this.mode,
|
|
299
427
|
this.mergeFunc,
|
|
428
|
+
this.conditionConfig,
|
|
300
429
|
pInst
|
|
301
430
|
)
|
|
302
431
|
.then(() => {
|
|
@@ -304,6 +433,7 @@
|
|
|
304
433
|
this.dialogVisible = false
|
|
305
434
|
})
|
|
306
435
|
.catch((err) => {
|
|
436
|
+
this.$refs.selectFile.value = ''
|
|
307
437
|
this.$message.error(`数据导入失败:${err}`)
|
|
308
438
|
})
|
|
309
439
|
},
|
|
@@ -312,10 +442,43 @@
|
|
|
312
442
|
return
|
|
313
443
|
}
|
|
314
444
|
this.importRows = []
|
|
315
|
-
this.readWorkbookFromLocalFile(m.target.files[0], (rows) => {
|
|
445
|
+
this.readWorkbookFromLocalFile(m.target.files[0], async (rows) => {
|
|
446
|
+
if (this.importMaxRow) {
|
|
447
|
+
let count = rows.length
|
|
448
|
+
if (count > parseInt(this.importMaxRow)) {
|
|
449
|
+
let result = await this.getConfirmValue(
|
|
450
|
+
rows,
|
|
451
|
+
parseInt(this.importMaxRow)
|
|
452
|
+
)
|
|
453
|
+
if (result === false) {
|
|
454
|
+
this.$refs.selectFile.value = ''
|
|
455
|
+
return
|
|
456
|
+
}
|
|
457
|
+
rows = result
|
|
458
|
+
}
|
|
459
|
+
}
|
|
316
460
|
this.importRows = this.changeRowKey(rows)
|
|
317
461
|
})
|
|
318
462
|
},
|
|
463
|
+
getConfirmValue(rows, count) {
|
|
464
|
+
return new Promise((resolve) => {
|
|
465
|
+
this.$confirm(
|
|
466
|
+
`导入数据量已超过最大限制,将默认导入前【${count}】条,是否继续?`,
|
|
467
|
+
'提示',
|
|
468
|
+
{
|
|
469
|
+
confirmButtonText: '确定',
|
|
470
|
+
cancelButtonText: '取消',
|
|
471
|
+
type: 'warning',
|
|
472
|
+
}
|
|
473
|
+
)
|
|
474
|
+
.then(() => {
|
|
475
|
+
resolve(rows.slice(0, count))
|
|
476
|
+
})
|
|
477
|
+
.catch(() => {
|
|
478
|
+
resolve(false)
|
|
479
|
+
})
|
|
480
|
+
})
|
|
481
|
+
},
|
|
319
482
|
// 读取本地excel文件
|
|
320
483
|
readWorkbookFromLocalFile(file, callback) {
|
|
321
484
|
const reader = new FileReader()
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
:class="{ 'is-align-right': isAlignRight }"
|
|
16
16
|
>
|
|
17
17
|
<label v-if="label" v-ellipsis :title="label" class="search-field-label">
|
|
18
|
+
<span v-if="isRequired" class="red-color">*</span>
|
|
18
19
|
{{ label }}
|
|
19
20
|
</label>
|
|
20
21
|
</div>
|
|
@@ -167,6 +168,7 @@
|
|
|
167
168
|
type: Boolean,
|
|
168
169
|
default: false,
|
|
169
170
|
},
|
|
171
|
+
isRequired: Boolean,
|
|
170
172
|
},
|
|
171
173
|
data() {
|
|
172
174
|
return {
|
|
@@ -317,6 +319,9 @@
|
|
|
317
319
|
display: inline-block;
|
|
318
320
|
max-width: calc(100% - 10px);
|
|
319
321
|
line-height: 100%;
|
|
322
|
+
.red-color {
|
|
323
|
+
color: #f56c6c;
|
|
324
|
+
}
|
|
320
325
|
|
|
321
326
|
&::after {
|
|
322
327
|
content: ':';
|
|
@@ -223,6 +223,49 @@
|
|
|
223
223
|
margin: 0;
|
|
224
224
|
padding: 0;
|
|
225
225
|
}
|
|
226
|
+
::v-deep .page-btn-count {
|
|
227
|
+
margin: 0 24px;
|
|
228
|
+
float: left;
|
|
229
|
+
padding: 10px 0;
|
|
230
|
+
}
|
|
231
|
+
::v-deep .page-btn-total {
|
|
232
|
+
margin: 5px 0px;
|
|
233
|
+
float: left;
|
|
234
|
+
padding: 11px 0px;
|
|
235
|
+
color: #606266;
|
|
236
|
+
font-weight: normal;
|
|
237
|
+
font-size: 13px;
|
|
238
|
+
}
|
|
239
|
+
::v-deep .pagination {
|
|
240
|
+
display: flex;
|
|
241
|
+
justify-content: flex-end;
|
|
242
|
+
padding: 10px 0;
|
|
243
|
+
float: right;
|
|
244
|
+
.el-select {
|
|
245
|
+
width: 100px;
|
|
246
|
+
}
|
|
247
|
+
.page-btn {
|
|
248
|
+
margin: 0 24px;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.target-page {
|
|
252
|
+
display: flex;
|
|
253
|
+
align-items: center;
|
|
254
|
+
color: #606266;
|
|
255
|
+
font-weight: normal;
|
|
256
|
+
font-size: 13px;
|
|
257
|
+
.el-input {
|
|
258
|
+
width: 50px;
|
|
259
|
+
margin: 0 3px;
|
|
260
|
+
}
|
|
261
|
+
//::v-deep input::-webkit-outer-spin-button, ::v-deep input::-webkit-inner-spin-button {
|
|
262
|
+
// -webkit-appearance: none !important;
|
|
263
|
+
//}
|
|
264
|
+
//::v-deep input[type='number'] {
|
|
265
|
+
// -moz-appearnce: textfield !important
|
|
266
|
+
//}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
226
269
|
</style>
|
|
227
270
|
<style lang="scss">
|
|
228
271
|
.template-dropdown {
|