vue2-client 1.14.46 → 1.14.47

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 (30) hide show
  1. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527173925.vue +509 -0
  2. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174316.vue +524 -0
  3. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174419.vue +524 -0
  4. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174422.vue +524 -0
  5. package/.history/src/base-client/components/common/XForm/XFormItem_20250508134122.vue +1320 -0
  6. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171604.vue +1332 -0
  7. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171613.vue +1331 -0
  8. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171703.vue +1331 -0
  9. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171720.vue +1331 -0
  10. package/.history/src/base-client/components/common/XForm/XFormItem_20250527174327.vue +1339 -0
  11. package/Users/objecrt/af-vue2-client/src/base-client/components/his/XShiftSchedule/XShiftSchedule.vue +36 -0
  12. package/docs//345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +2 -1
  13. package/package.json +1 -1
  14. package/src/base-client/components/TreeList/TreeList.vue +91 -0
  15. package/src/base-client/components/TreeList/TreeNode.vue +81 -0
  16. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +20 -6
  17. package/src/base-client/components/common/XCardSet/XTiltle.vue +191 -0
  18. package/src/base-client/components/common/XForm/XFormItem.vue +2 -2
  19. package/src/base-client/components/common/XReportGrid/XReportDemo.vue +1 -1
  20. package/src/base-client/components/his/XShiftSchedule/XShiftSchedule.vue +3 -33
  21. package/src/base-client/components/his/XTextCard/XTextCard.vue +207 -207
  22. package/src/base-client/components/his/XTitle/README.md +8 -5
  23. package/src/base-client/components/his/XTreeRows/TreeNode.vue +100 -100
  24. package/src/base-client/components/his/XTreeRows/XTreeRows.vue +197 -197
  25. package/src/base-client/components/his/threeTestOrders/editor.vue +111 -111
  26. package/src/base-client/components/his/threeTestOrders/textBox.vue +463 -463
  27. package/src/pages/ReportGrid/index.vue +1 -5
  28. package/src/router/async/router.map.js +4 -6
  29. package/src/utils/common.js +0 -32
  30. package/vue.config.js +1 -1
@@ -0,0 +1,36 @@
1
+ <script>
2
+ export default {
3
+ props: {
4
+ weekDays: {
5
+ type: Array,
6
+ default: () => []
7
+ }
8
+ },
9
+ computed: {
10
+ columns () {
11
+ const baseColumns = [
12
+ { title: '序号', dataIndex: 'index', width: 60 },
13
+ { title: '科室', dataIndex: 'department', width: 120 },
14
+ { title: '医生', dataIndex: 'doctor', width: 100 },
15
+ { title: '上/下/晚', dataIndex: 'shiftType', width: 80 },
16
+ ]
17
+
18
+ // 增加防御判断,确保 weekDays 存在
19
+ const dayColumns = this.weekDays.length > 0
20
+ ? this.weekDays.map((day, dayIndex) => ({
21
+ title: `${day.label} ${day.date}`,
22
+ dataIndex: `shifts-${dayIndex}`, // 改为字符串形式
23
+ dayIndex: dayIndex,
24
+ width: 120,
25
+ }))
26
+ : []
27
+
28
+ const tailColumns = [
29
+ { title: '排班数', dataIndex: 'count', width: 80 }
30
+ ]
31
+
32
+ return [...baseColumns, ...dayColumns, ...tailColumns]
33
+ }
34
+ }
35
+ }
36
+ </script>
@@ -60,7 +60,8 @@ this.openDialog('xxx', 5, {}, {}, {})
60
60
  afterDelete( res (删除接口返回数据)) 删除后触发
61
61
  action(record (当前记录), id (当前记录主键), actionType (操作类型)) 操作按钮触发
62
62
  - expandedGrid:"栅格名"
63
-
63
+ - json配置相关
64
+ - "pageMaxSize": (int) num,
64
65
  # x-report 插槽 使用说明
65
66
 
