vue2-client 1.12.2 → 1.12.3-9.alpha.1

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.
Files changed (44) hide show
  1. package/.env.iot +19 -0
  2. package/babel.config.js +4 -1
  3. package/docs//345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +175 -174
  4. package/package.json +2 -2
  5. package/src/base-client/components/common/XCardSet/XCardSet.vue +300 -0
  6. package/src/base-client/components/common/XCollapse/XCollapse.vue +154 -0
  7. package/src/base-client/components/common/XConversation/XConversation.vue +87 -2
  8. package/src/base-client/components/common/XConversation/XConversationDemo.vue +28 -28
  9. package/src/base-client/components/common/XDataCard/XDataCard.vue +47 -21
  10. package/src/base-client/components/common/XDatePicker/index.vue +13 -3
  11. package/src/base-client/components/common/XForm/XForm.vue +1 -1
  12. package/src/base-client/components/common/XForm/XFormItem.vue +17 -7
  13. package/src/base-client/components/common/XForm/XTreeSelect.vue +263 -264
  14. package/src/base-client/components/common/XForm/demo.vue +105 -0
  15. package/src/base-client/components/common/XFormTable/demo.vue +11 -3
  16. package/src/base-client/components/common/XPrint/Demo.vue +41 -41
  17. package/src/base-client/components/common/XRate/demo.vue +102 -0
  18. package/src/base-client/components/common/XRate/index.vue +136 -0
  19. package/src/base-client/components/common/XReportGrid/XReport.vue +240 -305
  20. package/src/base-client/components/common/XReportGrid/XReportDemo.vue +0 -2
  21. package/src/base-client/components/common/XReportGrid/XReportDesign.vue +115 -345
  22. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +100 -723
  23. package/src/base-client/components/common/XTable/XTable.vue +3 -0
  24. package/src/base-client/components/common/XTable/XTableWrapper.vue +7 -3
  25. package/src/base-client/components/his/XHDescriptions/XHDescriptions.vue +172 -0
  26. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +360 -359
  27. package/src/layouts/GridView.vue +43 -45
  28. package/src/logic/plugins/common/DateTools.js +3 -0
  29. package/src/logic/plugins/common/VueTools.js +30 -0
  30. package/src/logic/plugins/index.js +3 -1
  31. package/src/pages/LogicCallExample/index.vue +10 -0
  32. package/src/pages/WorkflowDetail/WorkFlowDemo.vue +47 -32
  33. package/src/pages/WorkflowDetail/WorkflowDetail.vue +5 -0
  34. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +876 -864
  35. package/src/pages/userInfoDetailManage/index.vue +82 -82
  36. package/src/plugins/HiPrintPlugin.js +164 -124
  37. package/src/router/async/router.map.js +3 -2
  38. package/src/services/v3Api.js +116 -116
  39. package/src/utils/EncryptUtil.js +6 -7
  40. package/src/utils/indexedDB.js +3 -1
  41. package/src/utils/request.js +4 -8
  42. package/src/utils/routerUtil.js +17 -0
  43. package/.babelrc +0 -3
  44. package/src/base-client/components/common/XReportGrid/XReportJsonRender.vue +0 -380
@@ -1,452 +1,78 @@
1
1
  <template>
2
2
  <a-row id="has_row" type="flex" :gutter="gutter" :style="isWidget ? {margin: '0px'} : {'margin-bottom': '.5rem'}">
