n20-common-lib 3.2.46 → 3.2.47

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n20-common-lib",
3
- "version": "3.2.46",
3
+ "version": "3.2.47",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "vue-cli-service serve",
@@ -1,263 +1,263 @@
1
- <template>
2
- <cl-page class="CustomFormView">
3
- <slot name="top"></slot>
4
- <cl-expandable-pane v-for="(item, index) in formOptions" :key="index" :title="item.tabName">
5
- <template v-if="item.slotName">
6
- <slot :name="item.slotName"></slot>
7
- </template>
8
- <cl-descriptions>
9
- <template v-for="(formItem, key) in item.list">
10
- <!-- 字段标识:数组模式用 formItem.key,对象模式用 v-for 的 key -->
11
- <el-descriptions-item v-if="formItem.type" :key="formItem.key || key" :label="$l(formItem.label)">
12
- <template slot="label">
13
- {{ formItem.label }}
14
- </template>
15
- <!-- 插槽 -->
16
- <template v-if="formItem.type === 'slot'">
17
- <div>
18
- <slot :name="formItem.key || key"></slot>
19
- </div>
20
- </template>
21
- <!-- 期限 -->
22
- <template v-else-if="(formItem.key || key) === 'contractDTO_loanTerm' && formItem.type === 'input'">
23
- <cl-diff
24
- v-if="diff"
25
- :value="`${formValue['contractDTO_loanTerm']} ${
26
- formValue['contractDTO_termUnit'] === 'DAY'
27
- ? $lc('天')
28
- : formValue['contractDTO_termUnit'] === 'MONTH'
29
- ? $lc('月')
30
- : formValue['contractDTO_termUnit'] === 'YEAR'
31
- ? $lc('年')
32
- : ''
33
- }`"
34
- :old-value="`${oldFormValue['contractDTO_loanTerm']} ${
35
- oldFormValue['contractDTO_termUnit'] === 'DAY'
36
- ? $lc('天')
37
- : oldFormValue['contractDTO_termUnit'] === 'MONTH'
38
- ? $lc('月')
39
- : oldFormValue['contractDTO_termUnit'] === 'YEAR'
40
- ? $lc('年')
41
- : ''
42
- }`"
43
- :tooltip="true"
44
- />
45
- <div v-else>
46
- {{ formValue['contractDTO_loanTerm'] }}
47
- {{
48
- formValue['contractDTO_termUnit'] === 'DAY'
49
- ? $lc('天')
50
- : formValue['contractDTO_termUnit'] === 'MONTH'
51
- ? $lc('月')
52
- : formValue['contractDTO_termUnit'] === 'YEAR'
53
- ? $lc('年')
54
- : ''
55
- }}
56
- </div>
57
- </template>
58
- <!-- 结构化/费用编号 -->
59
- <template
60
- v-else-if="
61
- $lc(formItem.label) === $lc('是否结构化') ||
62
- ((formItem.key || key) === 'exInfoDTO_feeNo' && (formItem.key || key) !== 'mainFeeCurrencyCode')
63
- "
64
- >
65
- <cl-diff
66
- v-if="diff"
67
- :value="(formValue[formItem.key || key] && formValue[formItem.key || key].name) || '--'"
68
- :old-value="(oldFormValue[formItem.key || key] && oldFormValue[formItem.key || key].name) || '--'"
69
- :tooltip="true"
70
- />
71
- <div v-else>{{ (formValue[formItem.key || key] && formValue[formItem.key || key].name) || '--' }}</div>
72
- </template>
73
- <!-- 地区信息 -->
74
- <template v-else-if="(formItem.key || key) === 'recInfoDTO_areaInfo'">
75
- <cl-diff
76
- v-if="diff"
77
- :value="formValue['recInfoDTO_areaInfoName'] || '--'"
78
- :old-value="oldFormValue['recInfoDTO_areaInfoName'] || '--'"
79
- :tooltip="true"
80
- />
81
- <div v-else>{{ formValue['recInfoDTO_areaInfoName'] || '--' }}</div>
82
- </template>
83
- <!-- 借/贷方 -->
84
- <template
85
- v-else-if="
86
- (formItem.key || key) === 'contractDTO_debtorCode' ||
87
- (formItem.key || key) === 'contractDTO_creditorCode'
88
- "
89
- >
90
- <cl-diff
91
- v-if="diff"
92
- :value="(formValue[formItem.key || key] && formValue[formItem.key || key].name) || '--'"
93
- :old-value="(oldFormValue[formItem.key || key] && oldFormValue[formItem.key || key].name) || '--'"
94
- :tooltip="true"
95
- />
96
- <div v-else>{{ (formValue[formItem.key || key] && formValue[formItem.key || key].name) || '--' }}</div>
97
- </template>
98
- <!-- 金额 -->
99
- <template v-else-if="formItem.type === 'input-number'">
100
- <div
101
- v-if="
102
- [$lc('利率'), $lc('合同利率'), $lc('利率(%)'), $lc('合同利率(%)'), $lc('中间价')].includes(
103
- $l(formItem.label)
104
- )
105
- "
106
- >
107
- <cl-diff
108
- v-if="diff"
109
- :value="
110
- (formValue[formItem.key || key] && numerify(formValue[formItem.key || key], '0.000000')) || '--'
111
- "
112
- :old-value="
113
- (oldFormValue[formItem.key || key] && numerify(oldFormValue[formItem.key || key], '0.000000')) ||
114
- '--'
115
- "
116
- :tooltip="true"
117
- />
118
- <span v-else>{{
119
- formValue[formItem.key || key] ? numerify(formValue[formItem.key || key], '0.000000') : '--'
120
- }}</span>
121
- </div>
122
- <div v-else>
123
- <cl-diff
124
- v-if="diff"
125
- :value="
126
- (formValue[formItem.key || key] && numerify(formValue[formItem.key || key], '0,0.00')) || '--'
127
- "
128
- :old-value="
129
- (oldFormValue[formItem.key || key] && numerify(oldFormValue[formItem.key || key], '0,0.00')) || '--'
130
- "
131
- :tooltip="true"
132
- />
133
- <span v-else>{{
134
- formValue[formItem.key || key] ? numerify(formValue[formItem.key || key], '0,0.00') : '--'
135
- }}</span>
136
- </div>
137
- </template>
138
- <!-- 来款国家(地区) -->
139
- <template v-else-if="$lc(formItem.label) === $lc('来款国家(地区)')">
140
- <cl-diff
141
- v-if="diff"
142
- :value="formValue['applyInfoDTO_areaInfoName'] || '--'"
143
- :old-value="oldFormValue['applyInfoDTO_areaInfoName'] || '--'"
144
- :tooltip="true"
145
- />
146
- <div v-else>{{ formValue['applyInfoDTO_areaInfoName'] || '--' }}</div>
147
- </template>
148
- <!-- 下拉枚举 -->
149
- <template v-else-if="formItem.type === 'select'">
150
- <div class="flex-box flex-v">
151
- <div v-if="formValue[formItem.key || key] && formValue[formItem.key || key].name">
152
- <cl-diff
153
- v-if="diff"
154
- :value="(formValue[formItem.key || key] && formValue[formItem.key || key].name) || '--'"
155
- :old-value="(oldFormValue[formItem.key || key] && oldFormValue[formItem.key || key].name) || '--'"
156
- :tooltip="true"
157
- />
158
- <span v-else>{{
159
- (formValue[formItem.key || key] && formValue[formItem.key || key].name) || '--'
160
- }}</span>
161
- </div>
162
- <div v-else-if="formItem.label === $lc('结售汇性质')">
163
- <cl-diff
164
- v-if="diff"
165
- :value="formValue[formItem.key || key] || '--'"
166
- :old-value="oldFormValue[formItem.key || key] || '--'"
167
- :tooltip="true"
168
- />
169
- <span v-else>{{ formValue[formItem.key || key] || '--' }}</span>
170
- </div>
171
- <div v-else>
172
- <template v-if="diff">
173
- <cl-diff
174
- :value="getEnumName(formItem.enumList, formValue[formItem.key || key])"
175
- :old-value="getEnumName(formItem.enumList, oldFormValue[formItem.key || key])"
176
- :tooltip="true"
177
- />
178
- </template>
179
- <span v-else>{{ getEnumName(formItem.enumList, formValue[formItem.key || key]) }}</span>
180
- </div>
181
- </div>
182
- </template>
183
- <!-- 其他类型(含 text 类型,自动支持超长文本 Tooltip) -->
184
- <template v-else>
185
- <div>
186
- <cl-diff
187
- v-if="diff"
188
- :value="formValue[formItem.key || key] || '--'"
189
- :old-value="oldFormValue[formItem.key || key] || '--'"
190
- :tooltip="true"
191
- />
192
- <div v-else>
193
- <el-tooltip
194
- v-if="formValue[formItem.key || key] && formValue[formItem.key || key].length > 50"
195
- class="item"
196
- effect="dark"
197
- :content="formValue[formItem.key || key]"
198
- placement="top"
199
- >
200
- <span>{{ formValue[formItem.key || key].slice(0, 50) + '...' }}</span>
201
- </el-tooltip>
202
- <span v-else>{{ formValue[formItem.key || key] || '--' }}</span>
203
- </div>
204
- </div>
205
- </template>
206
- </el-descriptions-item>
207
- </template>
208
- </cl-descriptions>
209
- </cl-expandable-pane>
210
- <slot name="bottom"></slot>
211
- </cl-page>
212
- </template>
213
-
214
- <script>
215
- import numerify from 'numerify'
216
-
217
- import ClDescriptions from '../Descriptions/index.vue'
218
- import ClDiff from '../Diff/index.vue'
219
- import ClExpandablePane from '../Expandable/index.vue'
220
- import ClPage from '../PageLayout/page.vue'
221
-
222
- export default {
223
- name: 'DynamicFormView',
224
- components: { ClPage, ClExpandablePane, ClDescriptions, ClDiff },
225
- props: {
226
- // 表单配置
227
- formOptions: {
228
- type: Array,
229
- default: () => {
230
- return []
231
- }
232
- },
233
- formValue: {
234
- type: Object,
235
- default: () => {
236
- return {}
237
- }
238
- },
239
- diff: {
240
- type: Boolean,
241
- default: false
242
- },
243
- oldFormValue: {
244
- type: Object,
245
- default: () => {
246
- return {}
247
- }
248
- }
249
- },
250
- data() {
251
- return {
252
- numerify
253
- }
254
- },
255
- methods: {
256
- getEnumName(enumList, code) {
257
- if (!enumList?.length) return
258
- const enumData = Array.isArray(enumList) ? enumList : JSON.parse(enumList)
259
- return enumData?.find((item) => (item.code || item.value) === code)?.name || '--'
260
- }
261
- }
262
- }
263
- </script>
1
+ <template>
2
+ <cl-page class="CustomFormView">
3
+ <slot name="top"></slot>
4
+ <cl-expandable-pane v-for="(item, index) in formOptions" :key="index" :title="item.tabName">
5
+ <template v-if="item.slotName">
6
+ <slot :name="item.slotName"></slot>
7
+ </template>
8
+ <cl-descriptions>
9
+ <template v-for="(formItem, key) in item.list">
10
+ <!-- 字段标识:数组模式用 formItem.key,对象模式用 v-for 的 key -->
11
+ <el-descriptions-item v-if="formItem.type" :key="formItem.key || key" :label="$l(formItem.label)">
12
+ <template slot="label">
13
+ {{ formItem.label }}
14
+ </template>
15
+ <!-- 插槽 -->
16
+ <template v-if="formItem.type === 'slot'">
17
+ <div>
18
+ <slot :name="formItem.key || key"></slot>
19
+ </div>
20
+ </template>
21
+ <!-- 期限 -->
22
+ <template v-else-if="(formItem.key || key) === 'contractDTO_loanTerm' && formItem.type === 'input'">
23
+ <cl-diff
24
+ v-if="diff"
25
+ :value="`${formValue['contractDTO_loanTerm']} ${
26
+ formValue['contractDTO_termUnit'] === 'DAY'
27
+ ? $lc('天')
28
+ : formValue['contractDTO_termUnit'] === 'MONTH'
29
+ ? $lc('月')
30
+ : formValue['contractDTO_termUnit'] === 'YEAR'
31
+ ? $lc('年')
32
+ : ''
33
+ }`"
34
+ :old-value="`${oldFormValue['contractDTO_loanTerm']} ${
35
+ oldFormValue['contractDTO_termUnit'] === 'DAY'
36
+ ? $lc('天')
37
+ : oldFormValue['contractDTO_termUnit'] === 'MONTH'
38
+ ? $lc('月')
39
+ : oldFormValue['contractDTO_termUnit'] === 'YEAR'
40
+ ? $lc('年')
41
+ : ''
42
+ }`"
43
+ :tooltip="true"
44
+ />
45
+ <div v-else>
46
+ {{ formValue['contractDTO_loanTerm'] }}
47
+ {{
48
+ formValue['contractDTO_termUnit'] === 'DAY'
49
+ ? $lc('天')
50
+ : formValue['contractDTO_termUnit'] === 'MONTH'
51
+ ? $lc('月')
52
+ : formValue['contractDTO_termUnit'] === 'YEAR'
53
+ ? $lc('年')
54
+ : ''
55
+ }}
56
+ </div>
57
+ </template>
58
+ <!-- 结构化/费用编号 -->
59
+ <template
60
+ v-else-if="
61
+ $lc(formItem.label) === $lc('是否结构化') ||
62
+ ((formItem.key || key) === 'exInfoDTO_feeNo' && (formItem.key || key) !== 'mainFeeCurrencyCode')
63
+ "
64
+ >
65
+ <cl-diff
66
+ v-if="diff"
67
+ :value="(formValue[formItem.key || key] && formValue[formItem.key || key].name) || '--'"
68
+ :old-value="(oldFormValue[formItem.key || key] && oldFormValue[formItem.key || key].name) || '--'"
69
+ :tooltip="true"
70
+ />
71
+ <div v-else>{{ (formValue[formItem.key || key] && formValue[formItem.key || key].name) || '--' }}</div>
72
+ </template>
73
+ <!-- 地区信息 -->
74
+ <template v-else-if="(formItem.key || key) === 'recInfoDTO_areaInfo'">
75
+ <cl-diff
76
+ v-if="diff"
77
+ :value="formValue['recInfoDTO_areaInfoName'] || '--'"
78
+ :old-value="oldFormValue['recInfoDTO_areaInfoName'] || '--'"
79
+ :tooltip="true"
80
+ />
81
+ <div v-else>{{ formValue['recInfoDTO_areaInfoName'] || '--' }}</div>
82
+ </template>
83
+ <!-- 借/贷方 -->
84
+ <template
85
+ v-else-if="
86
+ (formItem.key || key) === 'contractDTO_debtorCode' ||
87
+ (formItem.key || key) === 'contractDTO_creditorCode'
88
+ "
89
+ >
90
+ <cl-diff
91
+ v-if="diff"
92
+ :value="(formValue[formItem.key || key] && formValue[formItem.key || key].name) || '--'"
93
+ :old-value="(oldFormValue[formItem.key || key] && oldFormValue[formItem.key || key].name) || '--'"
94
+ :tooltip="true"
95
+ />
96
+ <div v-else>{{ (formValue[formItem.key || key] && formValue[formItem.key || key].name) || '--' }}</div>
97
+ </template>
98
+ <!-- 金额 -->
99
+ <template v-else-if="formItem.type === 'input-number'">
100
+ <div
101
+ v-if="
102
+ [$lc('利率'), $lc('合同利率'), $lc('利率(%)'), $lc('合同利率(%)'), $lc('中间价')].includes(
103
+ $l(formItem.label)
104
+ )
105
+ "
106
+ >
107
+ <cl-diff
108
+ v-if="diff"
109
+ :value="
110
+ (formValue[formItem.key || key] && numerify(formValue[formItem.key || key], '0.000000')) || '--'
111
+ "
112
+ :old-value="
113
+ (oldFormValue[formItem.key || key] && numerify(oldFormValue[formItem.key || key], '0.000000')) ||
114
+ '--'
115
+ "
116
+ :tooltip="true"
117
+ />
118
+ <span v-else>{{
119
+ formValue[formItem.key || key] ? numerify(formValue[formItem.key || key], '0.000000') : '--'
120
+ }}</span>
121
+ </div>
122
+ <div v-else>
123
+ <cl-diff
124
+ v-if="diff"
125
+ :value="
126
+ (formValue[formItem.key || key] && numerify(formValue[formItem.key || key], '0,0.00')) || '--'
127
+ "
128
+ :old-value="
129
+ (oldFormValue[formItem.key || key] && numerify(oldFormValue[formItem.key || key], '0,0.00')) || '--'
130
+ "
131
+ :tooltip="true"
132
+ />
133
+ <span v-else>{{
134
+ formValue[formItem.key || key] ? numerify(formValue[formItem.key || key], '0,0.00') : '--'
135
+ }}</span>
136
+ </div>
137
+ </template>
138
+ <!-- 来款国家(地区) -->
139
+ <template v-else-if="$lc(formItem.label) === $lc('来款国家(地区)')">
140
+ <cl-diff
141
+ v-if="diff"
142
+ :value="formValue['applyInfoDTO_areaInfoName'] || '--'"
143
+ :old-value="oldFormValue['applyInfoDTO_areaInfoName'] || '--'"
144
+ :tooltip="true"
145
+ />
146
+ <div v-else>{{ formValue['applyInfoDTO_areaInfoName'] || '--' }}</div>
147
+ </template>
148
+ <!-- 下拉枚举 -->
149
+ <template v-else-if="formItem.type === 'select'">
150
+ <div class="flex-box flex-v">
151
+ <div v-if="formValue[formItem.key || key] && formValue[formItem.key || key].name">
152
+ <cl-diff
153
+ v-if="diff"
154
+ :value="(formValue[formItem.key || key] && formValue[formItem.key || key].name) || '--'"
155
+ :old-value="(oldFormValue[formItem.key || key] && oldFormValue[formItem.key || key].name) || '--'"
156
+ :tooltip="true"
157
+ />
158
+ <span v-else>{{
159
+ (formValue[formItem.key || key] && formValue[formItem.key || key].name) || '--'
160
+ }}</span>
161
+ </div>
162
+ <div v-else-if="formItem.label === $lc('结售汇性质')">
163
+ <cl-diff
164
+ v-if="diff"
165
+ :value="formValue[formItem.key || key] || '--'"
166
+ :old-value="oldFormValue[formItem.key || key] || '--'"
167
+ :tooltip="true"
168
+ />
169
+ <span v-else>{{ formValue[formItem.key || key] || '--' }}</span>
170
+ </div>
171
+ <div v-else>
172
+ <template v-if="diff">
173
+ <cl-diff
174
+ :value="getEnumName(formItem.enumList, formValue[formItem.key || key])"
175
+ :old-value="getEnumName(formItem.enumList, oldFormValue[formItem.key || key])"
176
+ :tooltip="true"
177
+ />
178
+ </template>
179
+ <span v-else>{{ getEnumName(formItem.enumList, formValue[formItem.key || key]) }}</span>
180
+ </div>
181
+ </div>
182
+ </template>
183
+ <!-- 其他类型(含 text 类型,自动支持超长文本 Tooltip) -->
184
+ <template v-else>
185
+ <div>
186
+ <cl-diff
187
+ v-if="diff"
188
+ :value="formValue[formItem.key || key] || '--'"
189
+ :old-value="oldFormValue[formItem.key || key] || '--'"
190
+ :tooltip="true"
191
+ />
192
+ <div v-else>
193
+ <el-tooltip
194
+ v-if="formValue[formItem.key || key] && formValue[formItem.key || key].length > 50"
195
+ class="item"
196
+ effect="dark"
197
+ :content="formValue[formItem.key || key]"
198
+ placement="top"
199
+ >
200
+ <span>{{ formValue[formItem.key || key].slice(0, 50) + '...' }}</span>
201
+ </el-tooltip>
202
+ <span v-else>{{ formValue[formItem.key || key] || '--' }}</span>
203
+ </div>
204
+ </div>
205
+ </template>
206
+ </el-descriptions-item>
207
+ </template>
208
+ </cl-descriptions>
209
+ </cl-expandable-pane>
210
+ <slot name="bottom"></slot>
211
+ </cl-page>
212
+ </template>
213
+
214
+ <script>
215
+ import numerify from 'numerify'
216
+
217
+ import ClDescriptions from '../Descriptions/index.vue'
218
+ import ClDiff from '../Diff/index.vue'
219
+ import ClExpandablePane from '../Expandable/index.vue'
220
+ import ClPage from '../PageLayout/page.vue'
221
+
222
+ export default {
223
+ name: 'DynamicFormView',
224
+ components: { ClPage, ClExpandablePane, ClDescriptions, ClDiff },
225
+ props: {
226
+ // 表单配置
227
+ formOptions: {
228
+ type: Array,
229
+ default: () => {
230
+ return []
231
+ }
232
+ },
233
+ formValue: {
234
+ type: Object,
235
+ default: () => {
236
+ return {}
237
+ }
238
+ },
239
+ diff: {
240
+ type: Boolean,
241
+ default: false
242
+ },
243
+ oldFormValue: {
244
+ type: Object,
245
+ default: () => {
246
+ return {}
247
+ }
248
+ }
249
+ },
250
+ data() {
251
+ return {
252
+ numerify
253
+ }
254
+ },
255
+ methods: {
256
+ getEnumName(enumList, code) {
257
+ if (!enumList?.length) return
258
+ const enumData = Array.isArray(enumList) ? enumList : JSON.parse(enumList)
259
+ return enumData?.find((item) => (item.code || item.value) === code)?.name || '--'
260
+ }
261
+ }
262
+ }
263
+ </script>
@@ -109,7 +109,7 @@
109
109
  :action="apiPrefix ? apiPrefix + action : action"
110
110
  :multiple="multiple"
111
111
  :headers="headers"
112
- :disabled="!row[keys.type] || row._typeDisabled"
112
+ :disabled="!row[keys.type] || row._typeDisabled || row._uploadDisabled"
113
113
  :accept="row[keys.type] | acceptFilter(typeOptions, fileAccept)"
114
114
  :size="row[keys.type] | sizeFilter(typeOptions, fileSize)"
115
115
  :http-request="uploadHttpRequest ? (options) => uploadHttpRequest(options, row) : undefined"
@@ -816,6 +816,22 @@ export default {
816
816
 
817
817
  let responseList = Array.isArray(data) ? data : []
818
818
  let rows = responseList.map((item) => this.buildAutoMatchBatchRow(item))
819
+ rows.forEach((row) => {
820
+ let type = row[this.keys.type]
821
+ if (!type) {
822
+ return
823
+ }
824
+ let placeholderIndex = this.tableData.findIndex(
825
+ (item) =>
826
+ item[this.keys.type] === type &&
827
+ !item[this.keys.url] &&
828
+ !item[this.keys.name] &&
829
+ !item._name
830
+ )
831
+ if (placeholderIndex > -1) {
832
+ this.tableData.splice(placeholderIndex, 1)
833
+ }
834
+ })
819
835
  this.tableData.splice(0, 0, ...rows)
820
836
  let pendingFiles = [...files]
821
837
  rows.forEach((row) => {
@@ -841,6 +857,7 @@ export default {
841
857
  _percent: 100,
842
858
  _status: 'success',
843
859
  _typeDisabled: false,
860
+ _uploadDisabled: true,
844
861
  _typeUpdating: false,
845
862
  _shouldUpdateFileType: !item.attno,
846
863
  _lastFileType: item.attno,
@@ -647,31 +647,14 @@ export function saveTransform(list, labelKey, isFilter) {
647
647
  if (!isFilter) {
648
648
  // 遍历列配置列表,将每列转换为存储格式
649
649
  list.forEach((c) => {
650
- // 普通列:有prop属性、无子列、非新增列、无宽度设置
651
- if (c.prop && !c.children && !c.isNew && !c.width && !c.isNew) {
652
- const entry = { _colKey: 'prop', _colVal: c.prop }
653
- if (c.fixed) entry.fixed = c.fixed
654
- listN.push(entry)
650
+ const colKey = getColumnKey(c, labelKey)
651
+ // 已有列只保存稳定标识和用户设置,label 始终从当前 columns 中获取
652
+ if (colKey && !c.isNew && !c.remote) {
653
+ listN.push(createColumnReference(c, colKey))
655
654
  }
656
- // 特殊类型列:多选/序号/展开列
657
- else if (c.type && ['selection', 'index', 'expand'].includes(c.type)) {
658
- listN.push({ _colKey: 'type', _colVal: c.type })
659
- }
660
- // 其他列:包含函数或需要完整保留的列
655
+ // 用户新增列、远程列等没有本地定义可供回填,需要保留完整配置
661
656
  else {
662
- let sFn = false
663
- // 检查列配置中是否包含函数类型的属性
664
- for (let k in c) {
665
- if (typeof c[k] === 'function') sFn = true
666
- }
667
- // 包含函数且有标签的列,使用标签作为标识存储
668
- if (sFn && c[labelKey]) {
669
- listN.push({ _colKey: labelKey, _colVal: c[labelKey], ...c })
670
- }
671
- // 其他情况直接存储完整列配置
672
- else {
673
- listN.push(c)
674
- }
657
+ listN.push(c)
675
658
  }
676
659
  })
677
660
  } else {
@@ -690,6 +673,44 @@ export function saveTransform(list, labelKey, isFilter) {
690
673
  return listN
691
674
  }
692
675
 
676
+ const COLUMN_KEY_PRIORITY = ['columnKey', 'prop', 'slotName', 'field', 'type']
677
+ const COLUMN_SETTING_KEYS = ['fixed', 'width', 'wrap', 'bold', 'align']
678
+
679
+ function getColumnKey(column, labelKey = 'label') {
680
+ return COLUMN_KEY_PRIORITY.find(
681
+ (key) => key !== labelKey && column[key] !== undefined && column[key] !== null && column[key] !== ''
682
+ )
683
+ }
684
+
685
+ function createColumnReference(column, colKey) {
686
+ const entry = { _colKey: colKey, _colVal: column[colKey] }
687
+ COLUMN_SETTING_KEYS.forEach((key) => {
688
+ if (column[key] !== undefined) entry[key] = column[key]
689
+ })
690
+ return entry
691
+ }
692
+
693
+ function findCurrentColumn(savedColumn, columnsT, labelKey) {
694
+ if (savedColumn._colKey) {
695
+ const column = columnsT.find((c) => c[savedColumn._colKey] === savedColumn._colVal)
696
+ if (column) return column
697
+ }
698
+
699
+ // 兼容历史完整对象,以及曾使用翻译后 label 作为 _colKey 的数据
700
+ const colKey = getColumnKey(savedColumn, labelKey)
701
+ if (colKey) {
702
+ return columnsT.find((c) => c[colKey] === savedColumn[colKey])
703
+ }
704
+ }
705
+
706
+ function mergeColumnSettings(column, savedColumn) {
707
+ const settings = {}
708
+ COLUMN_SETTING_KEYS.forEach((key) => {
709
+ if (savedColumn[key] !== undefined) settings[key] = savedColumn[key]
710
+ })
711
+ return Object.keys(settings).length ? { ...column, ...settings } : column
712
+ }
713
+
693
714
  function getTransform(list, columnsT, labelKey = 'label') {
694
715
  let columns = []
695
716
  list.forEach((d) => {
@@ -701,23 +722,15 @@ function getTransform(list, columnsT, labelKey = 'label') {
701
722
  column && columns.push(column)
702
723
  // 如果list中的每一项是对象
703
724
  } else if (typeof d === 'object') {
704
- // 如果d中有_colKey属性
705
- if (d._colKey) {
706
- // 从columnsT中找到d._colKey等于d._colVal的项
707
- let column = columnsT.find((c) => c[d._colKey] === d._colVal)
708
- if (column) {
709
- // 将保存的 fixed、width 合并到列对象上(避免直接修改 props)
710
- if (d.fixed !== undefined || d.width !== undefined) {
711
- column = { ...column }
712
- if (d.fixed !== undefined) column.fixed = d.fixed
713
- if (d.width !== undefined) column.width = d.width
714
- }
715
- columns.push(column)
716
- }
717
- // 如果d中没有_colKey属性
718
- } else {
719
- // 将d添加到columns中
725
+ const column = findCurrentColumn(d, columnsT, labelKey)
726
+ if (column) {
727
+ // 使用当前 columns 的完整定义(包括当前语言 label),仅合并用户设置
728
+ columns.push(mergeColumnSettings(column, d))
729
+ } else if (!d._colKey) {
730
+ // 用户新增列、远程列等没有本地定义,保持原有数据形态
720
731
  columns.push(d)
732
+ } else {
733
+ // _colKey 数据未匹配到当前列时沿用原行为:忽略已不存在的列
721
734
  }
722
735
  }
723
736
  })