66
67
  - init(configName,configData) 配置名称 / 报表数据
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue2-client",
3
- "version": "1.14.46",
3
+ "version": "1.14.47",
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,91 @@
1
+ <template>
2
+ <div class="tree-container">
3
+ <div class="tree-list">
4
+ <tree-node
5
+ v-for="node in treeData"
6
+ :key="node.id"
7
+ :node="node"
8
+ @toggle="toggleNode"/>
9
+ </div>
10
+ </div>
11
+ </template>
12
+
13
+ <script>
14
+ import TreeNode from './TreeNode.vue'
15
+
16
+ export default {
17
+ name: 'TreeList',
18
+ components: {
19
+ TreeNode
20
+ },
21
+ data() {
22
+ return {
23
+ treeData: [
24
+ {
25
+ id: '1',
26
+ title: '体征',
27
+ expanded: false,
28
+ children: [
29
+ {
30
+ id: '1-1',
31
+ title: '一般情况'
32
+ },
33
+ {
34
+ id: '1-2',
35
+ title: '皮肤粘膜'
36
+ },
37
+ {
38
+ id: '1-3',
39
+ title: '头颈',
40
+ expanded: false,
41
+ children: [
42
+ {
43
+ id: '1-3-1',
44
+ title: '头部'
45
+ },
46
+ {
47
+ id: '1-3-2',
48
+ title: '颈部'
49
+ }
50
+ ]
51
+ }
52
+ ]
53
+ }
54
+ ]
55
+ }
56
+ },
57
+ methods: {
58
+ toggleNode(node) {
59
+ node.expanded = !node.expanded
60
+ }
61
+ }
62
+ }
63
+ </script>
64
+
65
+ <style scoped>
66
+ .tree-container {
67
+ width: 240px;
68
+ height: 400px;
69
+ border: 1px solid #e8e8e8;
70
+ overflow-y: auto;
71
+ padding: 8px;
72
+ }
73
+
74
+ /* 自定义滚动条样式 */
75
+ .tree-container::-webkit-scrollbar {
76
+ width: 6px;
77
+ }
78
+
79
+ .tree-container::-webkit-scrollbar-thumb {
80
+ background-color: #ccc;
81
+ border-radius: 3px;
82
+ }
83
+
84
+ .tree-container::-webkit-scrollbar-track {
85
+ background-color: #f5f5f5;
86
+ }
87
+
88
+ .tree-list {
89
+ font-size: 14px;
90
+ }
91
+ </style>
@@ -0,0 +1,81 @@
1
+ <template>
2
+ <div class="tree-node">
3
+ <div class="node-content" @click="handleClick">
4
+ <span v-if="hasChildren" class="toggle-icon">
5
+ {{ node.expanded ? '-' : '+' }}
6
+ </span>
7
+ <span class="node-title">{{ node.title }}</span>
8
+ </div>
9
+ <div v-if="hasChildren && node.expanded" class="node-children">
10
+ <tree-node
11
+ v-for="child in node.children"
12
+ :key="child.id"
13
+ :node="child"
14
+ @toggle="$emit('toggle', $event)"
15
+ :level="level + 1"/>
16
+ </div>
17
+ </div>
18
+ </template>
19
+
20
+ <script>
21
+ export default {
22
+ name: 'TreeNode',
23
+ props: {
24
+ node: {
25
+ type: Object,
26
+ required: true
27
+ },
28
+ level: {
29
+ type: Number,
30
+ default: 0
31
+ }
32
+ },
33
+ computed: {
34
+ hasChildren() {
35
+ return this.node.children && this.node.children.length > 0
36
+ }
37
+ },
38
+ methods: {
39
+ handleClick() {
40
+ if (this.hasChildren) {
41
+ this.$emit('toggle', this.node)
42
+ }
43
+ }
44
+ }
45
+ }
46
+ </script>
47
+
48
+ <style scoped>
49
+ .tree-node {
50
+ margin: 2px 0;
51
+ }
52
+
53
+ .node-content {
54
+ display: flex;
55
+ align-items: center;
56
+ padding: 4px 0;
57
+ user-select: none;
58
+ }
59
+
60
+ .toggle-icon {
61
+ width: 16px;
62
+ text-align: center;
63
+ font-size: 14px;
64
+ color: #666;
65
+ margin-right: 4px;
66
+ cursor: pointer;
67
+ }
68
+
69
+ .node-title {
70
+ flex: 1;
71
+ cursor: default;
72
+ }
73
+
74
+ .node-content:hover {
75
+ background-color: #f5f5f5;
76
+ }
77
+
78
+ .node-children {
79
+ padding-left: 20px;
80
+ }
81
+ </style>
@@ -75,10 +75,9 @@
75
75
  :column="{ xxl: 2, xl: 2, lg: 2, md: 2, sm: 1, xs: 1 }"
