vue2-client 1.22.20 → 1.22.22

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 (85) hide show
  1. package/.env.his +19 -19
  2. package/.idea/deployment.xml +14 -0
  3. package/.idea/inspectionProfiles/Project_Default.xml +11 -0
  4. package/.idea/misc.xml +5 -5
  5. package/package.json +1 -1
  6. package/src/base-client/components/common/HIS/HForm/HForm.vue +1186 -1186
  7. package/src/base-client/components/common/HIS/HTab/HTab.vue +790 -790
  8. package/src/base-client/components/common/XInspectionDetailDrawer/components/AiDeviceStatus.vue +25 -4
  9. package/src/base-client/components/common/XInspectionDetailDrawer/components/ImageAnnotationShow.vue +1371 -0
  10. package/src/base-client/components/common/XMarkdownViewer/demo.vue +102 -102
  11. package/src/base-client/components/his/XTransfer/index.md +327 -327
  12. package/src/components/MarkdownEditor/demo.vue +1 -1
  13. package/src/utils/module-loader/VueSfcModuleCache.js +99 -99
  14. package/src/utils/module-loader/index.js +5 -5
  15. package/.history/.eslintrc_20260521171150.js +0 -74
  16. package/.history/.eslintrc_20260521171213.js +0 -74
  17. package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154443.vue +0 -726
  18. package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154700.vue +0 -478
  19. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260512175435.vue +0 -706
  20. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260512175450.vue +0 -694
  21. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260611152602.vue +0 -755
  22. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513145941.vue +0 -524
  23. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513153133.vue +0 -731
  24. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513160316.vue +0 -525
  25. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260601144150.vue +0 -1046
  26. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310142713.vue +0 -512
  27. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310145118.vue +0 -511
  28. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260311094834.vue +0 -696
  29. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260320143028.vue +0 -693
  30. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260409101450.vue +0 -677
  31. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260625173703.vue +0 -767
  32. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260626112425.vue +0 -803
  33. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513140637.vue +0 -1455
  34. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513140935.vue +0 -1441
  35. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513150818.vue +0 -1441
  36. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513153119.vue +0 -1442
  37. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513153126.vue +0 -1486
  38. package/.history/src/base-client/components/common/XForm/XFormItem_20260513140854.vue +0 -1607
  39. package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140403.vue +0 -643
  40. package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140829.vue +0 -628
  41. package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519142824.vue +0 -104
  42. package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519143155.vue +0 -102
  43. package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171231.vue +0 -1241
  44. package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171441.vue +0 -1223
  45. package/.history/src/base-client/components/his/HAi/HAi_20260612174826.vue +0 -472
  46. package/.history/src/base-client/components/his/HAi/HAi_20260612175839.vue +0 -538
  47. package/.history/src/base-client/components/his/HAi/HAi_20260615103331.vue +0 -650
  48. package/.history/src/base-client/components/his/HAi/HAi_20260618140214.vue +0 -1396
  49. package/.history/src/base-client/components/his/HAi/HAi_20260618140556.vue +0 -1396
  50. package/.history/src/base-client/components/his/XHDescriptions/XHDescriptions_20260424134504.vue +0 -1469
  51. package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171133.vue +0 -788
  52. package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171151.vue +0 -780
  53. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511170841.vue +0 -585
  54. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511171138.vue +0 -787
  55. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260512141830.vue +0 -739
  56. package/.history/src/components/STable/index_20260409155138.js +0 -806
  57. package/.history/src/components/STable/index_20260409155218.js +0 -814
  58. package/.history/src/expression/core/Expression_20260305164427.js +0 -1371
  59. package/.history/src/expression/core/Expression_20260305170258.js +0 -1358
  60. package/.history/src/expression/core/Program_20260305111830.js +0 -944
  61. package/.history/src/expression/core/Program_20260305112041.js +0 -931
  62. package/.history/src/logic/LogicRunner_20260304154306.js +0 -170
  63. package/.history/src/logic/LogicRunner_20260304155553.js +0 -112
  64. package/.history/src/logic/LogicRunner_20260305105834.js +0 -112
  65. package/.history/src/logic/LogicRunner_20260305112718.js +0 -129
  66. package/.history/src/logic/LogicRunner_20260305182436.js +0 -133
  67. package/.history/src/logic/LogicRunner_20260306151301.js +0 -213
  68. package/.history/src/logic/LogicRunner_20260306152419.js +0 -213
  69. package/.history/src/logic/plugins/common/DateTools_20260305154159.js +0 -61
  70. package/.history/src/logic/plugins/common/DateTools_20260305154217.js +0 -44
  71. package/.history/src/logic/plugins/common/DateTools_20260305161014.js +0 -44
  72. package/.history/src/logic/plugins/common/HttpTools_20260305164352.js +0 -80
  73. package/.history/src/logic/plugins/common/HttpTools_20260305170258.js +0 -75
  74. package/.history/src/logic/plugins/common/HttpTools_20260305171634.js +0 -75
  75. package/.history/src/logic/plugins/common/HttpTools_20260306152419.js +0 -72
  76. package/.history/src/services/api/restTools_20260427142149.js +0 -245
  77. package/.history/src/services/api/restTools_20260427142853.js +0 -230
  78. package/.history/src/services/api/restTools_20260519135558.js +0 -230
  79. package/.history/src/services/api/restTools_20260519140825.js +0 -230
  80. package/.history/src/services/api/restTools_20260519151223.js +0 -230
  81. package/.history/src/utils/indexedDB_20260306150918.js +0 -593
  82. package/.history/src/utils/indexedDB_20260306151301.js +0 -586
  83. package/.idea/codeStyles/Project.xml +0 -62
  84. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  85. package/preview-input-box.html +0 -180
