vue2-client 1.16.49 → 1.16.52

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 (46) hide show
  1. package/package.json +1 -1
  2. package/src/assets/img/paymentMethod/icon1.png +0 -0
  3. package/src/assets/img/paymentMethod/icon2.png +0 -0
  4. package/src/assets/img/paymentMethod/icon3.png +0 -0
  5. package/src/assets/img/paymentMethod/icon4.png +0 -0
  6. package/src/assets/img/paymentMethod/icon5.png +0 -0
  7. package/src/assets/img/paymentMethod/icon6.png +0 -0
  8. package/src/assets/svg/female.svg +1 -0
  9. package/src/assets/svg/male.svg +1 -0
  10. package/src/base-client/components/common/HIS/HButtons/HButtons.vue +10 -1
  11. package/src/base-client/components/common/HIS/HForm/HForm.vue +9 -0
  12. package/src/base-client/components/common/HIS/HFormTable/HFormTable.vue +124 -2
  13. package/src/base-client/components/common/HIS/HTab/HTab.vue +120 -31
  14. package/src/base-client/components/common/XReport/XReportHospitalizationDemo.vue +45 -0
  15. package/src/base-client/components/common/XTab/XTab.vue +4 -0
  16. package/src/base-client/components/his/XCharge/testConfig.js +149 -0
  17. package/src/base-client/components/his/XList/XList.vue +237 -15
  18. package/src/base-client/components/his/XTitle/XTitle.vue +46 -2
  19. package/src/pages/WorkflowDetail/WorkFlowDemo3.vue +203 -225
  20. package/src/router/async/router.map.js +4 -1
  21. package/src/services/api/common.js +0 -2
  22. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926145434.vue +0 -641
  23. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926145453.vue +0 -641
  24. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926145610.vue +0 -647
  25. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926145629.vue +0 -647
  26. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926145901.vue +0 -645
  27. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926145907.vue +0 -651
  28. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926145920.vue +0 -651
  29. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926150047.vue +0 -651
  30. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926151820.vue +0 -646
  31. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926151827.vue +0 -646
  32. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926152115.vue +0 -646
  33. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926152212.vue +0 -653
  34. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926152215.vue +0 -653
  35. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926152337.vue +0 -657
  36. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926152341.vue +0 -657
  37. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926152826.vue +0 -657
  38. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926152828.vue +0 -646
  39. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926153121.vue +0 -654
  40. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926153242.vue +0 -654
  41. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926153318.vue +0 -646
  42. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926153415.vue +0 -646
  43. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926153435.vue +0 -655
  44. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926153606.vue +0 -655
  45. package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926153653.vue +0 -655
  46. package/src/base-client/components/common/XDataCard/test.vue +0 -367
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue2-client",
3
- "version": "1.16.49",
3
+ "version": "1.16.52",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint",
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="32" height="32" viewBox="0 0 32 32"><g><path d="M16,6.193552C12.580641,6.193552,9.8064489,8.9677448,9.8064489,12.387104C9.8064489,15.806449,12.580641,18.580641,16,18.580641C19.419361,18.580641,22.193602,15.806449,22.193602,12.387104C22.193602,8.9677448,19.419361,6.193552,16,6.193552C16,6.193552,16,6.193552,16,6.193552ZM16,15.483871C14.29032,15.483871,12.903233,14.096769,12.903233,12.387104C12.903233,10.677424,14.29032,9.2903204,16,9.2903204C17.7096,9.2903204,19.096802,10.677424,19.096802,12.387104C19.096802,14.096769,17.7096,15.483871,16,15.483871C16,15.483871,16,15.483871,16,15.483871ZM16,0C7.1612964,0,0,7.1612964,0,16C0,24.838722,7.1612964,32,16,32C24.838722,32,32,24.838722,32,16C32,7.1612964,24.838722,0,16,0C16,0,16,0,16,0ZM16,28.903204C12.793552,28.903204,9.8645124,27.722561,7.6064487,25.78064C8.5677443,24.296803,10.212896,23.290403,12.096769,23.232321C13.438704,23.645123,14.716129,23.851683,16,23.851683C17.28384,23.851683,18.561281,23.65168,19.903202,23.232321C21.787041,23.296803,23.43232,24.296803,24.3936,25.78064C22.135521,27.722561,19.206402,28.903204,16,28.903204C16,28.903204,16,28.903204,16,28.903204C16,28.903204,16,28.903204,16,28.903204ZM26.496801,23.47744C24.922562,21.451681,22.490402,20.128962,19.716162,20.128962C19.058081,20.128962,18.038723,20.748322,16,20.748322C13.967746,20.748322,12.941936,20.128962,12.283874,20.128962C9.5161285,20.128962,7.0838728,21.451681,5.5032325,23.47744C3.9935522,21.367682,3.0967681,18.787043,3.0967681,16C3.0967681,8.883873,8.883873,3.0967681,16,3.0967681C23.116163,3.0967681,28.903204,8.883873,28.903204,16C28.903204,18.787043,28.006401,21.367682,26.496801,23.47744C26.496801,23.47744,26.496801,23.47744,26.496801,23.47744Z" fill="#D15DFF" fill-opacity="1"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="32" height="32" viewBox="0 0 32 32"><g><path d="M16,6.193552C12.580641,6.193552,9.8064489,8.9677448,9.8064489,12.387104C9.8064489,15.806449,12.580641,18.580641,16,18.580641C19.419361,18.580641,22.193602,15.806449,22.193602,12.387104C22.193602,8.9677448,19.419361,6.193552,16,6.193552C16,6.193552,16,6.193552,16,6.193552ZM16,15.483871C14.29032,15.483871,12.903233,14.096769,12.903233,12.387104C12.903233,10.677424,14.29032,9.2903204,16,9.2903204C17.7096,9.2903204,19.096802,10.677424,19.096802,12.387104C19.096802,14.096769,17.7096,15.483871,16,15.483871C16,15.483871,16,15.483871,16,15.483871ZM16,0C7.1612964,0,0,7.1612964,0,16C0,24.838722,7.1612964,32,16,32C24.838722,32,32,24.838722,32,16C32,7.1612964,24.838722,0,16,0C16,0,16,0,16,0ZM16,28.903204C12.793552,28.903204,9.8645124,27.722561,7.6064487,25.78064C8.5677443,24.296803,10.212896,23.290403,12.096769,23.232321C13.438704,23.645123,14.716129,23.851683,16,23.851683C17.28384,23.851683,18.561281,23.65168,19.903202,23.232321C21.787041,23.296803,23.43232,24.296803,24.3936,25.78064C22.135521,27.722561,19.206402,28.903204,16,28.903204C16,28.903204,16,28.903204,16,28.903204C16,28.903204,16,28.903204,16,28.903204ZM26.496801,23.47744C24.922562,21.451681,22.490402,20.128962,19.716162,20.128962C19.058081,20.128962,18.038723,20.748322,16,20.748322C13.967746,20.748322,12.941936,20.128962,12.283874,20.128962C9.5161285,20.128962,7.0838728,21.451681,5.5032325,23.47744C3.9935522,21.367682,3.0967681,18.787043,3.0967681,16C3.0967681,8.883873,8.883873,3.0967681,16,3.0967681C23.116163,3.0967681,28.903204,8.883873,28.903204,16C28.903204,18.787043,28.006401,21.367682,26.496801,23.47744C26.496801,23.47744,26.496801,23.47744,26.496801,23.47744Z" fill="#0057FE" fill-opacity="1"/></g></svg>
@@ -307,7 +307,7 @@ defineExpose({
307
307
  // 居中样式 用于门诊收费左侧按钮样式(三个按钮居中样式)
308
308
  &.h-buttons-out-button {
309
309
  :deep(.x-buttons) {
310
- margin-top: -1vw;
310
+ margin-top: 0vw;
311
311
  display: flex;
312
312
  justify-content: center;
313
313
  .ant-btn-group {
@@ -367,5 +367,14 @@ defineExpose({
367
367
  }
368
368
  }
369
369
  }
370
+ // 与表单项内联使用时的垂直居中对齐样式
371
+ &.h-buttons-form-inline {
372
+ :deep(.ant-btn-group){
373
+ height: 45px;
374
+ display: flex;
375
+ align-items: center;
376
+ }
377
+ }
378
+
370
379
  }
371
380
  </style>
@@ -14,6 +14,7 @@ const wrapperClassObject = computed(() => {
14
14
  'query-conditions',
15
15
  'padding-50',
16
16
  'label-text-horizontal',
17
+ 'item-control-width90%',
17
18
  'label-text-justify'
18
19
  ]
19
20
  for (const key of booleanStyleKeys) {
@@ -150,5 +151,13 @@ defineExpose({
150
151
  }
151
152
  }
152
153
  }
154
+
155
+ /**表单项90%宽度 */
156
+ &.h-form-item-control-width90 {
157
+ :deep(.ant-form-item-control){
158
+ width: 90%;
159
+ }
160
+ }
161
+
153
162
  }
154
163
  </style>
@@ -1,6 +1,6 @@
1
1
  <script setup>
2
2
  import XFormTable from '@vue2-client/base-client/components/common/XFormTable/XFormTable.vue'
3
- import { ref, computed, useAttrs } from 'vue'
3
+ import { ref, computed, useAttrs, nextTick } from 'vue'
4
4
 
5
5
  const props = defineProps({
6
6
  // HFormTable特有的属性
@@ -41,6 +41,115 @@ const wrapperClassObject = computed(() => {
41
41
  // 创建对XFormTable组件的引用
42
42
  const xFormTableRef = ref()
43
43
 
44
+ // 使用 MutationObserver 监听展开行高度变化,实时同步固定列
45
+ let observer = null
46
+ const setupHeightSync = () => {
47
+ try {
48
+ const wrapper = document.querySelector('.h-form-table-wrapper')
49
+ if (!wrapper || observer) return
50
+
51
+ observer = new MutationObserver((mutations) => {
52
+ // 只在展开行相关变化时同步,避免不必要的计算
53
+ const hasRelevantChange = mutations.some(mutation =>
54
+ mutation.type === 'attributes' &&
55
+ (mutation.attributeName === 'style' || mutation.attributeName === 'class') ||
56
+ mutation.type === 'childList'
57
+ )
58
+ if (hasRelevantChange) {
59
+ syncFixedExpandedHeights()
60
+ }
61
+ })
62
+
63
+ // 监听主表展开行的属性变化
64
+ const mainTable = wrapper.querySelector('.ant-table-body > table > tbody')
65
+ if (mainTable) {
66
+ observer.observe(mainTable, {
67
+ childList: true,
68
+ subtree: true,
69
+ attributes: true,
70
+ attributeFilter: ['style', 'class']
71
+ })
72
+ }
73
+ } catch (e) {
74
+ console.warn('[HFormTable] setupHeightSync error:', e)
75
+ }
76
+ }
77
+
78
+ // 同步固定列中的"展开行"高度到主表展开行高度,避免错位
79
+ const syncFixedExpandedHeights = () => {
80
+ try {
81
+ const wrapper = document.querySelector('.h-form-table-wrapper')
82
+ if (!wrapper) return
83
+ const mainRows = Array.from(wrapper.querySelectorAll('.ant-table-body > table > tbody > tr'))
84
+ const fixedRows = Array.from(wrapper.querySelectorAll('.ant-table-fixed-right .ant-table-body-inner > table > tbody > tr'))
85
+ const len = Math.min(mainRows.length, fixedRows.length)
86
+
87
+ for (let i = 0; i < len; i++) {
88
+ const m = mainRows[i]
89
+ const f = fixedRows[i]
90
+ if (!f) continue
91
+
92
+ if (m.classList.contains('ant-table-expanded-row')) {
93
+ const h = m.clientHeight
94
+ // 缓存高度,避免重复设置
95
+ if (f.dataset.syncedHeight === h.toString()) continue
96
+ f.dataset.syncedHeight = h.toString()
97
+
98
+ // 强制同步高度,使用 !important 覆盖其他样式
99
+ f.style.setProperty('height', h + 'px', 'important')
100
+ f.style.setProperty('min-height', h + 'px', 'important')
101
+ f.style.setProperty('max-height', h + 'px', 'important')
102
+
103
+ // 同步单元格高度,确保完全一致
104
+ const tds = f.querySelectorAll('td')
105
+ tds.forEach(td => {
106
+ td.style.setProperty('height', h + 'px', 'important')
107
+ td.style.setProperty('min-height', h + 'px', 'important')
108
+ td.style.setProperty('max-height', h + 'px', 'important')
109
+ td.style.setProperty('padding', '0', 'important')
110
+ td.style.setProperty('border', 'none', 'important')
111
+ })
112
+ } else {
113
+ // 清理非展开行的内联样式和缓存
114
+ if (f.dataset.syncedHeight) {
115
+ f.removeAttribute('data-synced-height')
116
+ f.style.removeProperty('height')
117
+ f.style.removeProperty('min-height')
118
+ f.style.removeProperty('max-height')
119
+ const tds = f.querySelectorAll('td')
120
+ tds.forEach(td => {
121
+ td.style.removeProperty('height')
122
+ td.style.removeProperty('min-height')
123
+ td.style.removeProperty('max-height')
124
+ td.style.removeProperty('padding')
125
+ td.style.removeProperty('border')
126
+ })
127
+ }
128
+ }
129
+ }
130
+ } catch (e) {
131
+ console.warn('[HFormTable] syncFixedExpandedHeights error:', e)
132
+ }
133
+ }
134
+
135
+ const onExpandLog = (expanded, record) => {
136
+ // 等DOM完成再测量
137
+ nextTick(() => {
138
+ // 设置实时监听(如果还没设置)
139
+ if (!observer) {
140
+ setupHeightSync()
141
+ }
142
+
143
+ // 立即同步一次(避免第一次展开时错位)
144
+ syncFixedExpandedHeights()
145
+
146
+ // 短延迟再同步一次(应对异步渲染)
147
+ setTimeout(() => {
148
+ syncFixedExpandedHeights()
149
+ }, 20)
150
+ })
151
+ }
152
+
44
153
  // 暴露方法给父组件使用
45
154
  defineExpose({
46
155
  // 为了兼容性,保留getXFormTableInstance方法
@@ -67,6 +176,7 @@ const isCustomPagination = computed(() => {
67
176
  ref="xFormTableRef"
68
177
  v-bind="$attrs"
69
178
  :customPagination="isCustomPagination"
179
+ @expand="onExpandLog"
70
180
  v-on="$listeners"
71
181
  >
72
182
  <template v-for="(_, name) in $slots" #[name]="slotData">
@@ -152,12 +262,24 @@ const isCustomPagination = computed(() => {
152
262
  .ant-table-content {
153
263
  .ant-table-body {
154
264
  border-radius: 0 0 4px 4px;
155
- overflow: visible !important;
265
+ // 修复展开行后固定列与主体错位:保持表体滚动容器为自动滚动
266
+ overflow: auto !important;
156
267
  }
157
268
  }
158
269
  }
159
270
  }
160
271
  }
272
+ // 移除之前隐藏固定列占位行的样式,保持与主体行数一致
273
+ // 展开行单元格去除额外内边距,避免高度不一致
274
+ :deep(.ant-table-expanded-row > td) {
275
+ padding: 0 !important;
276
+ }
277
+ // 展开内容中的表单/控件去掉外边距,避免撑高
278
+ :deep(.ant-table-expanded-row .ant-form-item) {
279
+ margin-bottom: 0 !important;
280
+ }
281
+
282
+ // 移除之前的隐藏固定列样式,避免展开/合并后操作列消失
161
283
  &.h-form-table-dialog-style {
162
284
  /* 选择前面的兄弟元素 */
163
285
  :global(.ant-col.ant-col-24[name="trGroup"]:has(+ .ant-card .ant-card-body .h-form-table-wrapper.h-form-table-dialog-style)) {
@@ -1,32 +1,80 @@
1
- <script setup lang="ts">
1
+ <script setup>
2
2
  import XTab from '@vue2-client/base-client/components/common/XTab/XTab.vue'
3
- import { ref } from 'vue'
4
-
5
- defineProps({
6
- // HTab特有的属性
7
- hasTopMargin: {
8
- type: Boolean,
9
- default: true
10
- },
11
- // 是否启用 style7 样式(细下划线、自适应)
12
- useStyle7: {
13
- type: Boolean,
14
- default: false
15
- },
16
- // 是否叠加圆点样式(仅在 useStyle7 true 时生效)
17
- useCycle: {
18
- type: Boolean,
19
- default: false
20
- },
21
- useStyle8: {
22
- type: Boolean,
23
- default: false
3
+ import { ref, computed, useAttrs, useSlots, watch, onMounted } from 'vue'
4
+ import { getConfigByName } from '@vue2-client/services/api/common'
5
+
6
+ const props = defineProps({
7
+ // 标签栏右侧附加区域的配置名(可选)。提供时将自动加载配置并渲染到 tabBar 右侧。
8
+ tabBarExtraConfig: {
9
+ type: String,
10
+ default: undefined
11
+ }
12
+ })
13
+
14
+ // 兼容多种样式配置
15
+ const attrs = useAttrs()
16
+ const wrapperClassObject = computed(() => {
17
+ const a = attrs
18
+ const classes = {}
19
+
20
+ // 通用布尔样式开关(以存在/空字符串/'true' 为真)
21
+ const booleanStyleKeys = [
22
+ 'hasTopMargin', 'useStyle7', 'useCycle', 'useStyle8'
23
+ ]
24
+ for (const key of booleanStyleKeys) {
25
+ const val = a[key]
26
+ const truthy = val === true || val === '' || val === 'true'
27
+ if (truthy) classes[`h-tab-${key}`] = true
24
28
  }
29
+ return classes
25
30
  })
26
31
 
27
32
  // 创建对XTab组件的引用
28
33
  const xTabRef = ref()
29
34
 
35
+ // 获取插槽(避免模板中直接使用 $slots 触发类型检查错误)
36
+ const slots = useSlots()
37
+ const slotNames = computed(() => {
38
+ try {
39
+ return Object.keys(slots || {})
40
+ } catch (e) {
41
+ return []
42
+ }
43
+ })
44
+
45
+ // 右侧附加区域的动态配置
46
+ const extraConfig = ref(null)
47
+ const extraItems = computed(() => {
48
+ const cfg = extraConfig.value
49
+ return cfg && cfg.value ? cfg.value : []
50
+ })
51
+
52
+ // 本地异步组件映射(未全局注册时生效)
53
+ const localMap = {
54
+ 'x-input': () => import('@vue2-client/base-client/components/common/XInput/XInput.vue'),
55
+ 'x-select': () => import('@vue2-client/base-client/components/his/XSelect/XSelect.vue'),
56
+ 'x-radio': () => import('@vue2-client/base-client/components/his/XRadio/XRadio.vue'),
57
+ 'x-buttons': () => import('@vue2-client/base-client/components/common/XButtons/XButtons.vue'),
58
+ 'h-buttons': () => import('@vue2-client/base-client/components/common/HIS/HButtons/HButtons.vue')
59
+ }
60
+
61
+ // 从 attrs 中读取 serverName 与 env(保持向后兼容)
62
+ const serverName = computed(() => (attrs && attrs.serverName))
63
+ const env = computed(() => (attrs && attrs.env) || 'prod')
64
+
65
+ const loadExtraConfig = (configName) => {
66
+ if (!configName) {
67
+ extraConfig.value = null
68
+ return
69
+ }
70
+ getConfigByName(configName, serverName.value, (res) => {
71
+ extraConfig.value = res
72
+ }, env.value === 'dev')
73
+ }
74
+
75
+ onMounted(() => loadExtraConfig(props.tabBarExtraConfig))
76
+ watch(() => props.tabBarExtraConfig, loadExtraConfig)
77
+
30
78
  // 暴露方法给父组件使用
31
79
  defineExpose({
32
80
  // 为了兼容性,保留getXTabInstance方法
@@ -37,16 +85,32 @@ defineExpose({
37
85
  <template>
38
86
  <div
39
87
  class="h-tab-wrapper"
40
- :class="{ 'h-tab-has-top-margin': hasTopMargin,
41
- 'h-tab-style7': useStyle7,
42
- 'h-tab-cycle': useStyle7 && useCycle,
43
- 'h-tab-style8': useStyle8}">
88
+ :class="[wrapperClassObject, extraItems.length > 1 ? 'h-tab-extra-wrapper-multiple' : '']">
44
89
  <x-tab
45
90
  ref="xTabRef"
46
91
  v-bind="$attrs"
47
92
  v-on="$listeners"
48
93
  >
49
- <template v-for="(_, name) in $slots" #[name]="slotData">
94
+ <template v-if="extraItems.length" #tabBarExtraContent>
95
+ <!-- 父级可接管渲染;未提供则按配置兜底渲染 -->
96
+ <slot name="tabBarExtraContent" :config="extraConfig" :items="extraItems">
97
+ <div class="h-tab-extra-wrapper">
98
+ <component
99
+ v-for="(item, idx) in extraItems"
100
+ :is="localMap[item.slotType] || item.slotType"
101
+ :key="idx"
102
+ :ref="item.slotRef || `extra_${idx}`"
103
+ :serviceName="item.serviceName || serverName"
104
+ :serverName="item.serviceName || serverName"
105
+ :queryParamsName="item.slotConfig"
106
+ :env="env"
107
+ v-on="$listeners"
108
+ v-bind="item.attrs"
109
+ />
110
+ </div>
111
+ </slot>
112
+ </template>
113
+ <template v-for="name in slotNames" #[name]="slotData">
50
114
  <slot :name="name" v-bind="slotData" />
51
115
  </template>
52
116
  </x-tab>
@@ -109,7 +173,7 @@ defineExpose({
109
173
  }
110
174
 
111
175
  // 带顶部边距的样式
112
- &.h-tab-has-top-margin {
176
+ &.h-tab-hasTopMargin {
113
177
  :deep(.ant-tabs-nav) {
114
178
  margin-top: 6px;
115
179
  }
@@ -128,7 +192,7 @@ defineExpose({
128
192
  }
129
193
 
130
194
  // 通用样式7:细下划线、透明背景、可配置宽度
131
- &.h-tab-style7 {
195
+ &.h-tab-useStyle7 {
132
196
  :deep(.ant-tabs-tab-next),
133
197
  :deep(.ant-tabs-tab-prev-icon-target),
134
198
  :deep(.ant-tabs-tab-next-icon) { display: none; }
@@ -177,7 +241,7 @@ defineExpose({
177
241
  }
178
242
 
179
243
  // 可选:标签左侧圆点
180
- &.h-tab-cycle {
244
+ &.h-tab-useCycle {
181
245
  :deep(.ant-tabs-tab) {
182
246
  position: relative;
183
247
  padding-left: 18px !important;
@@ -209,7 +273,7 @@ defineExpose({
209
273
  }
210
274
  }
211
275
  // 用户词条使用样式
212
- &.h-tab-style8 {
276
+ &.h-tab-useStyle8 {
213
277
  :deep(.ant-tabs-tab-next),
214
278
  :deep(.ant-tabs-tab-prev-icon-target),
215
279
  :deep(.ant-tabs-tab-next-icon) { display: none; }
@@ -289,5 +353,30 @@ defineExpose({
289
353
  display: none; // 隐藏下划线
290
354
  }
291
355
  }
356
+ &.h-tab-extra-wrapper-multiple {
357
+ :deep(.h-tab-extra-wrapper){
358
+ display: flex;
359
+ justify-content: end;
360
+ gap: 8px;
361
+ }
362
+ :deep(.x-radio-group){
363
+ height: 32px;
364
+ }
365
+ :deep(.x-radio-item){
366
+ height: 32px;
367
+ display: flex;
368
+ align-items: center;
369
+ margin-bottom: 0px;
370
+ }
371
+ :deep(.ant-tabs-tab){
372
+ height: 34px;
373
+ }
374
+ :deep(.ant-tabs-nav-container){
375
+ padding-top: 2px;
376
+ }
377
+ :deep(.ant-tabs-extra-content){
378
+ line-height: 0px !important;
379
+ }
380
+ }
292
381
  }
293
382
  </style>
@@ -0,0 +1,45 @@
1
+ <template>
2
+ <div id="xreport-hosp-demo">
3
+ <a-space style="margin-bottom: 12px;">
4
+ <a-button type="primary" @click="doInit">手动初始化</a-button>
5
+ </a-space>
6
+ <XReport
7
+ ref="reportRef"
8
+ :edit-mode="true"
9
+ :show-save-button="true"
10
+ :show-img-in-cell="false"
11
+ :use-oss-for-img="false"
12
+ server-name="af-his"
13
+ @updateImg="onUpdateImg"/>
14
+ </div>
15
+ </template>
16
+
17
+ <script setup>
18
+ import { ref } from 'vue'
19
+ import XReport from '@vue2-client/base-client/components/common/XReport'
20
+
21
+ const reportRef = ref(null)
22
+
23
+ const payload = {
24
+ arr: [
25
+ { BQ: '病房区', RY: 0, CY: 0, CW: 0, SW: 0, SS: 0, ZC: 0, ZR: 0, ZY: 0 },
26
+ { BQ: '感染科', RY: 0, CY: 0, CW: 0, SW: 0, SS: 0, ZC: 0, ZR: 0, ZY: 0 },
27
+ { BQ: '骨科病区', RY: 0, CY: 0, CW: 0, SW: 0, SS: 0, ZC: 0, ZR: 0, ZY: 0 },
28
+ { BQ: '呼吸科病区', RY: 0, CY: 0, CW: 0, SW: 0, SS: 0, ZC: 0, ZR: 0, ZY: 0 },
29
+ { BQ: '急症科病区', RY: 0, CY: 0, CW: 0, SW: 0, SS: 0, ZC: 0, ZR: 0, ZY: 0 },
30
+ { BQ: '内科二病区', RY: 0, CY: 0, CW: 0, SW: 0, SS: 0, ZC: 0, ZR: 0, ZY: 0 }
31
+ ]
32
+ }
33
+
34
+ const doInit = async () => {
35
+ if (!reportRef.value || !reportRef.value.init) return
36
+ await reportRef.value.init({
37
+ configName: 'hospitalizationStatsReport',
38
+ configData: payload
39
+ })
40
+ }
41
+
42
+ const onUpdateImg = data => {
43
+ console.warn('updateImg:', data)
44
+ }
45
+ </script>
@@ -7,6 +7,9 @@
7
7
  :hideAdd="true"
8
8
  :tabBarStyle="{ display: showTabBar ? 'block' : 'none' }"
9
9
  >
10
+ <template #tabBarExtraContent v-if="$slots.tabBarExtraContent || tabBarExtraContent">
11
+ <slot name="tabBarExtraContent"></slot>
12
+ </template>
10
13
  <slot name="extraBeforeTabs"></slot>
11
14
  <a-tab-pane
12
15
  :forceRender="true"
@@ -67,6 +70,7 @@ export default {
67
70
  activeKey: 0,
68
71
  // 配置
69
72
  config: undefined,
73
+ tabBarExtraContent: undefined,
70
74
  attr: {},
71
75
  showTabBar: true // 默认显示页签
72
76
  }
@@ -0,0 +1,149 @@
1
+ // 测试配置 - 用于演示混合支付功能
2
+ export const testChargeConfig = {
3
+ "amountFields": [
4
+ {
5
+ "field": 'f_amount',
6
+ "disabled": false,
7
+ "label": '费用总额'
8
+ },
9
+ {
10
+ "field": 'f_insurance_amount',
11
+ "disabled": true,
12
+ "label": '医保支付'
13
+ },
14
+ {
15
+ "field": 'f_self_amount',
16
+ "disabled": true,
17
+ "label": '自费金额'
18
+ },
19
+ {
20
+ "field": 'out_of_pocket_amount',
21
+ "disabled": true,
22
+ "label": '自付金额'
23
+ },
24
+ {
25
+ "field": 'biscount_amount',
26
+ "disabled": true,
27
+ "label": '折扣金额'
28
+ },
29
+ {
30
+ "field": 'billing_amount',
31
+ "disabled": true,
32
+ "label": '记账金额'
33
+ }
34
+ ],
35
+ "paymentMethods": [
36
+ {
37
+ "key": '医保卡',
38
+ "label": '医保卡'
39
+ },
40
+ {
41
+ "key": '微信/支付宝',
42
+ "label": '微信/支付宝'
43
+ },
44
+ {
45
+ "key": '银行卡',
46
+ "label": '银行卡'
47
+ },
48
+ {
49
+ "key": '现金',
50
+ "label": '现金'
51
+ }
52
+ ],
53
+ "bottomFields": [
54
+ {
55
+ "field": 'f_balance',
56
+ "label": '账户余额',
57
+ "disabled": false
58
+ },
59
+ {
60
+ "field": 'received',
61
+ "label": '实收',
62
+ "disabled": false
63
+ },
64
+ {
65
+ "field": 'change',
66
+ "label": '找零',
67
+ "disabled": false
68
+ }
69
+ ],
70
+ "actionButtons": [
71
+ {
72
+ "key": 'charge',
73
+ "label": '收费',
74
+ "icon": 'check'
75
+ },
76
+ {
77
+ "key": 'refund',
78
+ "label": '退费',
79
+ "icon": 'undo'
80
+ },
81
+ {
82
+ "key": 'print',
83
+ "label": '打印',
84
+ "icon": 'printer'
85
+ }
86
+ ],
87
+ "enableMixedPayment": true, // 启用混合支付
88
+ // 可配置事件名,参考 fronImport 风格
89
+ "eventNames": {
90
+ "method": 'method',
91
+ "methods": 'methods',
92
+ "totalPaymentAmount": 'totalPaymentAmount',
93
+ "action": 'action'
94
+ },
95
+ "dataSourceConfig": 'testChargeLogic'
96
+ }
97
+
98
+ // 单选模式测试配置
99
+ export const testSingleChargeConfig = {
100
+ "amountFields": [
101
+ {
102
+ "field": 'f_amount',
103
+ "disabled": false,
104
+ "label": '费用总额'
105
+ },
106
+ {
107
+ "field": 'f_insurance_amount',
108
+ "disabled": true,
109
+ "label": '医保支付'
110
+ }
111
+ ],
112
+ "paymentMethods": [
113
+ {
114
+ "key": '医保卡',
115
+ "label": '医保卡'
116
+ },
117
+ {
118
+ "key": '现金',
119
+ "label": '现金'
120
+ }
121
+ ],
122
+ "bottomFields": [
123
+ {
124
+ "field": 'received',
125
+ "label": '实收',
126
+ "disabled": false
127
+ },
128
+ {
129
+ "field": 'change',
130
+ "label": '找零',
131
+ "disabled": false
132
+ }
133
+ ],
134
+ "actionButtons": [
135
+ {
136
+ "key": 'charge',
137
+ "label": '收费',
138
+ "icon": 'check'
139
+ }
140
+ ],
141
+ "enableMixedPayment": false, // 禁用混合支付(单选模式)
142
+ "eventNames": {
143
+ "method": 'method',
144
+ "methods": 'methods',
145
+ "totalPaymentAmount": 'totalPaymentAmount',
146
+ "action": 'action'
147
+ },
148
+ "dataSourceConfig": 'testChargeLogic'
149
+ }