76
76
  >
77
77
  <a-descriptions-item label="坐标" span="2"><span>{{ addressObj.lng_lat }}</span></a-descriptions-item>
78
- <a-descriptions-item label="地址" span="2"><span>{{ addressObj.address }}</span></a-descriptions-item>
78
+ <a-descriptions-item label="地址" span="2" v-if="attr.type != 'coordinateSearch'"><span>{{ addressObj.address }}</span></a-descriptions-item>
79
79
  </a-descriptions>
80
80
  </a-modal>
81
- <!-- -->
82
81
  </div>
83
82
  </template>
84
83
  <script>
@@ -315,18 +314,33 @@ export default {
315
314
  let result
316
315
  if (this.searchResultType !== 'Default') {
317
316
  if (this.searchResultType === 'Array') {
318
- result = [_addstr || this.addressObj.address, this.addressObj.lng_lat]
317
+ // 如果是坐标搜索,只返回坐标
318
+ if (this.attr.type === 'coordinateSearch') {
319
+ result = [this.addressObj.lng_lat]
320
+ } else {
321
+ result = [_addstr || this.addressObj.address, this.addressObj.lng_lat]
322
+ }
319
323
  } else {
320
324
  result = {}
321
- result[this.resultKeys.address] = _addstr || this.addressObj.address
322
- result[this.resultKeys.coords] = this.addressObj.lng_lat
325
+ // 如果是坐标搜索,只返回坐标
326
+ if (this.attr.type === 'coordinateSearch') {
327
+ result[this.resultKeys.coords] = this.addressObj.lng_lat
328
+ } else {
329
+ result[this.resultKeys.address] = _addstr || this.addressObj.address
330
+ result[this.resultKeys.coords] = this.addressObj.lng_lat
331
+ }
323
332
  }
324
333
  }
325
334
  this.visible = false
326
335
  this.$emit('onSelect', JSON.stringify(result))
327
336
  // 如果传递了地址 是为了更新上级 不做省市区检验处理
328
337
  if (!_addstr) {
329
- this.addressInput = this.addressObj.address
338
+ // 如果是坐标搜索,输入框显示坐标
339
+ if (this.attr.type === 'coordinateSearch') {
340
+ this.addressInput = this.addressObj.lng_lat
341
+ } else {
342
+ this.addressInput = this.addressObj.address
343
+ }
330
344
  this.$emit('onDivisionsChange', Object.assign({}, result, { divisions: this.divisions, vm: this }))
331
345
  }
332
346
  },
