vue2-client 1.22.2 → 1.22.3

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 (170) hide show
  1. package/.claude/settings.local.json +30 -30
  2. package/.env.his +19 -19
  3. package/.eslintrc.js +74 -74
  4. package/.history/.eslintrc_20260521171150.js +74 -0
  5. package/.history/.eslintrc_20260521171213.js +74 -0
  6. package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154443.vue +726 -0
  7. package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154700.vue +478 -0
  8. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260512175435.vue +706 -0
  9. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260512175450.vue +694 -0
  10. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260611152602.vue +755 -0
  11. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513145941.vue +524 -0
  12. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513153133.vue +731 -0
  13. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513160316.vue +525 -0
  14. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260601144150.vue +1046 -0
  15. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310142713.vue +512 -0
  16. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310145118.vue +511 -0
  17. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260311094834.vue +696 -0
  18. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260320143028.vue +693 -0
  19. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260409101450.vue +677 -0
  20. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260508164645.vue +758 -0
  21. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260508164714.vue +693 -0
  22. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260508171651.vue +716 -0
  23. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260509133717.vue +695 -0
  24. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260509171115.vue +664 -0
  25. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513140637.vue +1455 -0
  26. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513140935.vue +1441 -0
  27. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513150818.vue +1441 -0
  28. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513153119.vue +1442 -0
  29. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513153126.vue +1486 -0
  30. package/.history/src/base-client/components/common/XForm/XFormItem_20260513140854.vue +1607 -0
  31. package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140403.vue +643 -0
  32. package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140829.vue +628 -0
  33. package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519142824.vue +104 -0
  34. package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519143155.vue +102 -0
  35. package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171231.vue +1241 -0
  36. package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171441.vue +1223 -0
  37. package/.history/src/base-client/components/his/HAi/HAi_20260612174826.vue +472 -0
  38. package/.history/src/base-client/components/his/HAi/HAi_20260612175839.vue +538 -0
  39. package/.history/src/base-client/components/his/HAi/HAi_20260615103331.vue +650 -0
  40. package/.history/src/base-client/components/his/XHDescriptions/XHDescriptions_20260424134504.vue +1469 -0
  41. package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171133.vue +788 -0
  42. package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171151.vue +780 -0
  43. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511170841.vue +585 -0
  44. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511171138.vue +787 -0
  45. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260512141830.vue +739 -0
  46. package/.history/src/components/STable/index_20260409155138.js +806 -0
  47. package/.history/src/components/STable/index_20260409155218.js +814 -0
  48. package/.history/src/expression/core/Expression_20260305164427.js +1371 -0
  49. package/.history/src/expression/core/Expression_20260305170258.js +1358 -0
  50. package/.history/src/expression/core/Program_20260305111830.js +944 -0
  51. package/.history/src/expression/core/Program_20260305112041.js +931 -0
  52. package/.history/src/logic/LogicRunner_20260304154306.js +170 -0
  53. package/.history/src/logic/LogicRunner_20260304155553.js +112 -0
  54. package/.history/src/logic/LogicRunner_20260305105834.js +112 -0
  55. package/.history/src/logic/LogicRunner_20260305112718.js +129 -0
  56. package/.history/src/logic/LogicRunner_20260305182436.js +133 -0
  57. package/.history/src/logic/LogicRunner_20260306151301.js +213 -0
  58. package/.history/src/logic/LogicRunner_20260306152419.js +213 -0
  59. package/.history/src/logic/plugins/common/DateTools_20260305154159.js +61 -0
  60. package/.history/src/logic/plugins/common/DateTools_20260305154217.js +44 -0
  61. package/.history/src/logic/plugins/common/DateTools_20260305161014.js +44 -0
  62. package/.history/src/logic/plugins/common/HttpTools_20260305164352.js +80 -0
  63. package/.history/src/logic/plugins/common/HttpTools_20260305170258.js +75 -0
  64. package/.history/src/logic/plugins/common/HttpTools_20260305171634.js +75 -0
  65. package/.history/src/logic/plugins/common/HttpTools_20260306152419.js +72 -0
  66. package/.history/src/services/api/restTools_20260427142149.js +245 -0
  67. package/.history/src/services/api/restTools_20260427142853.js +230 -0
  68. package/.history/src/services/api/restTools_20260519135558.js +230 -0
  69. package/.history/src/services/api/restTools_20260519140825.js +230 -0
  70. package/.history/src/services/api/restTools_20260519151223.js +230 -0
  71. package/.history/src/utils/indexedDB_20260306150918.js +593 -0
  72. package/.history/src/utils/indexedDB_20260306151301.js +586 -0
  73. package/.idea/af-vue2-client.iml +9 -0
  74. package/.idea/codeStyles/Project.xml +62 -0
  75. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  76. package/.idea/misc.xml +6 -0
  77. package/.idea/modules.xml +1 -1
  78. package/Components.md +60 -60
  79. package/index.js +31 -31
  80. package/jest-transform-stub.js +8 -8
  81. package/jest.setup.js +7 -7
  82. package/package.json +1 -1
  83. package/preview-input-box.html +180 -0
  84. package/src/assets/img/querySlotDemo.svg +15 -15
  85. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  86. package/src/base-client/components/common/CitySelect/index.js +3 -3
  87. package/src/base-client/components/common/CitySelect/index.md +109 -109
  88. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  89. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  90. package/src/base-client/components/common/HIS/HButtons/HButtons.vue +55 -1
  91. package/src/base-client/components/common/HIS/HForm/HForm.vue +1186 -1186
  92. package/src/base-client/components/common/HIS/HTab/HTab.vue +88 -1
  93. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  94. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  95. package/src/base-client/components/common/Tree/index.js +2 -2
  96. package/src/base-client/components/common/Upload/index.js +3 -3
  97. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  98. package/src/base-client/components/common/XAddReport/XAddReport.vue +16 -1
  99. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  100. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  101. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  102. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  103. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  104. package/src/base-client/components/common/XDescriptions/index.md +382 -382
  105. package/src/base-client/components/common/XForm/index.md +178 -178
  106. package/src/base-client/components/common/XInput/XInput.vue +32 -1
  107. package/src/base-client/components/common/XInspectionDetailDrawer/index.vue +1 -1
  108. package/src/base-client/components/common/XMarkdownViewer/demo.vue +102 -102
  109. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  110. package/src/base-client/components/common/XStepView/index.js +3 -3
  111. package/src/base-client/components/common/XStepView/index.md +31 -31
  112. package/src/base-client/components/common/XTable/index.md +255 -255
  113. package/src/base-client/components/his/HAi/HAi.vue +1177 -436
  114. package/src/base-client/components/his/XList/XList.vue +337 -58
  115. package/src/base-client/components/his/XSidebar/XSidebar.vue +36 -12
  116. package/src/base-client/components/his/XTransfer/index.md +327 -327
  117. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  118. package/src/base-client/plugins/Config.js +19 -19
  119. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  120. package/src/components/Charts/Bar.vue +62 -62
  121. package/src/components/Charts/ChartCard.vue +134 -134
  122. package/src/components/Charts/Liquid.vue +67 -67
  123. package/src/components/Charts/MiniArea.vue +39 -39
  124. package/src/components/Charts/MiniBar.vue +39 -39
  125. package/src/components/Charts/MiniProgress.vue +75 -75
  126. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  127. package/src/components/Charts/Radar.vue +68 -68
  128. package/src/components/Charts/RankList.vue +77 -77
  129. package/src/components/Charts/TagCloud.vue +113 -113
  130. package/src/components/Charts/TransferBar.vue +64 -64
  131. package/src/components/Charts/Trend.vue +82 -82
  132. package/src/components/Charts/chart.less +12 -12
  133. package/src/components/Charts/smooth.area.less +13 -13
  134. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  135. package/src/components/NumberInfo/index.js +3 -3
  136. package/src/components/NumberInfo/index.less +54 -54
  137. package/src/components/NumberInfo/index.md +43 -43
  138. package/src/components/STable/index.js +953 -953
  139. package/src/components/card/ChartCard.vue +79 -79
  140. package/src/components/chart/Bar.vue +60 -60
  141. package/src/components/chart/MiniArea.vue +67 -67
  142. package/src/components/chart/MiniBar.vue +59 -59
  143. package/src/components/chart/MiniProgress.vue +57 -57
  144. package/src/components/chart/Radar.vue +80 -80
  145. package/src/components/chart/RankingList.vue +60 -60
  146. package/src/components/chart/Trend.vue +79 -79
  147. package/src/components/chart/index.less +9 -9
  148. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  149. package/src/components/input/IInput.vue +66 -66
  150. package/src/components/menu/SideMenu.vue +75 -75
  151. package/src/components/menu/menu.js +273 -273
  152. package/src/components/tool/AStepItem.vue +60 -60
  153. package/src/layouts/CommonLayout.vue +56 -56
  154. package/src/lib.js +1 -1
  155. package/src/mock/extend/index.js +84 -84
  156. package/src/mock/goods/index.js +108 -108
  157. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  158. package/src/pages/system/dictionary/index.vue +44 -44
  159. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  160. package/src/pages/system/monitor/operLog/index.vue +37 -37
  161. package/src/services/api/cas.js +79 -79
  162. package/src/store/modules/setting.js +119 -119
  163. package/src/utils/errorCode.js +6 -6
  164. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
  165. package/.idea/MarsCodeWorkspaceAppSettings.xml +0 -7
  166. package/.idea/google-java-format.xml +0 -6
  167. package/.idea/inspectionProfiles/Project_Default.xml +0 -24
  168. package/.idea/jsLinters/eslint.xml +0 -6
  169. package/.idea/vue2-client.iml +0 -12
  170. package/.vscode/settings.json +0 -28
@@ -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
+ ```