vue2-client 1.19.0 → 1.19.1
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/svg/female.svg +1 -1
- package/src/assets/svg/male.svg +1 -1
- package/src/base-client/components/common/HIS/HFormGroup/index.js +3 -3
- package/src/base-client/components/common/XCollapse/XCollapse.vue +830 -830
- package/src/base-client/components/common/XTimeline/XTimeline.vue +477 -477
- package/src/base-client/components/his/XHDescriptions/XHDescriptions.vue +1412 -1412
- package/src/base-client/components/his/XTimeSelect/XTimeSelect.vue +354 -354
- package/src/base-client/components/his/XTitle/XTitle.vue +41 -3
- package/src/base-client/components/his/threeTestOrders/editor.vue +113 -113
- package/src/pages/userInfoDetailManage/ExceptionRecordQuery/index.vue +45 -45
- package/src-base-client/components/common/HIS/HForm/HForm.vue +347 -0
- package/src-base-client/components/common/XCollapse/XCollapse.vue +0 -0
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<div class="title-content">
|
|
13
13
|
<div class="title-dot"></div>
|
|
14
14
|
<a-icon v-if="attrs.icon && !attrs.customIcon" :type="attrs.icon" class="title-icon" />
|
|
15
|
-
<XIcon v-if="attrs.customIcon" :name="attrs.customIcon" class="title-icon"
|
|
15
|
+
<XIcon v-if="attrs.customIcon" :name="attrs.customIcon" class="title-icon"/>
|
|
16
16
|
<span>{{ config.label }}</span>
|
|
17
17
|
</div>
|
|
18
18
|
<div
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
</template>
|
|
34
34
|
|
|
35
35
|
<script setup>
|
|
36
|
-
import {
|
|
36
|
+
import {ref, computed, onMounted, useAttrs} from 'vue'
|
|
37
37
|
import XIcon from '../XIcon/XIcon.vue'
|
|
38
38
|
|
|
39
39
|
const props = defineProps({
|
|
@@ -101,11 +101,36 @@ const isShowTopLine = computed(() => {
|
|
|
101
101
|
const isShowBottomLine = computed(() => {
|
|
102
102
|
return attrs.showBottomLine === 'true' || attrs.showBottomLine === true
|
|
103
103
|
})
|
|
104
|
+
// 暴露方法供外部调用,动态修改标题
|
|
105
|
+
const updateTitle = (newTitle) => {
|
|
106
|
+
if (newTitle !== undefined && newTitle !== null) {
|
|
107
|
+
config.value.label = String(newTitle)
|
|
108
|
+
config.value.type = 'title'
|
|
109
|
+
config.value.line = ''
|
|
110
|
+
config.value.color = ''
|
|
111
|
+
config.value.lineLength = ''
|
|
112
|
+
config.value.clickName = ''
|
|
113
|
+
// 强制更新(以防万一)
|
|
114
|
+
config.value = {...config.value}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// 暴露方法供外部调用,动态修改 queryParamsName
|
|
119
|
+
const updateQueryParamsName = (newParams) => {
|
|
120
|
+
parseConfig(newParams)
|
|
121
|
+
}
|
|
122
|
+
|
|
104
123
|
const handleClick = () => {
|
|
105
124
|
if (config.value.clickName) {
|
|
106
125
|
emit(config.value.clickName)
|
|
107
126
|
}
|
|
108
127
|
}
|
|
128
|
+
|
|
129
|
+
// 暴露组件方法
|
|
130
|
+
defineExpose({
|
|
131
|
+
updateTitle,
|
|
132
|
+
updateQueryParamsName
|
|
133
|
+
})
|
|
109
134
|
const parseConfig = (data) => {
|
|
110
135
|
// 如果设置了title属性,直接使用title作为标签
|
|
111
136
|
if (props.title) {
|
|
@@ -156,6 +181,7 @@ const parseConfig = (data) => {
|
|
|
156
181
|
}
|
|
157
182
|
}
|
|
158
183
|
|
|
184
|
+
|
|
159
185
|
onMounted(() => {
|
|
160
186
|
parseConfig(props.queryParamsName)
|
|
161
187
|
})
|
|
@@ -181,6 +207,7 @@ onMounted(() => {
|
|
|
181
207
|
overflow: hidden;
|
|
182
208
|
text-overflow: ellipsis;
|
|
183
209
|
}
|
|
210
|
+
|
|
184
211
|
.underline {
|
|
185
212
|
position: absolute;
|
|
186
213
|
bottom: 0;
|
|
@@ -193,6 +220,7 @@ onMounted(() => {
|
|
|
193
220
|
.x-button-container {
|
|
194
221
|
text-align: right;
|
|
195
222
|
}
|
|
223
|
+
|
|
196
224
|
.x-title-center {
|
|
197
225
|
&.x-title-container,
|
|
198
226
|
.x-title-container {
|
|
@@ -201,6 +229,7 @@ onMounted(() => {
|
|
|
201
229
|
}
|
|
202
230
|
}
|
|
203
231
|
}
|
|
232
|
+
|
|
204
233
|
.x-title-littlefont {
|
|
205
234
|
&.x-title-container,
|
|
206
235
|
.x-title-container {
|
|
@@ -239,6 +268,7 @@ onMounted(() => {
|
|
|
239
268
|
align-items: baseline;
|
|
240
269
|
}
|
|
241
270
|
}
|
|
271
|
+
|
|
242
272
|
// 顶部分割线
|
|
243
273
|
.top-line {
|
|
244
274
|
width: 100%;
|
|
@@ -248,6 +278,7 @@ onMounted(() => {
|
|
|
248
278
|
margin: 8px 0;
|
|
249
279
|
opacity: 1;
|
|
250
280
|
}
|
|
281
|
+
|
|
251
282
|
.x-title-dot,
|
|
252
283
|
.x-title-nodot {
|
|
253
284
|
&.x-title-container,
|
|
@@ -271,12 +302,14 @@ onMounted(() => {
|
|
|
271
302
|
}
|
|
272
303
|
}
|
|
273
304
|
}
|
|
305
|
+
|
|
274
306
|
.x-title-yizhu-title {
|
|
275
307
|
&.x-title-container,
|
|
276
308
|
.x-title-container {
|
|
277
309
|
margin-top: 3px;
|
|
278
310
|
margin-left: 6px;
|
|
279
311
|
margin-bottom: 7px;
|
|
312
|
+
|
|
280
313
|
:deep(.x-title) {
|
|
281
314
|
height: 26px;
|
|
282
315
|
opacity: 1;
|
|
@@ -290,10 +323,12 @@ onMounted(() => {
|
|
|
290
323
|
}
|
|
291
324
|
}
|
|
292
325
|
}
|
|
326
|
+
|
|
293
327
|
.x-title-left-title {
|
|
294
328
|
&.x-title-container,
|
|
295
329
|
.x-title-container {
|
|
296
330
|
margin: 15px auto 15px 6px;
|
|
331
|
+
|
|
297
332
|
:deep(.x-title) {
|
|
298
333
|
height: 26px;
|
|
299
334
|
opacity: 1;
|
|
@@ -304,6 +339,7 @@ onMounted(() => {
|
|
|
304
339
|
}
|
|
305
340
|
}
|
|
306
341
|
}
|
|
342
|
+
|
|
307
343
|
// nodot 样式特有部分
|
|
308
344
|
.x-title-nodot {
|
|
309
345
|
&.x-title-container,
|
|
@@ -314,12 +350,14 @@ onMounted(() => {
|
|
|
314
350
|
}
|
|
315
351
|
}
|
|
316
352
|
}
|
|
353
|
+
|
|
317
354
|
.x-title-line-style {
|
|
318
355
|
background: #0057FE;
|
|
319
356
|
height: 2px;
|
|
320
357
|
}
|
|
358
|
+
|
|
321
359
|
.x-title-compact {
|
|
322
|
-
:deep(.x-title){
|
|
360
|
+
:deep(.x-title) {
|
|
323
361
|
height: 23px;
|
|
324
362
|
opacity: 1;
|
|
325
363
|
font-family: "Source Han Sans";
|
|
@@ -1,113 +1,113 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<!-- 根据实际部署环境修改 editor.html 的路径 -->
|
|
3
|
-
<iframe
|
|
4
|
-
src="/his/editor/editor.html"
|
|
5
|
-
width="100%"
|
|
6
|
-
height="800"
|
|
7
|
-
frameborder="0"
|
|
8
|
-
@load="onIframeLoad"
|
|
9
|
-
ref="editorIframe">
|
|
10
|
-
</iframe>
|
|
11
|
-
</template>
|
|
12
|
-
|
|
13
|
-
<script setup>
|
|
14
|
-
|
|
15
|
-
import { ref, onBeforeUnmount } from 'vue'
|
|
16
|
-
|
|
17
|
-
const editorIframe = ref(null)
|
|
18
|
-
const checkEditorTimer = ref(null)
|
|
19
|
-
const checkCount = ref(0)
|
|
20
|
-
const editor = ref(null)
|
|
21
|
-
const iframeWindow = ref(null)
|
|
22
|
-
// 对外暴露的获取editor方法
|
|
23
|
-
const getEditor = () => {
|
|
24
|
-
if (editor.value) {
|
|
25
|
-
return editor.value
|
|
26
|
-
}
|
|
27
|
-
if (iframeWindow.value && iframeWindow.value.editor) {
|
|
28
|
-
editor.value = iframeWindow.value.editor
|
|
29
|
-
return editor.value
|
|
30
|
-
}
|
|
31
|
-
if (editorIframe.value && editorIframe.value.contentWindow && editorIframe.value.contentWindow.editor) {
|
|
32
|
-
editor.value = editorIframe.value.contentWindow.editor
|
|
33
|
-
return editor.value
|
|
34
|
-
}
|
|
35
|
-
return null
|
|
36
|
-
}
|
|
37
|
-
// 创建体温单方法
|
|
38
|
-
const createVitalSigns = (data) => {
|
|
39
|
-
const editorObj = getEditor()
|
|
40
|
-
if (!editorObj) {
|
|
41
|
-
throw new Error('editor对象未初始化,无法创建体温单')
|
|
42
|
-
}
|
|
43
|
-
if (typeof editorObj.createVitalSigns === 'function') {
|
|
44
|
-
return editorObj.createVitalSigns(data)
|
|
45
|
-
} else {
|
|
46
|
-
throw new Error('editor对象未包含createVitalSigns方法')
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// 检查editor对象是否已初始化
|
|
51
|
-
const startEditorCheck = (frameWindow, iframe) => {
|
|
52
|
-
if (checkEditorTimer.value) {
|
|
53
|
-
clearInterval(checkEditorTimer.value)
|
|
54
|
-
}
|
|
55
|
-
checkCount.value = 0
|
|
56
|
-
checkEditorTimer.value = setInterval(() => {
|
|
57
|
-
checkCount.value++
|
|
58
|
-
try {
|
|
59
|
-
const editorObj = frameWindow.editor
|
|
60
|
-
if (editorObj && typeof editorObj.createVitalSigns === 'function') {
|
|
61
|
-
clearInterval(checkEditorTimer.value)
|
|
62
|
-
editor.value = editorObj
|
|
63
|
-
// 将editor对象暴露到全局
|
|
64
|
-
window.iframeEditor = editorObj
|
|
65
|
-
window.iframeWindow = frameWindow
|
|
66
|
-
// 触发事件
|
|
67
|
-
emit('editor-ready', editorObj)
|
|
68
|
-
emit('load', { target: iframe, editor: editorObj })
|
|
69
|
-
// 发送消息通知
|
|
70
|
-
window.parent.postMessage({ type: 'editorReady' }, '*')
|
|
71
|
-
}
|
|
72
|
-
} catch (err) {
|
|
73
|
-
console.error('检查editor对象时出错:', err)
|
|
74
|
-
}
|
|
75
|
-
if (checkCount.value >= 20) {
|
|
76
|
-
clearInterval(checkEditorTimer.value)
|
|
77
|
-
console.error('Editor 对象加载失败')
|
|
78
|
-
}
|
|
79
|
-
}, 500)
|
|
80
|
-
}
|
|
81
|
-
// iframe加载完成的处理
|
|
82
|
-
const onIframeLoad = (e) => {
|
|
83
|
-
const iframe = e.target
|
|
84
|
-
const frameWindow = iframe.contentWindow
|
|
85
|
-
iframeWindow.value = frameWindow
|
|
86
|
-
if (!frameWindow) {
|
|
87
|
-
console.error('无法访问 iframe 内容')
|
|
88
|
-
return
|
|
89
|
-
}
|
|
90
|
-
// 关闭文书工具栏
|
|
91
|
-
iframe.contentWindow.editor.option.toolbar = false
|
|
92
|
-
startEditorCheck(frameWindow, iframe)
|
|
93
|
-
}
|
|
94
|
-
// 组件销毁前清理
|
|
95
|
-
onBeforeUnmount(() => {
|
|
96
|
-
if (checkEditorTimer.value) {
|
|
97
|
-
clearInterval(checkEditorTimer.value)
|
|
98
|
-
}
|
|
99
|
-
})
|
|
100
|
-
// 暴露方法给父组件
|
|
101
|
-
defineExpose({ getEditor, createVitalSigns })
|
|
102
|
-
|
|
103
|
-
// 定义事件
|
|
104
|
-
const emit = defineEmits(['editor-ready', 'load'])
|
|
105
|
-
</script>
|
|
106
|
-
|
|
107
|
-
<style scoped>
|
|
108
|
-
iframe {
|
|
109
|
-
border: none;
|
|
110
|
-
width: 100%;
|
|
111
|
-
min-height: 800px;
|
|
112
|
-
}
|
|
113
|
-
</style>
|
|
1
|
+
<template>
|
|
2
|
+
<!-- 根据实际部署环境修改 editor.html 的路径 -->
|
|
3
|
+
<iframe
|
|
4
|
+
src="/his/editor/editor.html"
|
|
5
|
+
width="100%"
|
|
6
|
+
height="800"
|
|
7
|
+
frameborder="0"
|
|
8
|
+
@load="onIframeLoad"
|
|
9
|
+
ref="editorIframe">
|
|
10
|
+
</iframe>
|
|
11
|
+
</template>
|
|
12
|
+
|
|
13
|
+
<script setup>
|
|
14
|
+
|
|
15
|
+
import { ref, onBeforeUnmount } from 'vue'
|
|
16
|
+
|
|
17
|
+
const editorIframe = ref(null)
|
|
18
|
+
const checkEditorTimer = ref(null)
|
|
19
|
+
const checkCount = ref(0)
|
|
20
|
+
const editor = ref(null)
|
|
21
|
+
const iframeWindow = ref(null)
|
|
22
|
+
// 对外暴露的获取editor方法
|
|
23
|
+
const getEditor = () => {
|
|
24
|
+
if (editor.value) {
|
|
25
|
+
return editor.value
|
|
26
|
+
}
|
|
27
|
+
if (iframeWindow.value && iframeWindow.value.editor) {
|
|
28
|
+
editor.value = iframeWindow.value.editor
|
|
29
|
+
return editor.value
|
|
30
|
+
}
|
|
31
|
+
if (editorIframe.value && editorIframe.value.contentWindow && editorIframe.value.contentWindow.editor) {
|
|
32
|
+
editor.value = editorIframe.value.contentWindow.editor
|
|
33
|
+
return editor.value
|
|
34
|
+
}
|
|
35
|
+
return null
|
|
36
|
+
}
|
|
37
|
+
// 创建体温单方法
|
|
38
|
+
const createVitalSigns = (data) => {
|
|
39
|
+
const editorObj = getEditor()
|
|
40
|
+
if (!editorObj) {
|
|
41
|
+
throw new Error('editor对象未初始化,无法创建体温单')
|
|
42
|
+
}
|
|
43
|
+
if (typeof editorObj.createVitalSigns === 'function') {
|
|
44
|
+
return editorObj.createVitalSigns(data)
|
|
45
|
+
} else {
|
|
46
|
+
throw new Error('editor对象未包含createVitalSigns方法')
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// 检查editor对象是否已初始化
|
|
51
|
+
const startEditorCheck = (frameWindow, iframe) => {
|
|
52
|
+
if (checkEditorTimer.value) {
|
|
53
|
+
clearInterval(checkEditorTimer.value)
|
|
54
|
+
}
|
|
55
|
+
checkCount.value = 0
|
|
56
|
+
checkEditorTimer.value = setInterval(() => {
|
|
57
|
+
checkCount.value++
|
|
58
|
+
try {
|
|
59
|
+
const editorObj = frameWindow.editor
|
|
60
|
+
if (editorObj && typeof editorObj.createVitalSigns === 'function') {
|
|
61
|
+
clearInterval(checkEditorTimer.value)
|
|
62
|
+
editor.value = editorObj
|
|
63
|
+
// 将editor对象暴露到全局
|
|
64
|
+
window.iframeEditor = editorObj
|
|
65
|
+
window.iframeWindow = frameWindow
|
|
66
|
+
// 触发事件
|
|
67
|
+
emit('editor-ready', editorObj)
|
|
68
|
+
emit('load', { target: iframe, editor: editorObj })
|
|
69
|
+
// 发送消息通知
|
|
70
|
+
window.parent.postMessage({ type: 'editorReady' }, '*')
|
|
71
|
+
}
|
|
72
|
+
} catch (err) {
|
|
73
|
+
console.error('检查editor对象时出错:', err)
|
|
74
|
+
}
|
|
75
|
+
if (checkCount.value >= 20) {
|
|
76
|
+
clearInterval(checkEditorTimer.value)
|
|
77
|
+
console.error('Editor 对象加载失败')
|
|
78
|
+
}
|
|
79
|
+
}, 500)
|
|
80
|
+
}
|
|
81
|
+
// iframe加载完成的处理
|
|
82
|
+
const onIframeLoad = (e) => {
|
|
83
|
+
const iframe = e.target
|
|
84
|
+
const frameWindow = iframe.contentWindow
|
|
85
|
+
iframeWindow.value = frameWindow
|
|
86
|
+
if (!frameWindow) {
|
|
87
|
+
console.error('无法访问 iframe 内容')
|
|
88
|
+
return
|
|
89
|
+
}
|
|
90
|
+
// 关闭文书工具栏
|
|
91
|
+
iframe.contentWindow.editor.option.toolbar = false
|
|
92
|
+
startEditorCheck(frameWindow, iframe)
|
|
93
|
+
}
|
|
94
|
+
// 组件销毁前清理
|
|
95
|
+
onBeforeUnmount(() => {
|
|
96
|
+
if (checkEditorTimer.value) {
|
|
97
|
+
clearInterval(checkEditorTimer.value)
|
|
98
|
+
}
|
|
99
|
+
})
|
|
100
|
+
// 暴露方法给父组件
|
|
101
|
+
defineExpose({ getEditor, createVitalSigns })
|
|
102
|
+
|
|
103
|
+
// 定义事件
|
|
104
|
+
const emit = defineEmits(['editor-ready', 'load'])
|
|
105
|
+
</script>
|
|
106
|
+
|
|
107
|
+
<style scoped>
|
|
108
|
+
iframe {
|
|
109
|
+
border: none;
|
|
110
|
+
width: 100%;
|
|
111
|
+
min-height: 800px;
|
|
112
|
+
}
|
|
113
|
+
</style>
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
export default {
|
|
3
|
-
name: 'ExceptionQuery',
|
|
4
|
-
components: {
|
|
5
|
-
XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue')
|
|
6
|
-
},
|
|
7
|
-
props: {
|
|
8
|
-
currUserInfo: {
|
|
9
|
-
type: Object,
|
|
10
|
-
default: () => undefined
|
|
11
|
-
}
|
|
12
|
-
},
|
|
13
|
-
mounted () {
|
|
14
|
-
this.$refs.xFormTable.refresh(true)
|
|
15
|
-
},
|
|
16
|
-
data () {
|
|
17
|
-
return {
|
|
18
|
-
// 查询配置名称
|
|
19
|
-
queryParamsName: 'ExceptionRecordQueryCRUD',
|
|
20
|
-
fixedQueryForm: { ex_f_userfiles_id: this.currUserInfo.f_userfiles_id },
|
|
21
|
-
// 新增表单固定值
|
|
22
|
-
fixedAddForm: {},
|
|
23
|
-
// 是否显示详情抽屉
|
|
24
|
-
detailVisible: false,
|
|
25
|
-
// 当前记录
|
|
26
|
-
record: {}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
</script>
|
|
31
|
-
|
|
32
|
-
<template>
|
|
33
|
-
<a-card :bordered="false">
|
|
34
|
-
<x-form-table
|
|
35
|
-
title="异常查询"
|
|
36
|
-
:queryParamsName="queryParamsName"
|
|
37
|
-
:fixedQueryForm="fixedQueryForm"
|
|
38
|
-
ref="xFormTable">
|
|
39
|
-
</x-form-table>
|
|
40
|
-
</a-card>
|
|
41
|
-
</template>
|
|
42
|
-
|
|
43
|
-
<style scoped>
|
|
44
|
-
|
|
45
|
-
</style>
|
|
1
|
+
<script>
|
|
2
|
+
export default {
|
|
3
|
+
name: 'ExceptionQuery',
|
|
4
|
+
components: {
|
|
5
|
+
XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue')
|
|
6
|
+
},
|
|
7
|
+
props: {
|
|
8
|
+
currUserInfo: {
|
|
9
|
+
type: Object,
|
|
10
|
+
default: () => undefined
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
mounted () {
|
|
14
|
+
this.$refs.xFormTable.refresh(true)
|
|
15
|
+
},
|
|
16
|
+
data () {
|
|
17
|
+
return {
|
|
18
|
+
// 查询配置名称
|
|
19
|
+
queryParamsName: 'ExceptionRecordQueryCRUD',
|
|
20
|
+
fixedQueryForm: { ex_f_userfiles_id: this.currUserInfo.f_userfiles_id },
|
|
21
|
+
// 新增表单固定值
|
|
22
|
+
fixedAddForm: {},
|
|
23
|
+
// 是否显示详情抽屉
|
|
24
|
+
detailVisible: false,
|
|
25
|
+
// 当前记录
|
|
26
|
+
record: {}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
<template>
|
|
33
|
+
<a-card :bordered="false">
|
|
34
|
+
<x-form-table
|
|
35
|
+
title="异常查询"
|
|
36
|
+
:queryParamsName="queryParamsName"
|
|
37
|
+
:fixedQueryForm="fixedQueryForm"
|
|
38
|
+
ref="xFormTable">
|
|
39
|
+
</x-form-table>
|
|
40
|
+
</a-card>
|
|
41
|
+
</template>
|
|
42
|
+
|
|
43
|
+
<style scoped>
|
|
44
|
+
|
|
45
|
+
</style>
|