@@ -0,0 +1,191 @@
1
+ <template>
2
+ <a-row
3
+ class="title_box"
4
+ :style="{backgroundColor: requiredParameters.backgroundColor,height:requiredParameters.height}"
5
+ type="flex"
6
+ v-model="requiredParameters">
7
+ <a-col class="title_col_left" :flex="3">
8
+ <div class="title_img_box">
9
+ <img src="../img/header10086.png" class="title_img" alt="">
10
+ </div>
11
+ <div class="title_name">{{ requiredParameters.title }}</div>
12
+ </a-col>
13
+ <a-col class="title_col_right" id="titleSelect" :flex="3" style="padding-right: 3%" v-model="dateData">
14
+ <div class="title_date_box">
15
+ <div class="title_data">{{ dateData.date }}</div>
16
+ <div class="title_week">{{ dateData.dayOfWeek }}</div>
17
+ </div>
18
+ <div class="title_time">{{ dateData.time }}</div>
19
+ <div style="font-size: x-large;margin-left: 1%">|</div>
20
+ <div class="title_refresh" @click="refreshTitle"><a-icon type="undo" style="font-size: x-large;"/></div>
21
+ <div class="title_refresh_box">
22
+ <div class="title_refresh_time">{{ dateData.refreshTime }}</div>
23
+ <div class="latest_update_time">最新更新时间</div>
24
+ </div>
25
+ </a-col>
26
+ </a-row>
27
+ </template>
28
+
29
+ <script>
30
+
31
+ export default {
32
+ name: 'TitleComponent',
33
+ components: {},
34
+ data () {
35
+ return {
36
+ dateData: {
37
+ date: '',
38
+ dayOfWeek: '',
39
+ time: '',
40
+ refreshTime: ''
41
+ },
42
+ timer: null
43
+ }
44
+ },
45
+ props: {
46
+ requiredParameters: {
47
+ type: Object,
48
+ default: () => ({
49
+ title: '',
50
+ backgroundColor: '',
51
+ height: ''
52
+ }),
53
+ }
54
+ },
55
+ created () {
56
+ this.updateDateData()
57
+ this.startTimer()
58
+ },
59
+ beforeDestroy () {
60
+ this.stopTimer()
61
+ },
62
+ methods: {
63
+ // 刷新页面
64
+ refreshTitle () {
65
+ this.$forceUpdate()
66
+ const now = new Date()
67
+ this.dateData.refreshTime = now.toLocaleTimeString()
68
+ this.$emit('refreshTitle')
69
+ },
70
+ updateDateData () {
71
+ const now = new Date()
72
+ const options = { weekday: 'long' }
73
+ this.dateData.date = this.formatDate(now)
74
+ this.dateData.time = this.formatTime(now)
75
+ this.dateData.dayOfWeek = now.toLocaleDateString(undefined, options)
76
+ this.dateData.refreshTime = now.toLocaleTimeString()
77
+ },
78
+ formatDate (date) {
79
+ const month = date.getMonth() + 1
80
+ const day = date.getDate()
81
+ return `${month}月${day}日`
82
+ },
83
+ formatTime (date) {
84
+ const hours = String(date.getHours()).padStart(2, '0')
85
+ const minutes = String(date.getMinutes()).padStart(2, '0')
86
+ return `${hours}:${minutes}`
87
+ },
88
+ startTimer () {
89
+ this.timer = setInterval(() => {
90
+ const now = new Date()
91
+ this.dateData.time = this.formatTime(now)
92
+ }, 10000) // 每秒更新一次
93
+ },
94
+ stopTimer () {
95
+ if (this.timer) {
96
+ clearInterval(this.timer)
97
+ this.timer = null
98
+ }
99
+ }
100
+ }
101
+ }
102
+ </script>
103
+
104
+ <style scoped>
105
+ .title_box {
106
+ width: 100%;
107
+ min-height:42px;
108
+ }
109
+ .title_col_left {
110
+ height: 100%;
111
+ color: white;
112
+ display: flex;
113
+ align-content: center;
114
+ align-items: center;
115
+ }
116
+ .title_col_right {
117
+ height: 100%;
118
+ color: white;
119
+ display: flex;
120
+ align-content: center;
121
+ align-items: center;
122
+ justify-content: flex-end;
123
+ }
124
+ .title_img_box {
125
+ height: 80%;
126
+ width: auto;
127
+ margin-left: 1%;
128
+ border-radius: 50%;
129
+ background-color: #35baf6;
130
+ }
131
+ .title_img{
132
+ width: 100%;
133
+ height: 100%;
134
+ }
135
+ .title_name {
136
+ font-size: medium !important;
137
+ font-weight: bold;
138
+ margin-left: 1%;
139
+ }
140
+ .title_date_box{
141
+ width: 20%;
142
+ height: 100%;
143
+ display: flex;
144
+ flex-direction: column;
145
+ justify-content: center;
146
+ }
147
+ .title_data{
148
+ display: flex;
149
+ justify-content: center;
150
+ align-items: center;
151
+ font-size: smaller;
152
+ }
153
+ .title_week{
154
+ display: flex;
155
+ justify-content: center;
156
+ align-items: center;
157
+ font-size: smaller;
158
+ }
159
+ .title_time{
160
+ font-size: x-large;
161
+ }
162
+ .title_refresh{
163
+ margin-left: 1%;
164
+ height: 100%;
165
+ align-content: center;
166
+ align-items: center;
167
+ cursor: pointer;
168
+ display: flex;
169
+ width: 7%;
170
+ justify-content: center;
171
+ min-width: 31px;
172
+ }
173
+ .title_refresh:hover{
174
+ background-color: rgb(31, 138, 137);
175
+ }
176
+ .title_refresh:active{
177
+ background-color: rgb(26, 129, 128);
178
+ }
179
+ .title_refresh_box{
180
+ margin-right: 1%;
181
+ }
182
+ .latest_update_time{
183
+ font-size: x-small;
184
+ }
185
+ .title_refresh_time{
186
+ display: flex;
187
+ font-size: x-small;
188
+ align-content: center;
189
+ justify-content: center;
190
+ }
191
+ </style>
@@ -435,7 +435,7 @@
435
435
  </x-form-col>
