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.
- package/package.json +1 -1
- package/src/assets/img/paymentMethod/icon1.png +0 -0
- package/src/assets/img/paymentMethod/icon2.png +0 -0
- package/src/assets/img/paymentMethod/icon3.png +0 -0
- package/src/assets/img/paymentMethod/icon4.png +0 -0
- package/src/assets/img/paymentMethod/icon5.png +0 -0
- package/src/assets/img/paymentMethod/icon6.png +0 -0
- package/src/assets/svg/female.svg +1 -0
- package/src/assets/svg/male.svg +1 -0
- package/src/base-client/components/common/HIS/HButtons/HButtons.vue +10 -1
- package/src/base-client/components/common/HIS/HForm/HForm.vue +9 -0
- package/src/base-client/components/common/HIS/HFormTable/HFormTable.vue +124 -2
- package/src/base-client/components/common/HIS/HTab/HTab.vue +120 -31
- package/src/base-client/components/common/XReport/XReportHospitalizationDemo.vue +45 -0
- package/src/base-client/components/common/XTab/XTab.vue +4 -0
- package/src/base-client/components/his/XCharge/testConfig.js +149 -0
- package/src/base-client/components/his/XList/XList.vue +237 -15
- package/src/base-client/components/his/XTitle/XTitle.vue +46 -2
- package/src/pages/WorkflowDetail/WorkFlowDemo3.vue +203 -225
- package/src/router/async/router.map.js +4 -1
- package/src/services/api/common.js +0 -2
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926145434.vue +0 -641
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926145453.vue +0 -641
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926145610.vue +0 -647
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926145629.vue +0 -647
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926145901.vue +0 -645
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926145907.vue +0 -651
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926145920.vue +0 -651
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926150047.vue +0 -651
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926151820.vue +0 -646
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926151827.vue +0 -646
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926152115.vue +0 -646
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926152212.vue +0 -653
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926152215.vue +0 -653
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926152337.vue +0 -657
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926152341.vue +0 -657
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926152826.vue +0 -657
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926152828.vue +0 -646
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926153121.vue +0 -654
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926153242.vue +0 -654
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926153318.vue +0 -646
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926153415.vue +0 -646
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926153435.vue +0 -655
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926153606.vue +0 -655
- package/.history/src/base-client/components/common/XDataCard/XDataCard_20250926153653.vue +0 -655
- package/src/base-client/components/common/XDataCard/test.vue +0 -367
package/package.json
CHANGED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -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:
|
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
|
-
|
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
|
1
|
+
<script setup>
|
2
2
|
import XTab from '@vue2-client/base-client/components/common/XTab/XTab.vue'
|
3
|
-
import { ref } from 'vue'
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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="
|
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-
|
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-
|
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-
|
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-
|
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-
|
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
|
+
}
|