vue2-client 1.22.3 → 1.22.5

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 (90) 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/pages/login/Login.vue +9 -7
  17. package/src/pages/login/LoginV3.vue +9 -7
  18. package/src/utils/login.js +8 -19
  19. package/.history/.eslintrc_20260521171150.js +0 -74
  20. package/.history/.eslintrc_20260521171213.js +0 -74
  21. package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154443.vue +0 -726
  22. package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154700.vue +0 -478
  23. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260512175435.vue +0 -706
  24. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260512175450.vue +0 -694
  25. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260611152602.vue +0 -755
  26. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513145941.vue +0 -524
  27. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513153133.vue +0 -731
  28. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513160316.vue +0 -525
  29. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260601144150.vue +0 -1046
  30. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310142713.vue +0 -512
  31. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310145118.vue +0 -511
  32. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260311094834.vue +0 -696
  33. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260320143028.vue +0 -693
  34. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260409101450.vue +0 -677
  35. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260508164645.vue +0 -758
  36. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260508164714.vue +0 -693
  37. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260508171651.vue +0 -716
  38. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260509133717.vue +0 -695
  39. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260509171115.vue +0 -664
  40. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513140637.vue +0 -1455
  41. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513140935.vue +0 -1441
  42. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513150818.vue +0 -1441
  43. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513153119.vue +0 -1442
  44. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513153126.vue +0 -1486
  45. package/.history/src/base-client/components/common/XForm/XFormItem_20260513140854.vue +0 -1607
  46. package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140403.vue +0 -643
  47. package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140829.vue +0 -628
  48. package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519142824.vue +0 -104
  49. package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519143155.vue +0 -102
  50. package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171231.vue +0 -1241
  51. package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171441.vue +0 -1223
  52. package/.history/src/base-client/components/his/HAi/HAi_20260612174826.vue +0 -472
  53. package/.history/src/base-client/components/his/HAi/HAi_20260612175839.vue +0 -538
  54. package/.history/src/base-client/components/his/HAi/HAi_20260615103331.vue +0 -650
  55. package/.history/src/base-client/components/his/XHDescriptions/XHDescriptions_20260424134504.vue +0 -1469
  56. package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171133.vue +0 -788
  57. package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171151.vue +0 -780
  58. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511170841.vue +0 -585
  59. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511171138.vue +0 -787
  60. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260512141830.vue +0 -739
  61. package/.history/src/components/STable/index_20260409155138.js +0 -806
  62. package/.history/src/components/STable/index_20260409155218.js +0 -814
  63. package/.history/src/expression/core/Expression_20260305164427.js +0 -1371
  64. package/.history/src/expression/core/Expression_20260305170258.js +0 -1358
  65. package/.history/src/expression/core/Program_20260305111830.js +0 -944
  66. package/.history/src/expression/core/Program_20260305112041.js +0 -931
  67. package/.history/src/logic/LogicRunner_20260304154306.js +0 -170
  68. package/.history/src/logic/LogicRunner_20260304155553.js +0 -112
  69. package/.history/src/logic/LogicRunner_20260305105834.js +0 -112
  70. package/.history/src/logic/LogicRunner_20260305112718.js +0 -129
  71. package/.history/src/logic/LogicRunner_20260305182436.js +0 -133
  72. package/.history/src/logic/LogicRunner_20260306151301.js +0 -213
  73. package/.history/src/logic/LogicRunner_20260306152419.js +0 -213
  74. package/.history/src/logic/plugins/common/DateTools_20260305154159.js +0 -61
  75. package/.history/src/logic/plugins/common/DateTools_20260305154217.js +0 -44
  76. package/.history/src/logic/plugins/common/DateTools_20260305161014.js +0 -44
  77. package/.history/src/logic/plugins/common/HttpTools_20260305164352.js +0 -80
  78. package/.history/src/logic/plugins/common/HttpTools_20260305170258.js +0 -75
  79. package/.history/src/logic/plugins/common/HttpTools_20260305171634.js +0 -75
  80. package/.history/src/logic/plugins/common/HttpTools_20260306152419.js +0 -72
  81. package/.history/src/services/api/restTools_20260427142149.js +0 -245
  82. package/.history/src/services/api/restTools_20260427142853.js +0 -230
  83. package/.history/src/services/api/restTools_20260519135558.js +0 -230
  84. package/.history/src/services/api/restTools_20260519140825.js +0 -230
  85. package/.history/src/services/api/restTools_20260519151223.js +0 -230
  86. package/.history/src/utils/indexedDB_20260306150918.js +0 -593
  87. package/.history/src/utils/indexedDB_20260306151301.js +0 -586
  88. package/.idea/codeStyles/Project.xml +0 -62
  89. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  90. 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) {