436
436
  <!-- 地点搜索框 -->
437
437
  <x-form-col
438
- v-else-if="attr.type === 'addressSearch' && show"
438
+ v-else-if="(attr.type === 'addressSearch' || attr.type === 'coordinateSearch') && show"
439
439
  :labelCol="labelCol"
440
440
  :occupyCol="attr.occupyCol"
441
441
  :flex="attr.flex">
@@ -898,7 +898,7 @@ export default {
898
898
  this.debouncedShowQueryFormItemFunc()
899
899
  }
900
900
  // 地址搜索框赋值
901
- if (this.attr.type === 'addressSearch') {
901
+ if (this.attr.type === 'addressSearch' || this.attr.type === 'coordinateSearch') {
902
902
  this.$refs.addressSearchCombobox.addressInput = this.form[this.attr.model]
903
903
  }
904
904
  // 数据源来自人员联动时更新数据
@@ -4,7 +4,7 @@
4
4
  <XReport
5
5
  ref="main"
6
6
  :use-oss-for-img="false"
7
- config-name="收费组件Config"
7
+ config-name="openPrescriptionCover"
8
8
  server-name="af-his"
9
9
  :show-img-in-cell="true"
10
10
  :display-only="true"
@@ -7,39 +7,9 @@
7
7
  <span slot="time" class="time-title">
8
8
  <span v-for="(item, index) in configData.timePeriod" :key="index">{{ item }}</span>
9
9
  </span>
10
- <template slot="Monday" slot-scope="text, record">
11
- <div class="time-title">
12
- <a-button v-for="(item, index) in record.Monday" :key="index" @click="handleShiftChange('Monday', index, record)">{{ item === 1 || item === '1' ? '坐诊' : '休息' }}</a-button>
13
- </div>
14
- </template>
15
- <template slot="Tuesday" slot-scope="text, record">
16
- <div class="time-title">
17
- <a-button v-for="(item, index) in record.Tuesday" :key="index" @click="handleShiftChange('Tuesday', index, record)">{{ item === 1 || item === '1' ? '坐诊' : '休息' }}</a-button>
18
- </div>
19
- </template>
20
- <template slot="Wednesday" slot-scope="text, record">
21
- <div class="time-title">
22
- <a-button v-for="(item, index) in record.Wednesday" :key="index" @click="handleShiftChange('Wednesday', index, record)">{{ item === 1 || item === '1' ? '坐诊' : '休息' }}</a-button>
23
- </div>
24
- </template>
25
- <template slot="Thursday" slot-scope="text, record">
26
- <div class="time-title">
27
- <a-button v-for="(item, index) in record.Thursday" :key="index" @click="handleShiftChange('Thursday', index, record)">{{ item === 1 || item === '1' ? '坐诊' : '休息' }}</a-button>
28
- </div>
29
- </template>
30
- <template slot="Friday" slot-scope="text, record">
31
- <div class="time-title">
32
- <a-button v-for="(item, index) in record.Friday" :key="index" @click="handleShiftChange('Friday', index, record)">{{ item === 1 || item === '1' ? '坐诊' : '休息' }}</a-button>
33
- </div>
34
- </template>
35
- <template slot="Saturday" slot-scope="text, record">
36
- <div class="time-title">
37
- <a-button v-for="(item, index) in record.Saturday" :key="index" @click="handleShiftChange('Saturday', index, record)">{{ item === 1 || item === '1' ? '坐诊' : '休息' }}</a-button>
38
- </div>
39
- </template>
40
- <template slot="Sunday" slot-scope="text, record">
41
- <div class="time-title">
42
- <a-button v-for="(item, index) in record.Sunday" :key="index" @click="handleShiftChange('Sunday', index, record)">{{ item === 1 || item === '1' ? '坐诊' : '休息' }}</a-button>
10
+ <template :slot="day.key" slot-scope="text, record" v-for="day in shiftTable">
11
+ <div class="time-title" :key="day.key">
12
+ <a-button v-for="(item, index) in record[day.key]" :key="index" @click="handleShiftChange(day.key, index, record)">{{ item === 1 || item === '1' ? '坐诊' : '休息' }}</a-button>
43
13
  </div>
44
14
  </template>
45
15
  <template slot="sk_limit" slot-scope="text, record">