@@ -1,327 +1,327 @@
1
- # XTransfer 穿梭框组件
2
-
3
- **纯配置驱动**的穿梭框组件,只需传入一个 JSON 配置,组件自动加载数据并渲染。支持简单列表和分组列表两种模式。
4
-
5
- ## 快速使用
6
-
7
- ```vue
8
- <template>
9
- <x-transfer :config="transferConfig" @change="handleChange" />
10
- </template>
11
-
12
- <script setup>
13
- const transferConfig = {
14
- logicName: 'inspectionItemTransferLogic',
15
- serverName: 'af-his',
16
- parameter: { status: 1 }
17
- }
18
-
19
- const handleChange = ({ value, data }) => {
20
- console.log('选中keys:', value)
21
- console.log('选中数据:', data)
22
- }
23
- </script>
24
- ```
25
-
26
- ## Props
27
-
28
- | 字段 | 类型 | 默认值 | 说明 |
29
- |------|------|--------|------|
30
- | `config` | Object | `null` | 直接传入配置对象(优先级最高) |
31
- | `configName` | String | `''` | 配置名称,用于从 `getConfigByName` 加载配置 |
32
- | `queryParamsName` | String | `''` | 查询配置名称(二选一,与 configName 互斥) |
33
- | `logicName` | String | `''` | Logic 名称,用于加载数据 |
34
- | `serverName` | String | `'af-his'` | 服务名称 |
35
- | `parameter` | Object | `{}` | 查询参数 |
36
- | `data` | Array | `null` | 直接传入数据源 |
37
- | `initialValue` | Array | `[]` | 初始选中的 keys |
38
- | `rowKey` | String | `'key'` | 数据主键字段 |
39
- | `displayKey` | String | `'title'` | 显示字段 |
40
- | `groupKey` | String | `'group'` | 分组字段 |
41
- | `groupLabelKey` | String | `'label'` | 分组标题字段 |
42
- | `groupItemsKey` | String | `'items'` | 分组内项目字段 |
43
- | `title` | String | `''` | 头部标题 |
44
- | `leftTitle` | String | `''` | 左侧面板标题 |
45
- | `rightTitle` | String | `''` | 右侧面板标题 |
46
- | `allText` | String | `'All'` | 全选按钮文字 |
47
- | `addHint` | String | `'双击添加'` | 添加提示 |
48
- | `removeHint` | String | `'双击移除'` | 移除提示 |
49
- | `disabled` | Boolean | `false` | 是否禁用 |
50
- | `env` | String | `'prod'` | 环境模式,`'prod'` 或开发环境 |
51
- | `radioConfig` | Object | `null` | 单选按钮配置 |
52
-
53
- ### radioConfig 单选按钮配置
54
-
55
- ```javascript
56
- radioConfig: {
57
- options: [
58
- { label: '全部', value: 'all' },
59
- { label: '检验', value: 'inspection' },
60
- { label: '检查', value: 'examination' }
61
- ],
62
- default: 'all', // 默认选中值
63
- paramKey: 'category', // 参数 key,默认为 'radioValue'
64
- reloadLogic: true, // 切换时是否重新加载数据,默认 true
65
- onChange: (value) => {} // 切换回调
66
- }
67
- ```
68
-
69
- ## 完整配置示例
70
-
71
- ```javascript
72
- const transferConfig = {
73
- // ============ 数据加载配置 ============
74
- logicName: 'inspectionItemTransferLogic', // Logic名称
75
- // queryParamsName: 'inspectionItemQuery', // 或使用查询配置
76
- serverName: 'af-his',
77
- parameter: {
78
- status: 1,
79
- category: 'inspection'
80
- },
81
- initialValue: ['l01', 'l02'], // 初始选中
82
-
83
- // ============ 字段映射 ============
84
- rowKey: 'id', // 主键字段
85
- displayKey: 'itemName', // 显示字段
86
- groupKey: 'category', // 分组字段
87
- groupLabelKey: 'categoryName', // 分组标题字段
88
- groupItemsKey: 'items', // 分组内项目字段
89
-
90
- // ============ UI配置 ============
91
- title: '检验项目选择',
92
- leftTitle: '检验项目',
93
- rightTitle: '已选项目',
94
- allText: '全选',
95
- addHint: '双击添加',
96
- removeHint: '双击移除',
97
- disabled: false,
98
-
99
- // ============ 单选按钮配置 ============
100
- radioConfig: {
101
- options: [
102
- { label: '全部', value: 'all' },
103
- { label: '检验', value: 'inspection' },
104
- { label: '检查', value: 'examination' }
105
- ],
106
- default: 'all',
107
- paramKey: 'category',
108
- reloadLogic: true
109
- }
110
- }
111
- ```
112
-
113
- ## 数据格式
114
-
115
- 后端 Logic 返回的数据格式:
116
-
117
- ```json
118
- {
119
- "data": [
120
- {
121
- "category": "liver",
122
- "categoryName": "肝功能",
123
- "itemCount": 14,
124
- "items": [
125
- { "id": "l01", "itemName": "ALT", "itemCode": "ALT001" },
126
- { "id": "l02", "itemName": "AST", "itemCode": "AST001" }
127
- ]
128
- },
129
- {
130
- "category": "kidney",
131
- "categoryName": "肾功能",
132
- "itemCount": 3,
133
- "items": [
134
- { "id": "k01", "itemName": "Cr", "itemCode": "CR001" },
135
- { "id": "k02", "itemName": "BUN", "itemCode": "BUN001" }
136
- ]
137
- }
138
- ]
139
- }
140
- ```
141
-
142
- 或简单格式(无分组):
143
-
144
- ```json
145
- {
146
- "data": [
147
- { "id": "1", "itemName": "ALT", "itemCode": "ALT001" },
148
- { "id": "2", "itemName": "AST", "itemCode": "AST001" }
149
- ]
150
- }
151
- ```
152
-
153
- ## Events
154
-
155
- | 事件 | 参数 | 说明 |
156
- |------|------|------|
157
- | `update:value` | Array | 选中 keys 变化(v-model 绑定) |
158
- | `change` | `{ value, data }` | 选择变化时触发 |
159
- | `loaded` | `{ dataSource, groupDataSource, initialValue, radioValue }` | 数据加载完成 |
160
- | `radioChange` | `{ value, options }` | 单选按钮切换时触发 |
161
-
162
- ## Methods
163
-
164
- 通过 `ref` 获取组件实例后调用:
165
-
166
- | 方法 | 参数 | 说明 |
167
- |------|------|------|
168
- | `loadData()` | - | 重新加载数据 |
169
- | `init(config)` | `config` | 使用新配置初始化组件 |
170
- | `refresh()` | - | 刷新数据(同 loadData) |
171
- | `getSelectedData()` | - | 获取选中的完整数据对象数组 |
172
- | `getSelectedKeys()` | - | 获取选中的 keys 数组 |
173
- | `setValue(keys)` | `keys: Array` | 设置选中值 |
174
- | `clear()` | - | 清空所有选择 |
175
-
176
- ```javascript
177
- // 获取组件实例
178
- const transferRef = ref(null)
179
-
180
- // 调用方法
181
- transferRef.value.loadData() // 重新加载
182
- transferRef.value.getSelectedData() // 获取选中数据
183
- transferRef.value.setValue(['k01']) // 设置选中值
184
- transferRef.value.clear() // 清空选择
185
- ```
186
-
187
- ## Slots
188
-
189
- | 插槽名 | 说明 |
190
- |--------|------|
191
- | `title` | 自定义头部标题区域 |
192
-
193
- ## 使用示例
194
-
195
- ### 基础用法
196
-
197
- ```vue
198
- <template>
199
- <div>
200
- <x-transfer
201
- :config="transferConfig"
202
- @change="handleChange"
203
- />
204
- <pre>{{ JSON.stringify(selectedResult, null, 2) }}</pre>
205
- </div>
206
- </template>
207
-
208
- <script setup>
209
- import { ref } from 'vue'
210
-
211
- const selectedResult = ref({ value: [], data: [] })
212
-
213
- const transferConfig = {
214
- logicName: 'inspectionItemTransferLogic',
215
- serverName: 'af-his',
216
- parameter: { status: 1 },
217
- initialValue: ['l01'],
218
- rowKey: 'id',
219
- displayKey: 'itemName',
220
- groupKey: 'category',
221
- groupLabelKey: 'categoryName',
222
- groupCountKey: 'itemCount',
223
- leftTitle: '检验项目',
224
- rightTitle: '已选项目'
225
- }
226
-
227
- const handleChange = ({ value, data }) => {
228
- selectedResult.value = { value, data }
229
- }
230
- </script>
231
- ```
232
-
233
- ### 带单选按钮的分组切换
234
-
235
- 适用于需要按类别筛选数据的场景,如检验项目和检查项目的切换。
236
-
237
- ```vue
238
- <template>
239
- <x-transfer
240
- :config="transferConfig"
241
- @change="handleChange"
242
- @radioChange="handleRadioChange"
243
- />
244
- </template>
245
-
246
- <script setup>
247
- const transferConfig = {
248
- logicName: 'categoryItemTransferLogic',
249
- serverName: 'af-his',
250
- radioConfig: {
251
- options: [
252
- { label: '检验', value: 'inspection' },
253
- { label: '检查', value: 'examination' },
254
- { label: '治疗', value: 'treatment' }
255
- ],
256
- default: 'inspection',
257
- paramKey: 'category',
258
- reloadLogic: true,
259
- onChange: (value) => {
260
- console.log('切换到:', value)
261
- }
262
- },
263
- leftTitle: '可选项目',
264
- rightTitle: '已选项目'
265
- }
266
-
267
- const handleChange = ({ value, data }) => {
268
- console.log('选中值:', value)
269
- }
270
-
271
- const handleRadioChange = ({ value, options }) => {
272
- console.log('单选切换:', value, options)
273
- }
274
- </script>
275
- ```
276
-
277
- ### 直接传入数据
278
-
279
- ```vue
280
- <template>
281
- <x-transfer :data="localData" v-model="selectedKeys" />
282
- </template>
283
-
284
- <script setup>
285
- import { ref } from 'vue'
286
-
287
- const selectedKeys = ref(['item-1'])
288
-
289
- const localData = [
290
- { key: 'item-1', title: '项目一' },
291
- { key: 'item-2', title: '项目二' },
292
- { key: 'item-3', title: '项目三' }
293
- ]
294
- </script>
295
- ```
296
-
297
- ### 使用 configName 加载配置
298
-
299
- ```vue
300
- <template>
301
- <x-transfer
302
- config-name="inspectionItemTransfer"
303
- :initial-value="initialKeys"
304
- @change="handleChange"
305
- />
306
- </template>
307
-
308
- <script setup>
309
- const initialKeys = ['l01', 'l02']
310
-
311
- const handleChange = ({ value, data }) => {
312
- // 处理选择变化
313
- }
314
- </script>
315
- ```
316
-
317
- ### 自定义头部插槽
318
-
319
- ```vue
320
- <template>
321
- <x-transfer :config="transferConfig">
322
- <template #title>
323
- <span style="color: #0057FE;">自定义标题</span>
324
- </template>
325
- </x-transfer>
326
- </template>
327
- ```
1
+ # XTransfer 穿梭框组件
2
+
3
+ **纯配置驱动**的穿梭框组件,只需传入一个 JSON 配置,组件自动加载数据并渲染。支持简单列表和分组列表两种模式。
4
+
5
+ ## 快速使用
6
+
7
+ ```vue
8
+ <template>
9
+ <x-transfer :config="transferConfig" @change="handleChange" />
10
+ </template>
11
+
12
+ <script setup>
13
+ const transferConfig = {
14
+ logicName: 'inspectionItemTransferLogic',
15
+ serverName: 'af-his',
16
+ parameter: { status: 1 }
17
+ }
18
+
19
+ const handleChange = ({ value, data }) => {
20
+ console.log('选中keys:', value)
21
+ console.log('选中数据:', data)
22
+ }
23
+ </script>
24
+ ```
25
+
26
+ ## Props
27
+
28
+ | 字段 | 类型 | 默认值 | 说明 |
29
+ |------|------|--------|------|
30
+ | `config` | Object | `null` | 直接传入配置对象(优先级最高) |
31
+ | `configName` | String | `''` | 配置名称,用于从 `getConfigByName` 加载配置 |
32
+ | `queryParamsName` | String | `''` | 查询配置名称(二选一,与 configName 互斥) |
33
+ | `logicName` | String | `''` | Logic 名称,用于加载数据 |
34
+ | `serverName` | String | `'af-his'` | 服务名称 |
35
+ | `parameter` | Object | `{}` | 查询参数 |
36
+ | `data` | Array | `null` | 直接传入数据源 |
37
+ | `initialValue` | Array | `[]` | 初始选中的 keys |
38
+ | `rowKey` | String | `'key'` | 数据主键字段 |
39
+ | `displayKey` | String | `'title'` | 显示字段 |
40
+ | `groupKey` | String | `'group'` | 分组字段 |
41
+ | `groupLabelKey` | String | `'label'` | 分组标题字段 |
42
+ | `groupItemsKey` | String | `'items'` | 分组内项目字段 |
43
+ | `title` | String | `''` | 头部标题 |
44
+ | `leftTitle` | String | `''` | 左侧面板标题 |
45
+ | `rightTitle` | String | `''` | 右侧面板标题 |
46
+ | `allText` | String | `'All'` | 全选按钮文字 |
47
+ | `addHint` | String | `'双击添加'` | 添加提示 |
48
+ | `removeHint` | String | `'双击移除'` | 移除提示 |
49
+ | `disabled` | Boolean | `false` | 是否禁用 |
50
+ | `env` | String | `'prod'` | 环境模式,`'prod'` 或开发环境 |
51
+ | `radioConfig` | Object | `null` | 单选按钮配置 |
52
+
53
+ ### radioConfig 单选按钮配置
54
+
55
+ ```javascript
56
+ radioConfig: {
57
+ options: [
58
+ { label: '全部', value: 'all' },
59
+ { label: '检验', value: 'inspection' },
60
+ { label: '检查', value: 'examination' }
61
+ ],
62
+ default: 'all', // 默认选中值
63
+ paramKey: 'category', // 参数 key,默认为 'radioValue'
64
+ reloadLogic: true, // 切换时是否重新加载数据,默认 true
65
+ onChange: (value) => {} // 切换回调
66
+ }
67
+ ```
68
+
69
+ ## 完整配置示例
70
+
71
+ ```javascript
72
+ const transferConfig = {
73
+ // ============ 数据加载配置 ============
74
+ logicName: 'inspectionItemTransferLogic', // Logic名称
75
+ // queryParamsName: 'inspectionItemQuery', // 或使用查询配置
76
+ serverName: 'af-his',
77
+ parameter: {
78
+ status: 1,
79
+ category: 'inspection'
80
+ },
81
+ initialValue: ['l01', 'l02'], // 初始选中
82
+
83
+ // ============ 字段映射 ============
84
+ rowKey: 'id', // 主键字段
85
+ displayKey: 'itemName', // 显示字段
86
+ groupKey: 'category', // 分组字段
87
+ groupLabelKey: 'categoryName', // 分组标题字段
88
+ groupItemsKey: 'items', // 分组内项目字段
89
+
90
+ // ============ UI配置 ============
91
+ title: '检验项目选择',
92
+ leftTitle: '检验项目',
93
+ rightTitle: '已选项目',
94
+ allText: '全选',
95
+ addHint: '双击添加',
96
+ removeHint: '双击移除',
97
+ disabled: false,
98
+
99
+ // ============ 单选按钮配置 ============
100
+ radioConfig: {
101
+ options: [
102
+ { label: '全部', value: 'all' },
103
+ { label: '检验', value: 'inspection' },
104
+ { label: '检查', value: 'examination' }
105
+ ],
106
+ default: 'all',
107
+ paramKey: 'category',
108
+ reloadLogic: true
109
+ }
110
+ }
111
+ ```
112
+
113
+ ## 数据格式
114
+
115
+ 后端 Logic 返回的数据格式:
116
+
117
+ ```json
118
+ {
119
+ "data": [
120
+ {
121
+ "category": "liver",
122
+ "categoryName": "肝功能",
123
+ "itemCount": 14,
124
+ "items": [
125
+ { "id": "l01", "itemName": "ALT", "itemCode": "ALT001" },
126
+ { "id": "l02", "itemName": "AST", "itemCode": "AST001" }
127
+ ]
128
+ },
129
+ {
130
+ "category": "kidney",
131
+ "categoryName": "肾功能",
132
+ "itemCount": 3,
133
+ "items": [
134
+ { "id": "k01", "itemName": "Cr", "itemCode": "CR001" },
135
+ { "id": "k02", "itemName": "BUN", "itemCode": "BUN001" }
136
+ ]
137
+ }
138
+ ]
139
+ }
140
+ ```
141
+
142
+ 或简单格式(无分组):
143
+
144
+ ```json
145
+ {
146
+ "data": [
147
+ { "id": "1", "itemName": "ALT", "itemCode": "ALT001" },
148
+ { "id": "2", "itemName": "AST", "itemCode": "AST001" }
149
+ ]
150
+ }
151
+ ```
152
+
153
+ ## Events
154
+
155
+ | 事件 | 参数 | 说明 |
156
+ |------|------|------|
157
+ | `update:value` | Array | 选中 keys 变化(v-model 绑定) |
158
+ | `change` | `{ value, data }` | 选择变化时触发 |
159
+ | `loaded` | `{ dataSource, groupDataSource, initialValue, radioValue }` | 数据加载完成 |
160
+ | `radioChange` | `{ value, options }` | 单选按钮切换时触发 |
161
+
162
+ ## Methods
163
+
164
+ 通过 `ref` 获取组件实例后调用:
165
+
166
+ | 方法 | 参数 | 说明 |
167
+ |------|------|------|
168
+ | `loadData()` | - | 重新加载数据 |
169
+ | `init(config)` | `config` | 使用新配置初始化组件 |
170
+ | `refresh()` | - | 刷新数据(同 loadData) |
171
+ | `getSelectedData()` | - | 获取选中的完整数据对象数组 |
172
+ | `getSelectedKeys()` | - | 获取选中的 keys 数组 |
173
+ | `setValue(keys)` | `keys: Array` | 设置选中值 |
174
+ | `clear()` | - | 清空所有选择 |
175
+
176
+ ```javascript
177
+ // 获取组件实例
178
+ const transferRef = ref(null)
179
+
180
+ // 调用方法
181
+ transferRef.value.loadData() // 重新加载
182
+ transferRef.value.getSelectedData() // 获取选中数据
183
+ transferRef.value.setValue(['k01']) // 设置选中值
184
+ transferRef.value.clear() // 清空选择
185
+ ```
186
+
187
+ ## Slots
188
+
189
+ | 插槽名 | 说明 |
190
+ |--------|------|
191
+ | `title` | 自定义头部标题区域 |
192
+
193
+ ## 使用示例
194
+
195
+ ### 基础用法
196
+
197
+ ```vue
198
+ <template>
199
+ <div>
200
+ <x-transfer
201
+ :config="transferConfig"
202
+ @change="handleChange"
203
+ />
204
+ <pre>{{ JSON.stringify(selectedResult, null, 2) }}</pre>
205
+ </div>
206
+ </template>
207
+
208
+ <script setup>
209
+ import { ref } from 'vue'
210
+
211
+ const selectedResult = ref({ value: [], data: [] })
212
+
213
+ const transferConfig = {
214
+ logicName: 'inspectionItemTransferLogic',
215
+ serverName: 'af-his',
216
+ parameter: { status: 1 },
217
+ initialValue: ['l01'],
218
+ rowKey: 'id',
219
+ displayKey: 'itemName',
220
+ groupKey: 'category',
221
+ groupLabelKey: 'categoryName',
222
+ groupCountKey: 'itemCount',
223
+ leftTitle: '检验项目',
224
+ rightTitle: '已选项目'
225
+ }
226
+
227
+ const handleChange = ({ value, data }) => {
228
+ selectedResult.value = { value, data }
229
+ }
230
+ </script>
231
+ ```
232
+
233
+ ### 带单选按钮的分组切换
234
+
235
+ 适用于需要按类别筛选数据的场景,如检验项目和检查项目的切换。
236
+
237
+ ```vue
238
+ <template>
239
+ <x-transfer
240
+ :config="transferConfig"
241
+ @change="handleChange"
242
+ @radioChange="handleRadioChange"
243
+ />
244
+ </template>
245
+
246
+ <script setup>
247
+ const transferConfig = {
248
+ logicName: 'categoryItemTransferLogic',
249
+ serverName: 'af-his',
250
+ radioConfig: {
251
+ options: [
252
+ { label: '检验', value: 'inspection' },
253
+ { label: '检查', value: 'examination' },
254
+ { label: '治疗', value: 'treatment' }
255
+ ],
256
+ default: 'inspection',
257
+ paramKey: 'category',
258
+ reloadLogic: true,
259
+ onChange: (value) => {
260
+ console.log('切换到:', value)
261
+ }
262
+ },
263
+ leftTitle: '可选项目',
264
+ rightTitle: '已选项目'
265
+ }
266
+
267
+ const handleChange = ({ value, data }) => {
268
+ console.log('选中值:', value)
269
+ }
270
+
271
+ const handleRadioChange = ({ value, options }) => {
272
+ console.log('单选切换:', value, options)
273
+ }
274
+ </script>
275
+ ```
276
+
277
+ ### 直接传入数据
278
+
279
+ ```vue
280
+ <template>
281
+ <x-transfer :data="localData" v-model="selectedKeys" />
282
+ </template>
283
+
284
+ <script setup>
285
+ import { ref } from 'vue'
286
+
287
+ const selectedKeys = ref(['item-1'])
288
+
289
+ const localData = [
290
+ { key: 'item-1', title: '项目一' },
291
+ { key: 'item-2', title: '项目二' },
292
+ { key: 'item-3', title: '项目三' }
293
+ ]
294
+ </script>
295
+ ```
296
+
297
+ ### 使用 configName 加载配置
298
+
299
+ ```vue
300
+ <template>
301
+ <x-transfer
302
+ config-name="inspectionItemTransfer"
303
+ :initial-value="initialKeys"
304
+ @change="handleChange"
305
+ />
306
+ </template>
307
+
308
+ <script setup>
309
+ const initialKeys = ['l01', 'l02']
310
+
311
+ const handleChange = ({ value, data }) => {
312
+ // 处理选择变化
313
+ }
314
+ </script>
315
+ ```
316
+
317
+ ### 自定义头部插槽
318
+
319
+ ```vue
320
+ <template>
321
+ <x-transfer :config="transferConfig">
322
+ <template #title>
323
+ <span style="color: #0057FE;">自定义标题</span>
324
+ </template>
325
+ </x-transfer>
326
+ </template>
327
+ ```
@@ -74,7 +74,7 @@
74
74
  </template>
75
75
 
76
76
  <script>
77
- import MarkdownEditor from '@/components/MarkdownEditor'
77
+ import MarkdownEditor from '@vue2-client/components/MarkdownEditor'
78
78
 
79
79
  export default {
80
80
  name: 'ArticleEdit',