vue2-client 1.22.3 → 1.22.4

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 (88) hide show
  1. package/.env.his +19 -19
  2. package/.idea/.name +1 -0
  3. package/.idea/MarsCodeWorkspaceAppSettings.xml +8 -0
  4. package/.idea/deployment.xml +14 -0
  5. package/.idea/gradle.xml +7 -0
  6. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  7. package/.idea/libraries/contour_plot.xml +9 -0
  8. package/.idea/material_theme_project_new.xml +18 -0
  9. package/.idea/misc.xml +87 -5
  10. package/package.json +1 -1
  11. package/src/base-client/components/common/HIS/HForm/HForm.vue +1186 -1186
  12. package/src/base-client/components/common/XMarkdownViewer/demo.vue +102 -102
  13. package/src/base-client/components/his/HAi/HAi.vue +1177 -1177
  14. package/src/base-client/components/his/XTransfer/index.md +327 -327
  15. package/src/base-client/plugins/GetLoginInfoService.js +4 -4
  16. package/src/utils/login.js +11 -11
  17. package/.history/.eslintrc_20260521171150.js +0 -74
  18. package/.history/.eslintrc_20260521171213.js +0 -74
  19. package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154443.vue +0 -726
  20. package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154700.vue +0 -478
  21. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260512175435.vue +0 -706
  22. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260512175450.vue +0 -694
  23. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260611152602.vue +0 -755
  24. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513145941.vue +0 -524
  25. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513153133.vue +0 -731
  26. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513160316.vue +0 -525
  27. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260601144150.vue +0 -1046
  28. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310142713.vue +0 -512
  29. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310145118.vue +0 -511
  30. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260311094834.vue +0 -696
  31. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260320143028.vue +0 -693
  32. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260409101450.vue +0 -677
  33. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260508164645.vue +0 -758
  34. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260508164714.vue +0 -693
  35. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260508171651.vue +0 -716
  36. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260509133717.vue +0 -695
  37. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260509171115.vue +0 -664
  38. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513140637.vue +0 -1455
  39. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513140935.vue +0 -1441
  40. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513150818.vue +0 -1441
  41. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513153119.vue +0 -1442
  42. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513153126.vue +0 -1486
  43. package/.history/src/base-client/components/common/XForm/XFormItem_20260513140854.vue +0 -1607
  44. package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140403.vue +0 -643
  45. package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140829.vue +0 -628
  46. package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519142824.vue +0 -104
  47. package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519143155.vue +0 -102
  48. package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171231.vue +0 -1241
  49. package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171441.vue +0 -1223
  50. package/.history/src/base-client/components/his/HAi/HAi_20260612174826.vue +0 -472
  51. package/.history/src/base-client/components/his/HAi/HAi_20260612175839.vue +0 -538
  52. package/.history/src/base-client/components/his/HAi/HAi_20260615103331.vue +0 -650
  53. package/.history/src/base-client/components/his/XHDescriptions/XHDescriptions_20260424134504.vue +0 -1469
  54. package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171133.vue +0 -788
  55. package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171151.vue +0 -780
  56. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511170841.vue +0 -585
  57. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511171138.vue +0 -787
  58. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260512141830.vue +0 -739
  59. package/.history/src/components/STable/index_20260409155138.js +0 -806
  60. package/.history/src/components/STable/index_20260409155218.js +0 -814
  61. package/.history/src/expression/core/Expression_20260305164427.js +0 -1371
  62. package/.history/src/expression/core/Expression_20260305170258.js +0 -1358
  63. package/.history/src/expression/core/Program_20260305111830.js +0 -944
  64. package/.history/src/expression/core/Program_20260305112041.js +0 -931
  65. package/.history/src/logic/LogicRunner_20260304154306.js +0 -170
  66. package/.history/src/logic/LogicRunner_20260304155553.js +0 -112
  67. package/.history/src/logic/LogicRunner_20260305105834.js +0 -112
  68. package/.history/src/logic/LogicRunner_20260305112718.js +0 -129
  69. package/.history/src/logic/LogicRunner_20260305182436.js +0 -133
  70. package/.history/src/logic/LogicRunner_20260306151301.js +0 -213
  71. package/.history/src/logic/LogicRunner_20260306152419.js +0 -213
  72. package/.history/src/logic/plugins/common/DateTools_20260305154159.js +0 -61
  73. package/.history/src/logic/plugins/common/DateTools_20260305154217.js +0 -44
  74. package/.history/src/logic/plugins/common/DateTools_20260305161014.js +0 -44
  75. package/.history/src/logic/plugins/common/HttpTools_20260305164352.js +0 -80
  76. package/.history/src/logic/plugins/common/HttpTools_20260305170258.js +0 -75
  77. package/.history/src/logic/plugins/common/HttpTools_20260305171634.js +0 -75
  78. package/.history/src/logic/plugins/common/HttpTools_20260306152419.js +0 -72
  79. package/.history/src/services/api/restTools_20260427142149.js +0 -245
  80. package/.history/src/services/api/restTools_20260427142853.js +0 -230
  81. package/.history/src/services/api/restTools_20260519135558.js +0 -230
  82. package/.history/src/services/api/restTools_20260519140825.js +0 -230
  83. package/.history/src/services/api/restTools_20260519151223.js +0 -230
  84. package/.history/src/utils/indexedDB_20260306150918.js +0 -593
  85. package/.history/src/utils/indexedDB_20260306151301.js +0 -586
  86. package/.idea/codeStyles/Project.xml +0 -62
  87. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  88. 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
+ ```
@@ -133,12 +133,12 @@ function searchFun (fun, name) {
133
133
  }
134
134
  }
135
135
 
136
- const loginGen = async function (response) {
136
+ const loginGen = async function (response, jwt) {
137
137
  Vue.$login.f = response
138
138
  await Promise.all([Vue.$appdata.load(), getViewDetails(Vue.$login.f.id)])
139
139
  const login = {
140
140
  f: Vue.$login.f,
141
- jwt: Vue.$login.f.id,
141
+ jwt: jwt || Vue.$login.f.id,
142
142
  r: Vue.$login.r
143
143
  }
144
144
 
@@ -154,8 +154,8 @@ const GetLoginInfoService = {
154
154
 
155
155
  },
156
156
 
157
- login (response) {
158
- return loginGen(response)
157
+ login (response, jwt) {
158
+ return loginGen(response, jwt)
159
159
  },
160
160
  required (param) {
161
161
  if (typeof param === 'number' && param === 0) {