3
- <!-- 预览页展示 -->
4
- <template v-if="display">
5
- <template v-if="!inputColumns">
6
- <a-col
7
- name="trGroup"
8
- v-for="(cell, cellIndex) in columns"
9
- v-if="Array.isArray(cell) || !cell.dontShowRow"
10
- :key="cellIndex"
11
- :style="isWidget ? {padding: '0px 2px'} : (Array.isArray(cell) ? {} : determineCellStyle(cell))"
12
- :span="Array.isArray(cell) ? cell[0][0].colSpan * 2 : (cell.colSpan ? cell.colSpan * 2 : undefined)">
13
- <div id="report_widget" v-if="isWidget">
14
- <!-- 插槽渲染 -->
15
- <template v-if="Array.isArray(cell)">
16
- <!-- 处理 cell 是数组的情况 -->
17
- <div v-for="(item, index) in cell" :key="index">
18
- <x-report-tr-group
19
- @updateImg="updateImg"
20
- :show-img-in-cell="showImgInCell"
21
- :img-prefix="imgPrefix"
22
- :server-name="serverName"
23
- :env="env"
24
- :use-oss-for-img="useOssForImg"
25
- :key="index"
26
- :columns="recalculateItem(item)"
27
- :no-top-border="noTopBorder"
28
- :config-data="configData"
29
- :config="config"
30
- :display="true">
31
- </x-report-tr-group>
32
- </div>
33
- </template>
34
- <template v-else-if="cell.type === 'slot'">
35
- <template
36
- v-if="['x-form-table','x-add-native-form','x-tree-pro', 'x-his-editor', 'x-tab', 'x-form-group', 'x-report', 'x-buttons', 'x-label-select', 'x-conversation', 'x-check-list'].includes(cell.slotType)">
37
- <component
38
- :is="getComponentName(cell.slotConfig, cell.serviceName, cell.slotType)"
39
- :key="cellIndex"
40
- :ref="`dynamicComponent_${ cell.slotRef || cellIndex}`"
41
- :serviceName="cell.serviceName"
42
- :serverName="cell.serviceName"
43
- v-on="getEventHandlers(cell)"
44
- @hook:mounted="(h)=>onComponentMounted(h,cell,cellIndex)"
45
- :queryParamsName="cell.slotConfig"
46
- :configName="cell.slotConfig"
47
- :countVisible="false"
48
- :env="env"
49
- />
50
- </template>
51
- </template>
52
- </div>
53
- <a-card v-else class="flexItem" :bordered="false" :body-style="flexItemBodyState">
54
- <!-- 插槽渲染 -->
55
- <template v-if="Array.isArray(cell)">
56
- <!-- 处理 cell 是数组的情况 -->
57
- <div v-for="(item, index) in cell" :key="index">
58
- <x-report-tr-group
59
- @updateImg="updateImg"
60
- :show-img-in-cell="showImgInCell"
61
- :img-prefix="imgPrefix"
62
- :server-name="serverName"
63
- :env="env"
64
- :use-oss-for-img="useOssForImg"
65
- :key="index"
66
- :columns="recalculateItem(item)"
67
- :no-top-border="noTopBorder"
68
- :config-data="configData"
69
- :config="config"
70
- :display="true">
71
- </x-report-tr-group>
72
- </div>
73
- </template>
74
- <template v-else-if="cell.type === 'slot'">
75
- <template
76
- v-if="['x-form-table','x-add-native-form','x-tree-pro', 'x-his-editor', 'x-tab', 'x-form-group', 'x-report', 'x-buttons', 'x-label-select', 'x-conversation', 'x-check-list'].includes(cell.slotType)">
77
- <component
78
- :is="getComponentName(cell.slotConfig, cell.serviceName, cell.slotType)"
79
- :key="cellIndex"
80
- :ref="`dynamicComponent_${ cell.slotRef || cellIndex}`"
81
- :serviceName="cell.serviceName"
82
- :serverName="cell.serviceName"
83
- v-on="getEventHandlers(cell)"
84
- @hook:mounted="(h)=>onComponentMounted(h,cell,cellIndex)"
85
- :queryParamsName="cell.slotConfig"
86
- :configName="cell.slotConfig"
87
- :countVisible="false"
88
- :env="env"
89
- />
90
- </template>
91
- </template>
92
- <!-- button 按钮渲染 -->
93
- <template v-else-if="cell.type === 'button'">
94
- <a-button v-on="getEventHandlers(cell)">
95
- {{ cell.buttonName }}
96
- </a-button>
97
- </template>
98
- <template v-else-if="cell.type === 'column'">
99
- <template v-if="cell.customFunction">
100
- {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
101
- </template>
102
- <template v-else>
103
- {{ cell.text }}
104
- </template>
105
- </template>
106
- <!-- 占位 -->
107
- <template v-else-if="cell.type === 'placeHolderColumn'">
108
- </template>
109
- <template v-else-if="cell.type === 'value'">
110
- <template v-if="cell.customFunction === undefined">
111
- {{ cell.value }}
112
- </template>
113
- <template v-else>
114
- {{ deserializeFunctionAndRun(cell.customFunction, cell.value, config) }}
115
- </template>
116
- </template>
117
- <template v-else-if="cell.type === 'input'">
118
- <template v-if="cell.customFunction === undefined">
119
- {{ getDeepObject(configData, cell.dataIndex) }}
120
- </template>
121
- <template v-else>
122
- {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
123
- </template>
124
- </template>
125
- <template v-else-if="cell.type === 'inputs'">
126
- <template v-if="cell.customFunction === undefined">
127
- {{ showSubRowValue(cell) }}
128
- </template>
129
- <template v-else>
130
- {{ deserializeFunctionAndRun(cell.customFunction, showSubRowValue(cell), config) }}
131
- </template>
132
- </template>
133
- <template v-else-if="cell.type === 'list'">
134
- <template v-if="listIndex === 0">
135
- <span style="font-weight: bold">{{ cell.listHead }}</span>
136
- </template>
137
- <template v-else-if="cell.listType === 'input'">
138
- {{ getDeepObject(configData, cell.dataIndex)[listIndex] }}
139
- </template>
140
- <template v-else-if="cell.listType === 'value'">
141
- {{ cell.content[listIndex] }}
142
- </template>
143
- <template v-else-if="cell.listType === 'variable'">
144
- {{ configData[cell.dataIndex][listIndex - 1][cell.listDataIndex] }}
145
- </template>
146
- </template>
147
- <template v-else-if="cell.type === 'images'">
148
- <template
149
- v-if="getDeepObject(configData.images, cell.dataIndex) === undefined || getDeepObject(configData.images, cell.dataIndex).length === 0">
150
- <template
151
- v-if="getDeepObject(configData, cell.dataIndex) === undefined || getDeepObject(configData, cell.dataIndex).length === 0">
152
- <span>无</span>
153
- </template>
154
- <template v-else>
155
- <template v-if="typeof getDeepObject(configData, cell.dataIndex) === 'object'">
156
- <div style="display: flex; align-items: end; justify-content: space-evenly; flex-wrap: wrap">
157
- <template v-for="(img,imgIndex) in getDeepObject(configData, cell.dataIndex)">
158
- <template v-if="showImgInCell">
159
- <div :key="imgIndex">
160
- <img :src="img.url" alt="图片"/>
161
- <p>{{ img.name }}</p>
162
- </div>
163
- </template>
164
- <template v-else>
165
- <span :key="imgIndex" style="margin-right: 5%">{{ img.name }}</span>
166
- </template>
167
- </template>
168
- </div>
169
- </template>
170
- <template v-else>
171
- <img :src="getDeepObject(configData, cell.dataIndex)" alt="图片"/>
172
- <p style="margin-right: 5%">{{ formatImgStr(getDeepObject(configData, cell.dataIndex))[0].name }}</p>
173
- </template>
174
- </template>
175
- </template>
176
- <span v-else v-for="(img,imgIndex) in getDeepObject(configData.images, cell.dataIndex)" :key="imgIndex" style="margin-right: 5%">{{ img.name }}</span>
177
- </template>
178
- </a-card>
179
- </a-col>
180
- </template>
181
- <template v-else>
182
- <a-col
183
- v-for="(cell, cellIndex) in columns"
184
- :key="cellIndex"
185
- :class=" calcTDBorder(cell.noBoarder) "
186
- :span="cell.colSpan ? cell.colSpan * 2 : undefined"
187
- :style="determineCellStyle(cell)"
188
- :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
189
- <a-card class="flexItem" :bordered="false" :body-style="flexItemBodyState">
190
- <template v-if="cell.type === 'column'">
191
- {{ cell.text }}
192
- </template>
193
- <template v-else-if="cell.type === 'value'">
194
- <template v-if="cell.customFunction === undefined">
195
- {{ cell.value }}
196
- </template>
197
- <template v-else>
198
- {{ deserializeFunctionAndRun(cell.customFunction, cell.value, config) }}
199
- </template>
200
- </template>
201
- <template v-else-if="cell.type === 'increment'">
202
- <template v-if="cell.customFunction === undefined">
203
- {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
204
- </template>
205
- <template v-else>
206
- {{
207
- deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
208
- }}
209
- </template>
210
- </template>
211
- <template v-else-if="cell.type === 'input'">
212
- <template v-if="cell.customFunction === undefined">
213
- {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
214
- </template>
215
- <template v-else>
216
- {{
217
- deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
218
- }}
219
- </template>
220
- </template>
221
- <template v-else-if="cell.type === 'inputs'">
222
- <template v-if="cell.customFunction === undefined">
223
- {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
224
- </template>
225
- <template v-else>
226
- {{
227
- deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
228
- }}
229
- </template>
230
- </template>
231
- </a-card>
232
- </a-col>
233
- </template>
234
- </template>
235
- <!-- 不是动态行 -->
236
- <template v-else-if="!inputColumns">
3
+ <template v-for="(cell, cellIndex) in columns">
237
4
  <a-col
238
- v-for="(cell, cellIndex) in columns"
5
+ name="trGroup"
6
+ v-if="Array.isArray(cell) || !cell.dontShowRow"
239
7
  :key="cellIndex"
240
- :class=" calcTDBorder(cell.noBoarder) "
241
- :span="cell.colSpan ? cell.colSpan * 2 : undefined"
242
- :style="determineCellStyle(cell)"
243
- :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
244
- <a-card class="flexItem" :bordered="false" :body-style="flexItemBodyState">
245
- <template v-if="cell.type === 'column'">
246
- <template v-if="cell.customFunction">
247
- {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
248
- </template>
249
- <template v-else>
250
- {{ cell.text }}
251
- </template>
252
- </template>
253
- <template v-else-if="cell.type === 'placeHolderColumn'">
254
- <!-- 占位 -->
255
- </template>
256
- <template v-else-if="cell.type === 'value'">
257
- {{ cell.value }}
258
- </template>
259
- <template v-else-if="cell.type === 'curDateInput'">
260
- <a-button type="dashed" v-if="configData[cell.dataIndex]">
261
- {{ configData[cell.dataIndex] }}
262
- </a-button>
263
- <a-button
264
- v-if="!configData[cell.dataIndex]"
265
- type="primary"
266
- @click="getNowDate(cell.dataIndex)"
267
- >{{ cell.text || '确认' }}
268
- </a-button>
269
- </template>
270
- <template v-else-if="cell.type === 'input'">
271
- <template v-if="cell.inputReadOnly === true">
272
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
273
- <a-input
274
- @change="handleInputDeepChange($event, cell.dataIndex)"
275
- v-model="config.tempData[cell.dataIndex]"
276
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
277
- :disabled="true"/>
278
- </template>
279
- <template v-else>
280
- <a-input
281
- v-model="configData[cell.dataIndex]"
282
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
283
- :disabled="true"/>
284
- </template>
285
- </template>
286
- <template v-else>
287
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
288
- <a-input
289
- @change="handleInputDeepChange($event, cell.dataIndex)"
290
- v-model="config.tempData[cell.dataIndex]"
291
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
292
- </template>
293
- <template v-else>
294
- <a-input
295
- v-model="configData[cell.dataIndex]"
296
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
297
- </template>
298
- </template>
299
- </template>
300
- <template v-else-if="cell.type === 'inputs'">
301
- <template v-if="cell.inputReadOnly === true">
302
- <div class="inputsDiv">
303
- <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(cell.format)" :key="index">
304
- <span class="inputsDivItemLabel">{{ displayFormatStartText(cell.format) }}</span>
305
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
306
- <a-input
307
- @change="handleInputDeepChange($event, cell.dataIndex)"
308
- v-model="config.tempData[cell.dataIndex][index]"
309
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
310
- :disabled="true"/>
311
- </template>
312
- <template v-else>
313
- <a-input
314
- v-model="configData[cell.dataIndex][index]"
315
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
316
- :disabled="true"/>
317
- </template>
318
- <span class="inputsDivItemLabel">{{ displayFormatText(cell.format, index) }}</span>
319
- </div>
320
- </div>
321
- </template>
322
- <template v-else>
323
- <div class="inputsDiv">
324
- <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(cell.format)" :key="index">
325
- <span class="inputsDivItemLabel">{{ displayFormatStartText(cell.format) }}</span>
326
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
327
- <a-input
328
- @change="handleInputDeepChange($event, cell.dataIndex)"
329
- v-model="config.tempData[cell.dataIndex][index]"
330
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
331
- </template>
332
- <template v-else>
333
- <a-input
334
- v-model="configData[cell.dataIndex][index]"
335
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
336
- </template>
337
- <span class="inputsDivItemLabel">{{ displayFormatText(cell.format, index) }}</span>
338
- </div>
339
- </div>
340
- </template>
8
+ :style="isWidget ? {padding: '0px 2px'} : (Array.isArray(cell) ? {} : determineCellStyle(cell))"
9
+ :span="calculateColSpan(cell)">
10
+ <div id="report_widget" v-if="isWidget">
11
+ <!-- 插槽渲染 -->
12
+ <template v-if="Array.isArray(cell)">
13
+ <!-- 处理 cell 是数组的情况 -->
14
+ <div v-for="(item, index) in cell" :key="index">
15
+ <x-report-tr-group
16
+ :env="env"
17
+ :key="index"
18
+ :columns="recalculateItem(item)"
19
+ :config-data="configData"
20
+ :config="config"
21
+ :display="true">
22
+ </x-report-tr-group>
23
+ </div>
341
24
  </template>
342
- <template v-else-if="cell.type === 'list'">
343
- <template v-if="cell.listType === 'input'">
344
- <a-input
345
- v-model="configData[cell.dataIndex][listIndex]"
346
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
347
- </template>
348
- <template v-else-if="cell.listType === 'value'">
349
- {{ cell.content[listIndex] }}
25
+ <template v-else-if="cell.type === 'slot'">
26
+ <template
27
+ v-if="['x-form-table','x-add-native-form','x-tree-pro', 'x-his-editor', 'x-tab', 'x-form-group', 'x-report', 'x-buttons', 'x-label-select', 'x-conversation', 'x-check-list', 'x-cardSet', 'x-collapse','x-h-descriptions'].includes(cell.slotType)">
28
+ <component
29
+ :is="getComponentName(cell.slotConfig, cell.serviceName, cell.slotType)"
30
+ :key="cellIndex"
31
+ :ref="`dynamicComponent_${ cell.slotRef || cellIndex}`"
32
+ :serviceName="cell.serviceName"
33
+ :serverName="cell.serviceName"
34
+ v-on="getEventHandlers(cell)"
35
+ @hook:mounted="(h)=>onComponentMounted(h,cell,cellIndex)"
36
+ :queryParamsName="cell.slotConfig"
37
+ :configName="cell.slotConfig"
38
+ :countVisible="false"
39
+ :env="env"
40
+ />
350
41
  </template>
351
42
  </template>
352
- <template v-else-if="cell.type === 'images'">
353
- <div>
354
- <template v-if="configData.images[cell.dataIndex]?.length > 0">
355
- <upload
356
- :model="uploadParams"
357
- :img-prefix="imgPrefix"
358
- :service-name="serverName"
359
- :images="checkImg(cell.dataIndex, 'configData')"
360
- :outer-container-index="cell.dataIndex"
361
- @setFiles="(...args) => {setImages(args, 'configData')}"
362
- :upload-style="'simple'"
363
- />
364
- </template>
365
- <template v-else>
366
- <upload
367
- :model="uploadParams"
368
- :img-prefix="imgPrefix"
369
- :service-name="serverName"
370
- :images="checkImg(cell.dataIndex, 'config')"
371
- :outer-container-index="cell.dataIndex"
372
- @setFiles="(...args) => {setImages(args, 'config', cell.dataIndex)}"
373
- :upload-style="'simple'"
374
- />
375
- </template>
43
+ </div>
44
+ <a-card v-else class="flexItem" :bordered="false" :body-style="flexItemBodyState">
45
+ <!-- 插槽渲染 -->
46
+ <template v-if="Array.isArray(cell)">
47
+ <!-- 处理 cell 是数组的情况 -->
48
+ <div v-for="(item, index) in cell" :key="index">
49
+ <x-report-tr-group
50
+ :server-name="serverName"
51
+ :env="env"
52
+ :key="index"
53
+ :columns="recalculateItem(item)"
54
+ :config-data="configData"
55
+ :config="config"
56
+ :display="true">
57
+ </x-report-tr-group>
376
58
  </div>
377
59
  </template>
378
- </a-card>
379
- </a-col>
380
- </template>
381
- <!-- 动态行插入按钮 -->
382
- <template v-else-if="inputColumnsButton">
383
- <a-col :span="maxColSpan" :class="calcTDBorder()">
384
- <a-card class="flexItem" :bordered="false" :body-style="flexItemBodyState">
385
- <a-button-group>
386
- <a-button @click="addData(columns[0].dataIndex, columns)">
387
- <a-icon type="plus"/>
388
- </a-button>
389
- <a-button @click="removeData(columns[0].dataIndex)">
390
- <a-icon type="minus"/>
391
- </a-button>
392
- </a-button-group>
393
- </a-card>
394
- </a-col>
395
- </template>
396
- <!-- 其他行 -->
397
- <template v-else>
398
- <a-col
399
- v-for="(cell, cellIndex) in columns"
400
- :key="cellIndex"
401
- :class=" calcTDBorder(cell.noBoarder) "
402
- :span="cell.colSpan ? cell.colSpan * 2 : undefined"
403
- :style="determineCellStyle(cell)"
404
- :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
405
- <a-card class="flexItem" :bordered="false" :body-style="flexItemBodyState">
406
- <template v-if="cell.type === 'column'">
407
- {{ cell.text }}
408
- </template>
409
- <template v-else-if="cell.type === 'value'">
410
- {{ cell.value }}
411
- </template>
412
- <template v-else-if="cell.type === 'curDateInput'">
413
- <a-button type="dashed" v-if="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]">
414
- {{ configData.arr[inputColumnsDefinitionIndex][cell.dataIndex] }}
415
- </a-button>
416
- <a-button
417
- v-if="!configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
418
- type="primary"
419
- @click="getNowDate(inputColumnsDefinitionIndex,cell.dataIndex)"
420
- >{{ cell.text || '确认' }}
421
- </a-button>
422
- </template>
423
- <template v-else-if="cell.type === 'increment'">
424
- {{ configData.arr[inputColumnsDefinitionIndex][cell.dataIndex] }}
425
- </template>
426
- <template v-else-if="cell.type === 'input'">
427
- <template v-if="cell.inputReadOnly === true">
428
- <a-input
429
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
430
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
431
- :disabled="true"/>
432
- </template>
433
- <template v-else>
434
- <a-input
435
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
436
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
437
- </template>
438
- </template>
439
- <template v-else-if="cell.type === 'inputs'">
440
- <template v-if="cell.inputReadOnly === true">
441
- <a-input
442
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
443
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
444
- :disabled="true"/>
445
- </template>
446
- <template v-else>
447
- <a-input
448
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
449
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
60
+ <template v-else-if="cell.type === 'slot'">
61
+ <template
62
+ v-if="['x-form-table','x-add-native-form','x-tree-pro', 'x-his-editor', 'x-tab', 'x-form-group', 'x-report', 'x-buttons', 'x-label-select', 'x-conversation', 'x-check-list', 'x-cardSet', 'x-collapse', 'x-h-descriptions'].includes(cell.slotType)">
63
+ <component
64
+ :is="getComponentName(cell.slotConfig, cell.serviceName, cell.slotType)"
65
+ :key="cellIndex"
66
+ :ref="`dynamicComponent_${ cell.slotRef || cellIndex}`"
67
+ :serviceName="cell.serviceName"
68
+ :serverName="cell.serviceName"
69
+ v-on="getEventHandlers(cell)"
70
+ @hook:mounted="(h)=>onComponentMounted(h,cell,cellIndex)"
71
+ :queryParamsName="cell.slotConfig"
72
+ :configName="cell.slotConfig"
73
+ :countVisible="false"
74
+ :env="env"
75
+ />
450
76
  </template>
451
77
  </template>
452
78
  </a-card>
@@ -457,8 +83,7 @@
457
83
 
458
84
  <script>
459
85
  import Upload from '@vue2-client/base-client/components/common/Upload'
460
- import { formatDate, getRealKeyData } from '@vue2-client/utils/util'
461
- import { nanoid } from 'nanoid'
86
+ import { getRealKeyData } from '@vue2-client/utils/util'
462
87
  import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
463
88
  import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
464
89
  import { getMicroData, getWindow, isMicroAppEnv, microDispatch } from '@vue2-client/utils/microAppUtils'
@@ -478,6 +103,9 @@ export default {
478
103
  XLabelSelect: () => import('@vue2-client/base-client/components/common/XLabelSelect/XLabelSelect.vue'),
479
104
  XConversation: () => import('@vue2-client/base-client/components/common/XConversation/XConversation.vue'),
480
105
  XCheckList: () => import('@vue2-client/base-client/components/common/XCheckList/XCheckList.vue'),
106
+ XCardSet: () => import('@vue2-client/base-client/components/common/XCardSet/XCardSet.vue'),
107
+ XCollapse: () => import('@vue2-client/base-client/components/common/XCollapse/XCollapse.vue'),
108
+ XHDescriptions: () => import('@vue2-client/base-client/components/his/XHDescriptions/XHDescriptions.vue'),
481
109
  },
482
110
  props: {
483
111
  // 每一行的配置
@@ -510,46 +138,11 @@ export default {
510
138
  type: Object,
511
139
  required: true
512
140
  },
513
- // 是否为动态行
514
- inputColumns: {
515
- type: Boolean,
516
- default: false
517
- },
518
- // 是否为动态行按钮
519
- inputColumnsButton: {
520
- type: Boolean,
521
- default: false
522
- },
523
- // 动态行的Index
524
- inputColumnsDefinitionIndex: {
525
- type: Number,
526
- default: undefined
527
- },
528
141
  // 是否为展示行
529
142
  display: {
530
143
  type: Boolean,
531
144
  default: false
532
145
  },
533
- // list类型的下标,用于遍历列表时,获取对应的数据
534
- listIndex: {
535
- type: Number,
536
- default: undefined
537
- },
538
- // 表格没有上边框
539
- noTopBorder: {
540
- type: Boolean,
541
- default: false
542
- },
543
- // 图片是否使用OSS来保存
544
- useOssForImg: {
545
- type: Boolean,
546
- default: true
547
- },
548
- // 图片上传后添加前缀
549
- imgPrefix: {
550
- type: String,
551
- default: undefined
552
- }
553
146
  },
554
147
  computed: {
555
148
  allSlotSum () {
@@ -588,13 +181,31 @@ export default {
588
181
  // tableConfig: {}
589
182
  }
590
183
  },
591
- inject: ['openDialog', 'emitEvent', 'registerComponent', 'setGlobalData', 'getGlobalData', 'getComponentByName', 'runLogic', 'getMixinData', 'getSelectedId', 'isInAModal', 'getConfigByName', 'getSelectedData', 'getOutEnv', 'currUser', 'isWidget'],
184
+ watch: {
185
+ columns: {
186
+ deep: true,
187
+ immediate: true,
188
+ handler (newVal) {
189
+ console.log('columns变化:', JSON.parse(JSON.stringify(newVal)))
190
+ // 使用nextTick确保DOM更新
191
+ this.$nextTick(() => {
192
+ this.$forceUpdate()
193
+ })
194
+ }
195
+ }
196
+ },
197
+ inject: ['openDialog', 'emitEvent', 'registerComponent', 'setColSpanByName', 'setGlobalData', 'getGlobalData', 'getComponentByName', 'runLogic', 'getMixinData', 'getSelectedId', 'isInAModal', 'getConfigByName', 'getSelectedData', 'getOutEnv', 'currUser', 'isWidget'],
592
198
  methods: {
593
199
  getWindow,
594
200
  isMicroAppEnv,
595
201
  microDispatch,
596
202
  getMicroData,
597
203
  getRealKeyData,
204
+ calculateColSpan (cell) {
205
+ return Array.isArray(cell)
206
+ ? cell[0][0]?.colSpan * 2
207
+ : (cell?.colSpan ?? cell?.def?.colSpan ?? 1) * 2
208
+ },
598
209
  onComponentMounted (h, cell, cellIndex) {
599
210
  this.slotRendered += 1
600
211
  if (this.slotRendered >= this.allSlotSum) {
@@ -697,15 +308,20 @@ export default {
697
308
  }, this.env === 'dev')
698
309
  }
699
310
  },
700
-
701
- // 对于嵌套情况,对colSpan重新分配
702
311
  recalculateItem (item) {
703
- const totalColSpan = item.reduce((sum, cell) => sum + (cell.colSpan || 1), 0) // 计算总的 colSpan
312
+ const totalColSpan = item.reduce((sum, cell) => {
313
+ // 保留手动设置的colSpan
314
+ return sum + (cell._isManualColSpan ? 0 : (cell.colSpan || 1))
315
+ }, 0)
704
316
  return item.map(cell => {
705
- const newColSpan = Math.round((cell.colSpan || 1) / totalColSpan * 12) // 按比例重新分配 colSpan
317
+ // 跳过已手动设置的单元格
318
+ if (cell._isManualColSpan) return cell
319
+ const newColSpan = Math.round((cell.colSpan || 1) / totalColSpan * 12)
706
320
  return {
707
321
  ...cell,
708
- colSpan: newColSpan // 更新 colSpan
322
+ colSpan: newColSpan,
323
+ // 标记自动计算的单元格
324
+ _isAutoCalculated: true
709
325
  }
710
326
  })
711
327
  },
@@ -751,57 +367,8 @@ export default {
751
367
  return handlers
752
368
  },
753
369
  getComponentName (queryParamsName, serviceName, componentName) {
754
- // const config = await getConfigByName(queryParamsName, serviceName)
755
- // const componentName = config.$globalProp.type
756
370
  return componentName
757
371
  },
758
- updateImg (data) {
759
- this.$emit('updateImg', data)
760
- },
761
- formatImgStr (str) {
762
- const result = []
763
- if (str !== '') {
764
- const arr = str.split('/')
765
- result.push({
766
- uid: nanoid(6),
767
- url: str,
768
- name: arr[arr.length - 1],
769
- status: 'done'
770
- })
771
- }
772
- this.uploadParams.acceptCount = 1
773
- return result
774
- },
775
- checkImg (index, type) {
776
- let target
777
- if (type === 'configData') {
778
- target = this.configData.images[index]
779
- } else {
780
- target = this.config.tempData[index]
781
- }
782
- if (typeof target !== 'object') {
783
- return this.formatImgStr(target)
784
- }
785
- target.forEach(obj => {
786
- if (obj.uid === undefined) {
787
- obj.uid = obj.id.toString()
788
- }
789
- if (obj.url === undefined) {
790
- if (obj.path) {
791
- obj.url = obj.path
792
- }
793
- }
794
- if (obj.name === undefined) {
795
- const withOutEndFix = obj.url.split('.')[0]
796
- const temp = withOutEndFix.split('/')
797
- obj.name = temp[temp.length - 1]
798
- }
799
- if (obj.status === undefined) {
800
- obj.status = 'done'
801
- }
802
- })
803
- return target
804
- },
805
372
  // 判断单元格样式
806
373
  determineCellStyle (cell, color = '#000', borderWidth = '1px') {
807
374
  // 如果声明了borderColor
@@ -824,197 +391,6 @@ export default {
824
391
  }
825
392
  return result
826
393
  },
827
-
828
- // 表格中数据key含有@@@,需要手动触发更新
829
- handleInputDeepChange () {
830
- this.$forceUpdate()
831
- },
832
- // 路径中含有@@@的key,将其解析,并返回其数据
833
- getDeepObject (obj, strPath) {
834
- if (!strPath) {
835
- return ''
836
- }
837
- const arr = strPath.split('@@@')
838
- let result = obj[arr[0]]
839
- arr.shift()
840
- try {
841
- while (arr.length > 0) {
842
- result = result[arr[0]]
843
- arr.shift()
844
- }
845
- } catch (e) {
846
- result = undefined
847
- }
848
- return result
849
- },
850
- // 获取当前日期
851
- getNowDate (index1, index2) {
852
- if (index2) {
853
- // @click="getNowDate(configData.arr[inputColumnsDefinitionIndex][cell.dataIndex])"
854
- this.configData.arr[index1][index2] = formatDate('now')
855
- } else {
856
- this.configData[index1] = formatDate('now')
857
- }
858
- this.configData = Object.assign({}, this.configData)
859
- },
860
- // 反序列化函数并执行
861
- deserializeFunctionAndRun (functionStr, value) {
862
- // eslint-disable-next-line no-eval
863
- const fun = eval('(' + functionStr + ')')
864
- return fun(value, this.config)
865
- },
866
- // 基础上传组件,图片改动后触发
867
- setImages (args, type, index = undefined) {
868
- // 如果基础上传组件在初始化完成后,就调用emit了setImage,此时图片并没有变化,直接返回
869
- if (args[2] === 'created') {
870
- return
871
- }
872
- if (type === 'configData') {
873
- this.configData.images[args[1]] = args[0]
874
- } else {
875
- this.config.tempData[args[1]] = args[0]
876
- if (index) {
877
- this.$emit('updateImg', this.config.tempData[index])
878
- }
879
- }
880
- },
881
- // 动态行删除
882
- removeData (index) {
883
- if (this.configData[index].length === 0) {
884
- this.$message.warn('已经没有更多了')
885
- return
886
- }
887
- this.configData[index].pop()
888
- },
889
- // 添加一行
890
- addData (index, row) {
891
- // 获取定义
892
- const defs = row[0].definition
893
-
894
- // 获取外层对象名
895
- const dataName = row[0].dataIndex
896
- const temp = {}
897
-
898
- defs.forEach(def => {
899
- // 找到数组中最后一个数据的值
900
- let lastDataNo = 0
901
- if (this.configData[dataName][this.configData[dataName].length - 1]) {
902
- lastDataNo = this.configData[dataName][this.configData[dataName].length - 1][def.dataIndex]
903
- }
904
-
905
- // 如果没有值,检查是否声明了初始值
906
- if (lastDataNo === 0 && def.initialValue) {
907
- lastDataNo = def.initialValue
908
- }
909
-
910
- // 检查是否有步长
911
- let step = 1
912
- if (def.step) {
913
- step = def.step
914
- }
915
-
916
- // 如果单元格类型为increment,则进行自增
917
- if (def.type === 'increment') {
918
- temp[def.dataIndex] = lastDataNo + step
919
- }
920
- })
921
- this.configData[index].push(temp)
922
- },
923
- // 根据format计算需要多少个输入框
924
- calcFormatInputNum (formatStr) {
925
- let count = 0
926
- for (let i = 0; i < formatStr.length; i++) {
927
- if (formatStr[i] === '{') {
928
- count++
929
- }
930
- }
931
- return count
932
- },
933
- // 根据format计算输入框之后的文字显示
934
- displayFormatText (formatStr, num) {
935
- let start = 0
936
- let count = 0
937
- num++
938
- for (let i = 0; i < formatStr.length; i++) {
939
- if (formatStr[i] === '}') {
940
- start = i
941
- count++
942
- }
943
- if (count === num) {
944
- for (let j = start + 1; j < formatStr.length; j++) {
945
- if (formatStr[j] === '{') {
946
- return formatStr.slice(start + 1, j)
947
- }
948
- if (j === formatStr.length - 1 && formatStr[j] !== '}') {
949
- return formatStr[j]
950
- }
951
- }
952
- }
953
- }
954
- },
955
- calcTDBorder (cellNoBorder = false) {
956
- if (cellNoBorder) {
957
- return 'tdNoBorder'
958
- } else {
959
- if (this.noTopBorder) {
960
- return 'tdWithNoTopBorder'
961
- } else {
962
- return 'tdWithBorder'
963
- }
964
- }
965
- },
966
- // 根据format计算输入框之前的文字显示
967
- displayFormatStartText (formatStr) {
968
- let count = 0
969
- for (let i = 0; i < formatStr.length; i++) {
970
- if (formatStr[i] === '{') {
971
- break
972
- } else {
973
- count++
974
- }
975
- }
976
- return formatStr.slice(0, count)
977
- },
978
- // 拼接被自动拆分的单元格内容
979
- showSubRowValue (cell) {
980
- const dataName = cell.dataIndex
981
- const formatArr = []
982
- const dataArr = []
983
-
984
- // 从config中取出所有数据,根据dataIndex的开头内容进行拼接
985
- this.config.columns.forEach(row => row.forEach(cell => {
986
- if (cell.dataIndex && cell.dataIndex.startsWith(dataName)) {
987
- formatArr.push(cell.format)
988
- dataArr.push(this.configData[cell.dataIndex])
989
- }
990
- }))
991
-
992
- const text = []
993
- const data = []
994
-
995
- formatArr.forEach(word => {
996
- const temp = word.split('{}')
997
- temp.forEach(char => {
998
- if (char !== '') {
999
- text.push(char)
1000
- }
1001
- })
1002
- })
1003
-
1004
- dataArr.forEach(item => {
1005
- item.forEach(num => {
1006
- data.push(num)
1007
- })
1008
- })
1009
-
1010
- let result = ''
1011
- for (let i = 0; i < data.length; i++) {
1012
- result += data[i]
1013
- result += text[i]
1014
- }
1015
-
1016
- return result
1017
- },
1018
394
  // 把用户定义的组件,传递到整个杉格中,方便调用
1019
395
  passComponentNamesToAncestor (refs) {
1020
396
  console.log('组件的keys', Object.entries(refs), refs)
@@ -1097,6 +473,7 @@ export default {
1097
473
  .bg-purple-light {
1098
474
  background: #b37feb;
1099
475
  }
476
+
1100
477
  .flexItem {
1101
478
  border-radius: 8px;
1102
479
  height: 100%;