vue2-client 1.15.59 → 1.15.61

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 (134) hide show
  1. package/.history/public/his/editor/editor_20250606134713.html +51 -0
  2. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527173925.vue +509 -0
  3. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174316.vue +524 -0
  4. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174419.vue +524 -0
  5. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174422.vue +524 -0
  6. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172825.vue +207 -0
  7. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172945.vue +211 -0
  8. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172949.vue +212 -0
  9. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611173010.vue +212 -0
  10. package/.history/src/base-client/components/common/XForm/XFormItem_20250508134122.vue +1320 -0
  11. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171604.vue +1332 -0
  12. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171613.vue +1331 -0
  13. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171703.vue +1331 -0
  14. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171720.vue +1331 -0
  15. package/.history/src/base-client/components/common/XForm/XFormItem_20250527174327.vue +1339 -0
  16. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612092804.vue +731 -0
  17. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612112546.vue +748 -0
  18. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612113808.vue +748 -0
  19. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115237.vue +1071 -0
  20. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115346.vue +1078 -0
  21. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115350.vue +1077 -0
  22. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115415.vue +1077 -0
  23. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115429.vue +1077 -0
  24. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611091619.vue +442 -0
  25. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092547.vue +442 -0
  26. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092552.vue +442 -0
  27. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092744.vue +475 -0
  28. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092955.vue +475 -0
  29. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092957.vue +475 -0
  30. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095652.vue +477 -0
  31. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095701.vue +477 -0
  32. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095704.vue +477 -0
  33. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100005.vue +473 -0
  34. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100011.vue +473 -0
  35. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100014.vue +473 -0
  36. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100833.vue +473 -0
  37. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100853.vue +473 -0
  38. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100940.vue +473 -0
  39. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101011.vue +473 -0
  40. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101013.vue +473 -0
  41. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101014.vue +473 -0
  42. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101159.vue +473 -0
  43. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101238.vue +474 -0
  44. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101240.vue +474 -0
  45. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101242.vue +474 -0
  46. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101404.vue +472 -0
  47. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101410.vue +472 -0
  48. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101459.vue +472 -0
  49. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101500.vue +472 -0
  50. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101502.vue +472 -0
  51. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101504.vue +472 -0
  52. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101610.vue +501 -0
  53. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101700.vue +501 -0
  54. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101702.vue +501 -0
  55. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101741.vue +504 -0
  56. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101749.vue +504 -0
  57. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101759.vue +504 -0
  58. package/.history/src/base-client/components/his/XHisEditor/dome_20250611091349.vue +131 -0
  59. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105854.vue +160 -0
  60. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105902.vue +160 -0
  61. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105924.vue +160 -0
  62. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105932.vue +158 -0
  63. package/.history/src/base-client/components/his/XList/XList_20250609135848.vue +173 -0
  64. package/.history/src/base-client/components/his/XList/XList_20250609141026.vue +222 -0
  65. package/.history/src/base-client/components/his/XList/XList_20250609141035.vue +229 -0
  66. package/.history/src/base-client/components/his/XList/XList_20250609141103.vue +229 -0
  67. package/.history/src/base-client/components/his/XList/XList_20250609141105.vue +229 -0
  68. package/.history/src/base-client/components/his/XList/XList_20250609141334.vue +241 -0
  69. package/.history/src/base-client/components/his/XList/XList_20250609141404.vue +241 -0
  70. package/.history/src/base-client/components/his/XList/XList_20250609141406.vue +241 -0
  71. package/.history/src/base-client/components/his/XList/XList_20250609141801.vue +245 -0
  72. package/.history/src/base-client/components/his/XList/XList_20250609142033.vue +245 -0
  73. package/.history/src/base-client/components/his/XList/XList_20250609142038.vue +245 -0
  74. package/.history/src/base-client/components/his/XList/XList_20250609142435.vue +255 -0
  75. package/.history/src/base-client/components/his/XList/XList_20250609142503.vue +255 -0
  76. package/.history/src/base-client/components/his/XList/XList_20250609142504.vue +255 -0
  77. package/.history/src/base-client/components/his/XList/XList_20250609143012.vue +270 -0
  78. package/.history/src/base-client/components/his/XList/XList_20250609143044.vue +270 -0
  79. package/.history/src/base-client/components/his/XList/XList_20250609143046.vue +270 -0
  80. package/.history/src/base-client/components/his/XList/XList_20250609143210.vue +270 -0
  81. package/.history/src/base-client/components/his/XList/XList_20250609144339.vue +294 -0
  82. package/.history/src/base-client/components/his/XList/XList_20250609144410.vue +294 -0
  83. package/.history/src/base-client/components/his/XList/XList_20250609144412.vue +294 -0
  84. package/.history/src/base-client/components/his/XList/XList_20250609144647.vue +303 -0
  85. package/.history/src/base-client/components/his/XList/XList_20250609144716.vue +303 -0
  86. package/.history/src/base-client/components/his/XList/XList_20250609144729.vue +303 -0
  87. package/.history/src/base-client/components/his/XList/XList_20250609151232.vue +288 -0
  88. package/.history/src/base-client/components/his/XList/XList_20250609151247.vue +288 -0
  89. package/.history/src/base-client/components/his/XList/XList_20250609151252.vue +288 -0
  90. package/.history/src/base-client/components/his/XList/XList_20250609161220.vue +317 -0
  91. package/.history/src/base-client/components/his/XList/XList_20250609161258.vue +306 -0
  92. package/.history/src/base-client/components/his/XList/XList_20250609161319.vue +306 -0
  93. package/.history/src/base-client/components/his/XList/XList_20250609161320.vue +306 -0
  94. package/.history/src/base-client/components/his/XList/XList_20250704142024.vue +495 -0
  95. package/.history/src/base-client/components/his/XList/XList_20250704142033.vue +495 -0
  96. package/.history/src/base-client/components/his/XList/XList_20250704142040.vue +494 -0
  97. package/.history/src/base-client/components/his/XList/XList_20250704142211.vue +494 -0
  98. package/.history/src/base-client/components/his/XList/XList_20250704142214.vue +494 -0
  99. package/.history/src/base-client/components/his/XList/XList_20250704143010.vue +495 -0
  100. package/.history/src/base-client/components/his/XList/XList_20250704143203.vue +495 -0
  101. package/.history/src/base-client/components/his/XList/XList_20250707095101.vue +492 -0
  102. package/.history/src/base-client/components/his/XList/XList_20250707100152.vue +492 -0
  103. package/.history/src/base-client/components/his/XList/XList_20250707100200.vue +485 -0
  104. package/.history/src/base-client/components/his/XList/XList_20250707100208.vue +485 -0
  105. package/.history/src/base-client/components/his/XList/XList_20250707100259.vue +488 -0
  106. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250609151519.vue +222 -0
  107. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250612155514.vue +183 -0
  108. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250612155556.vue +183 -0
  109. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250612155600.vue +183 -0
  110. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250612181609.vue +206 -0
  111. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250612181629.vue +209 -0
  112. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613095553.vue +242 -0
  113. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613095610.vue +242 -0
  114. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613095612.vue +242 -0
  115. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613100041.vue +251 -0
  116. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613100047.vue +251 -0
  117. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613100054.vue +250 -0
  118. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613100105.vue +250 -0
  119. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613100107.vue +250 -0
  120. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613100114.vue +250 -0
  121. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613140844.vue +238 -0
  122. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613140910.vue +238 -0
  123. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613140912.vue +238 -0
  124. package/Users/objecrt/af-vue2-client/src/base-client/components/his/XShiftSchedule/XShiftSchedule.vue +36 -0
  125. package/package.json +1 -1
  126. package/src/base-client/components/TreeList/TreeList.vue +91 -0
  127. package/src/base-client/components/TreeList/TreeNode.vue +81 -0
  128. package/src/base-client/components/common/XCardSet/XTiltle.vue +191 -0
  129. package/src/base-client/components/common/XFormTable/demo.vue +38 -38
  130. package/src/base-client/components/common/XTable/XTable.vue +2 -2
  131. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +4 -2
  132. package/src/base-client/components/his/XTextCard/XTextCard.vue +207 -207
  133. package/src/base-client/components/his/threeTestOrders/editor.vue +111 -111
  134. package/src/router/async/router.map.js +0 -1
@@ -0,0 +1,488 @@
1
+ <template>
2
+ <!-- 列表卡片模式 listMode: card -->
3
+ <div v-if="listMode"
4
+ class="demo-infinite-container"
5
+ ref="listRef"
6
+ @scroll="handleInfiniteOnLoad">
7
+ <a-list :grid="{ gutter: 16, xs: 1, sm: 2, md: 2, lg: 3, xl: 3, xxl: 4 }"
8
+ :data-source="localData">
9
+ <a-list-item slot="renderItem" slot-scope="item, index">
10
+ <div class="card-a-col">
11
+ <a-row class="card-row">
12
+ <a-col class="id-a-col" :span="4" v-for="(detail,idx) in item.filter(d => d.label == label)" :key="idx">
13
+ {{detail.value}}<span style="font-size: 16px;font-weight: 400 !important;">床</span>
14
+ </a-col>
15
+ <a-col :span="20" class="id-a-col-2">
16
+ <template v-for="(detail,idx) in item">
17
+ <span class="describe-list-a-col" :class="{name: detail.bold}" :key="idx" v-if="detail.type == 'title'">{{detail.value}}</span>
18
+ <span :key="idx" class="component-a-col" v-else-if="detail.type == 'component' && detail.label != label">
19
+ {{`${detail.label}:`}}
20
+ <component
21
+ :is="detail.slotType"
22
+ :key="idx"
23
+ :ref="`dynamicComponent_${ idx.slotType || idx}_${idx}`"
24
+ :serviceName="serviceName"
25
+ v-on="forwardAllEvents"
26
+ :queryParamsName="detail.value"
27
+ :countVisible="false"
28
+ />
29
+ </span>
30
+ <span :key="idx" class="component-a-col" v-else-if="detail.type == 'date'">
31
+ {{`${detail.label}:`}}
32
+ <a-date-picker @change="onChange" />
33
+ </span>
34
+ <span class="describe-list-a-col" :class="{name: detail.bold}" :key="idx" v-else-if="detail.label != label">{{`${detail.label}:${detail.value}`}}</span>
35
+ </template>
36
+ <a-button v-for="(btn, i) in buttonNames"
37
+ :key="i"
38
+ icon="search"
39
+ class="button-a-col"
40
+ @click.stop="click(item, index)">
41
+ {{btn}}
42
+ </a-button>
43
+ </a-col>
44
+ </a-row>
45
+ </div>
46
+ </a-list-item>
47
+ <div v-if="loading" class="demo-loading-container">
48
+ <a-spin />
49
+ </div>
50
+ <div v-if="allLoaded">
51
+ <div class="demo-infinite-list-bottom">
52
+ 已经显示全部数据
53
+ </div>
54
+ </div>
55
+ </a-list>
56
+ </div>
57
+
58
+ <!-- 默认标签模式 -->
59
+ <div class="list-wrapper" v-else>
60
+ <a-list size="large" :data-source="data" itemLayout="horizontal" class="list-container" ref="listRef">
61
+ <a-list-item slot="renderItem"
62
+ slot-scope="item, index"
63
+ class="list-item"
64
+ @click="handleClick(index)"
65
+ @mouseenter="enableHoverOptions && handleMouseEnter(index)"
66
+ @mouseleave="handleMouseLeave"
67
+ :class="{ 'hover-active': enableHoverOptions && hoveredIndex === index }">
68
+ <i v-if="icon"
69
+ class="icon-menu"
70
+ :style="getIconStyle(item)">
71
+ </i>
72
+ <span
73
+ class="item-text">
74
+ {{ item.number }} {{ item.name }}
75
+ </span>
76
+
77
+ <div v-if="button" class="button-group">
78
+ <a-button
79
+ v-for="(name, idx) in buttonNames"
80
+ :key="idx"
81
+ type="link"
82
+ :class="['confirm-btn', buttonMode ? 'hover-btn' : '']"
83
+ @click.stop="click(index, idx)">
84
+ <span :class="{ 'hover-active': enableHoverOptions && hoveredIndex === index }">{{ name }}</span>
85
+ </a-button>
86
+ </div>
87
+
88
+ <!-- 悬浮选项框 -->
89
+ <div v-show="enableHoverOptions && hoveredIndex === index"
90
+ class="hover-options"
91
+ @mouseenter="handleOptionsEnter"
92
+ @mouseleave="handleOptionsLeave">
93
+ <div class="hover-options-content">
94
+ <div v-for="(item, idx) in select_options"
95
+ :key="idx"
96
+ class="option-item"
97
+ @click="handleOptionClick(index, item)">
98
+ {{ item }}
99
+ </div>
100
+ </div>
101
+ </div>
102
+ </a-list-item>
103
+ </a-list>
104
+ </div>
105
+ </template>
106
+
107
+ <script>
108
+
109
+ import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
110
+
111
+ export default {
112
+ name: 'XList',
113
+ components: {
114
+ XReport: () => import('@vue2-client/base-client/components/common/XReport/XReport.vue'),
115
+ XButtons: () => import('@vue2-client/base-client/components/common/XButtons/XButtons.vue'),
116
+ XInput: () => import('@vue2-client/base-client/components/common/XInput/XInput.vue'),
117
+ XRadio: () => import('@vue2-client/base-client/components/his/XRadio/XRadio.vue'),
118
+ XTimeSelect: () => import('@vue2-client/base-client/components/his/XTimeSelect/XTimeSelect.vue'),
119
+ XCheckbox: () => import('@vue2-client/base-client/components/his/XCheckbox/XCheckbox.vue'),
120
+ XTitle: () => import('@vue2-client/base-client/components/his/XTitle/XTitle.vue'),
121
+ XSelect: () => import('@vue2-client/base-client/components/his/XSelect/XSelect.vue')
122
+ },
123
+ props: {
124
+ queryParamsName: {
125
+ type: Object,
126
+ default: null
127
+ },
128
+ fixedQueryForm: {
129
+ type: Object,
130
+ default: { condition: '1=1' }
131
+ },
132
+ enableHoverOptions: {
133
+ type: Boolean,
134
+ default: true
135
+ },
136
+ serviceName: {
137
+ type: String,
138
+ default: 'af-his'
139
+ }
140
+ },
141
+ inject: ['getComponentByName'],
142
+ data () {
143
+ return {
144
+ data: [], // 数据源
145
+ localData: [], // 本地数据源
146
+ loading: false, // 加载中
147
+ busy: false, // 繁忙状态
148
+ button: false,
149
+ icon: false,
150
+ buttonNames: [],
151
+ listMode: undefined, // 列表模式
152
+ buttonMode: true,
153
+ hoveredIndex: -1, // 当前悬浮的索引
154
+ isOptionsHovered: false, // 悬浮选项框是否悬浮
155
+ hoverTimer: null, // 悬浮选项框定时器
156
+ leaveTimer: null, // 离开选项框定时器
157
+ select_options: [], // 悬浮选项框
158
+ logicName: '',
159
+ nowPage: 0, // 当前页
160
+ pageSize: 12,
161
+ allLoaded: false,
162
+ label: 'id',
163
+ scrollTimer: null
164
+ }
165
+ },
166
+ created () {
167
+ this.getData(this.queryParamsName, this.fixedQueryForm)
168
+ },
169
+ mounted () {},
170
+ computed: {
171
+ forwardAllEvents () {
172
+ return {
173
+ // 监听所有事件并转发给父组件
174
+ '*': (eventName, ...payload) => {
175
+ this.$emit(eventName, ...payload)
176
+ }
177
+ }
178
+ }
179
+ },
180
+ methods: {
181
+ onChange (date, dateString) {
182
+ this.$emit('dateChange', date, dateString)
183
+ },
184
+ handleInfiniteOnLoad (event) {
185
+ if (this.busy || this.allLoaded) return // 防止重复加载
186
+ if (this.scrollTimer) clearTimeout(this.scrollTimer)
187
+ this.scrollTimer = setTimeout(() => {
188
+ const container = event.target
189
+ const scrollTop = container.scrollTop
190
+ const scrollHeight = container.scrollHeight
191
+ const clientHeight = container.clientHeight
192
+ const bottomOffset = 10
193
+ if (scrollTop + clientHeight >= scrollHeight - bottomOffset) {
194
+ this.busy = true
195
+ this.loading = true
196
+ this.nowPage = this.nowPage + this.pageSize
197
+ this.fixedQueryForm.condition = `Limit ${this.nowPage}, ${this.pageSize}`
198
+ runLogic(this.logicName, this.fixedQueryForm, 'af-his').then(async (res) => {
199
+ this.localData = [...this.localData, ...res]
200
+ if (res.length < this.pageSize) {
201
+ this.allLoaded = true
202
+ }
203
+ }).catch(e => {
204
+ this.$message.error(e.message)
205
+ }).finally(() => {
206
+ this.loading = false
207
+ this.busy = false
208
+ })
209
+ }
210
+ }, 100)
211
+ },
212
+ async getData (config, param) {
213
+ const that = this
214
+ getConfigByName(config, 'af-his', async (res) => {
215
+ that.listMode = await res.listMode == 'card'
216
+ that.logicName = await res.data
217
+ that.button = await res.button // 按钮
218
+ that.icon = await res.icon // 图标
219
+ that.label = await res.label // 标签
220
+ that.buttonNames = await res.buttonNames || []// 按钮文本
221
+ that.buttonMode = await res.buttonMode || false// 按钮模式
222
+ this.enableHoverOptions = await res.enableHoverOptions || false// 悬浮选项框
223
+ if (this.enableHoverOptions) {
224
+ this.select_options = await res.select_options
225
+ }
226
+ if (that.listMode) { param.condition = `Limit ${that.nowPage}, ${that.pageSize}` }
227
+ runLogic(res.data, param, 'af-his').then(result => {
228
+ that.data = result
229
+ if (that.nowPage == 0) { this.localData = result }
230
+ })
231
+ })
232
+ },
233
+ // 点击列表项
234
+ handleClick (index) {
235
+ this.$emit('listClick', this.data[index])
236
+ },
237
+ refreshList (param) {
238
+ this.getData(this.queryParamsName, param)
239
+ },
240
+ click (index, buttonIndex) {
241
+ this.$emit('click', { data: this.data[index], name: this.buttonNames[buttonIndex] })
242
+ },
243
+ getIconStyle (item) {
244
+ return item.picture
245
+ ? { backgroundImage: `url(${item.picture})` }
246
+ : {}
247
+ },
248
+ filterData (par) {
249
+ runLogic(this.queryParamsName, par, 'af-his').then(res => {
250
+ this.data = res.data
251
+ })
252
+ },
253
+ // 鼠标进入列表项
254
+ handleMouseEnter (index) {
255
+ this.clearAllTimers()
256
+ this.hoveredIndex = index
257
+ this.isOptionsHovered = true
258
+ },
259
+ // 鼠标离开列表项
260
+ handleMouseLeave () {
261
+ this.clearAllTimers()
262
+ this.leaveTimer = setTimeout(() => {
263
+ this.isOptionsHovered = false
264
+ this.hoveredIndex = -1
265
+ }, 100)
266
+ },
267
+ // 鼠标进入悬浮选项框
268
+ handleOptionsEnter () {
269
+ this.clearAllTimers()
270
+ this.isOptionsHovered = true
271
+ },
272
+ // 鼠标离开悬浮选项框
273
+ handleOptionsLeave () {
274
+ this.clearAllTimers()
275
+ this.leaveTimer = setTimeout(() => {
276
+ this.isOptionsHovered = false
277
+ this.hoveredIndex = -1
278
+ }, 100)
279
+ },
280
+ // 清除所有定时器
281
+ clearAllTimers () {
282
+ if (this.hoverTimer) {
283
+ clearTimeout(this.hoverTimer)
284
+ this.hoverTimer = null
285
+ }
286
+ if (this.leaveTimer) {
287
+ clearTimeout(this.leaveTimer)
288
+ this.leaveTimer = null
289
+ }
290
+ },
291
+ // 选项框点击
292
+ handleOptionClick (index, action) {
293
+ this.$emit('optionClick', { data: this.data[index], action })
294
+ }
295
+ },
296
+ watch: {
297
+ fixedQueryForm: {
298
+ deep: true,
299
+ handler (val) {
300
+ this.refreshList(val)
301
+ }
302
+ }
303
+ },
304
+ beforeDestroy () {
305
+ const ref = this.$refs.listRef
306
+ if (ref && ref.removeEventListener) {
307
+ ref.removeEventListener('scroll', this.handleInfiniteOnLoad)
308
+ }
309
+ this.clearAllTimers()
310
+ }
311
+ }
312
+ </script>
313
+
314
+ <style scoped>
315
+ .list-wrapper {
316
+ max-height: 240px;
317
+ overflow-y: auto;
318
+ padding-right: 2px;
319
+ }
320
+
321
+ .list-container {
322
+ width: 100%;
323
+ }
324
+
325
+ .list-item {
326
+ height: 35px;
327
+ border-radius: 6px;
328
+ background-color: #F4F4F4;
329
+ padding: 8px 15px;
330
+ font-size: 16px;
331
+ display: flex;
332
+ align-items: center;
333
+ width: 100%;
334
+ border: 1px solid #D9D9D9;
335
+ box-sizing: border-box;
336
+ margin-bottom: 8px !important;
337
+ position: relative;
338
+ transition: background-color 0.3s ease;
339
+ }
340
+
341
+ .icon-menu {
342
+ display: inline-block;
343
+ width: 20px;
344
+ height: 20px;
345
+ background-color: #ccc;
346
+ margin-right: 8px;
347
+ }
348
+
349
+ .item-text {
350
+ flex: 1;
351
+ }
352
+
353
+ .confirm-btn {
354
+ margin-left: auto;
355
+ padding: 0 8px;
356
+ }
357
+
358
+ .confirm-btn.hover-btn {
359
+ opacity: 0;
360
+ transition: opacity 0.3s ease;
361
+ }
362
+
363
+ .button-group {
364
+ display: flex;
365
+ gap: 2px; /* 按钮之间的间距 */
366
+ }
367
+
368
+ .list-item:hover .confirm-btn.hover-btn {
369
+ opacity: 1;
370
+ }
371
+
372
+ /* 自定义滚动条样式 */
373
+ .list-wrapper::-webkit-scrollbar {
374
+ width: 6px;
375
+ }
376
+
377
+ .list-wrapper::-webkit-scrollbar-thumb {
378
+ background-color: #d9d9d9;
379
+ border-radius: 3px;
380
+ }
381
+
382
+ .list-wrapper::-webkit-scrollbar-track {
383
+ background-color: #f0f0f0;
384
+ }
385
+
386
+ .hover-active {
387
+ color: white;
388
+ }
389
+
390
+ .list-item.hover-active {
391
+ background-color: rgb(0, 87, 254) !important;
392
+ color: white;
393
+ border: 1px solid black;
394
+ }
395
+
396
+ .hover-options {
397
+ position: absolute;
398
+ left: 0;
399
+ right: 0;
400
+ top: 100%;
401
+ background: white;
402
+ border: 1px solid #d9d9d9;
403
+ border-radius: 4px;
404
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
405
+ z-index: 1000;
406
+ margin-top: 4px;
407
+ width: 100%;
408
+ box-sizing: border-box;
409
+ pointer-events: auto;
410
+ }
411
+
412
+ .hover-options-content {
413
+ padding: 4px 0;
414
+ display: flex;
415
+ flex-direction: column;
416
+ width: 100%;
417
+ }
418
+
419
+ .option-item {
420
+ padding: 8px 12px;
421
+ cursor: pointer;
422
+ transition: all 0.3s ease;
423
+ color: #333;
424
+ font-size: 14px;
425
+ display: flex;
426
+ align-items: center;
427
+ }
428
+
429
+ .option-item:hover {
430
+ background-color: #f5f5f5;
431
+ color: #1890ff;
432
+ }
433
+
434
+ .option-item:active {
435
+ background-color: #e6f7ff;
436
+ }
437
+
438
+ .demo-loading-container {
439
+ position: absolute;
440
+ bottom: 40px;
441
+ width: 100%;
442
+ text-align: center;
443
+ }
444
+
445
+ .demo-infinite-container{
446
+ overflow-x: hidden;
447
+ overflow-y: auto;
448
+ height: 80vh;
449
+ }
450
+ .card-row{
451
+ height: 100%;
452
+ width: 100%;
453
+ border-radius: 6px;
454
+ padding: 6px;
455
+ }
456
+ .id-a-col{
457
+ font-size: 22px;
458
+ font-weight: 700;
459
+ display: flex;
460
+ justify-content: space-evenly;
461
+ align-items: center;
462
+ }
463
+ .id-a-col-2{}
464
+ .describe-list-a-col{
465
+ display: block;
466
+ font-size: 16px;
467
+ }
468
+ .name{
469
+ font-size: 18px;
470
+ font-weight: 700;
471
+ }
472
+ .component-a-col{
473
+ display: flex;
474
+ align-items: center;
475
+ }
476
+ .button-a-col{
477
+ position: absolute;
478
+ top: 245px;
479
+ left: 225px;
480
+ }
481
+ .card-a-col{
482
+ background-color: rgba(247, 249, 252);
483
+ height: 297px;
484
+ width: auto;
485
+ border-radius: 6px;
486
+ border: 1px solid #E5E9F0;
487
+ }
488
+ </style>
@@ -0,0 +1,222 @@
1
+ <template>
2
+ <a-table
3
+ :columns="columns"
4
+ :data-source="data"
5
+ :rowSelection="rowSelection"
6
+ :scroll="{ y: '75vh' }">
7
+ <span slot="time" class="time-title">
8
+ <span v-for="(item, index) in configData.timePeriod" :key="index">{{ item }}</span>
9
+ </span>
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>
13
+ </div>
14
+ </template>
15
+ <template slot="sk_limit" slot-scope="text, record">
16
+ <a-input-number id="inputNumber" v-model="record.sk_limit" :min="configData.sk_limitMin" :max="configData.sk_limitMax" />
17
+ </template>
18
+ </a-table>
19
+ </template>
20
+ <script>
21
+ import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
22
+
23
+ export default {
24
+ data () {
25
+ return {
26
+ data: [],
27
+ // 列配置
28
+ columns: [],
29
+ // 列名
30
+ columnNames: [],
31
+ // 选中的行键值集合
32
+ selectedRows: [],
33
+ // 选中的行信息集合
34
+ selectedRowKeys: [],
35
+ // 原始数据备份
36
+ originalData: [],
37
+ // 配置参数
38
+ configData: {},
39
+ // 排班时间表
40
+ shiftTable: [
41
+ {
42
+ title: '周一',
43
+ key: 'Monday',
44
+ dataIndex: 'Monday',
45
+ scopedSlots: { customRender: 'Monday' },
46
+ align: 'center'
47
+ },
48
+ {
49
+ title: '周二',
50
+ key: 'Tuesday',
51
+ dataIndex: 'Tuesday',
52
+ scopedSlots: { customRender: 'Tuesday' },
53
+ align: 'center'
54
+ },
55
+ {
56
+ title: '周三',
57
+ key: 'Wednesday',
58
+ dataIndex: 'Wednesday',
59
+ scopedSlots: { customRender: 'Wednesday' },
60
+ align: 'center'
61
+ },
62
+ {
63
+ title: '周四',
64
+ key: 'Thursday',
65
+ dataIndex: 'Thursday',
66
+ scopedSlots: { customRender: 'Thursday' },
67
+ align: 'center'
68
+ },
69
+ {
70
+ title: '周五',
71
+ key: 'Friday',
72
+ dataIndex: 'Friday',
73
+ scopedSlots: { customRender: 'Friday' },
74
+ align: 'center'
75
+ },
76
+ {
77
+ title: '周六',
78
+ key: 'Saturday',
79
+ dataIndex: 'Saturday',
80
+ scopedSlots: { customRender: 'Saturday' },
81
+ align: 'center'
82
+ },
83
+ {
84
+ title: '周日',
85
+ key: 'Sunday',
86
+ dataIndex: 'Sunday',
87
+ scopedSlots: { customRender: 'Sunday' },
88
+ align: 'center'
89
+ },
90
+ {
91
+ title: '排班数',
92
+ key: 'sk_limit',
93
+ dataIndex: 'sk_limit',
94
+ scopedSlots: { customRender: 'sk_limit' },
95
+ align: 'center'
96
+ }
97
+ ]
98
+ }
99
+ },
100
+ props: {
101
+ // 配置名
102
+ queryParamsName: {
103
+ type: String,
104
+ default: ''
105
+ },
106
+ // 服务名
107
+ serviceName: {
108
+ type: String,
109
+ default: 'af-his'
110
+ }
111
+ },
112
+ computed: {
113
+ rowSelection () {
114
+ return {
115
+ selectedRowKeys: this.selectedRowKeys,
116
+ onChange: (selectedRowKeys, selectedRows) => {
117
+ this.onSelectChange(selectedRowKeys, selectedRows)
118
+ }
119
+ }
120
+ }
121
+ },
122
+ mounted () {},
123
+ methods: {
124
+ handleShiftChange (day, index, record) {
125
+ // 找到当前记录在data中的索引
126
+ const dataIndex = this.data.findIndex(item => item.id === record.id)
127
+ if (dataIndex === -1) return
128
+ // 获取当前状态
129
+ const currentValue = record[day][index]
130
+ const newValue = currentValue === 1 || currentValue === '1' ? 0 : 1
131
+ // 更新按钮显示
132
+ this.$set(record[day], index, newValue)
133
+ // 同步更新data中的数据
134
+ this.$set(this.data[dataIndex][day], index, newValue)
135
+ },
136
+ onSelectChange (selectedRowKeys, selectedRows) {
137
+ this.selectedRowKeys = selectedRowKeys
138
+ this.selectedRows = selectedRows
139
+ },
140
+ // 获取选中的行数据
141
+ getSelectedRowData () {
142
+ return this.selectedRows
143
+ },
144
+ // 获取全部数据
145
+ getAllTable () {
146
+ return this.data
147
+ },
148
+ // 初始化数据
149
+ async init (queryParamsName) {
150
+ getConfigByName(queryParamsName, this.serviceName, result => {
151
+ this.configData = result
152
+ runLogic(result.dataSource, {}, this.serviceName).then(res => {
153
+ this.columns = []
154
+ this.columns = JSON.parse(JSON.stringify(this.configData.columns))
155
+ for (let i = 0; i < this.shiftTable.length; i++) {
156
+ this.columns.push(this.shiftTable[i])
157
+ }
158
+ if (res && Array.isArray(res)) {
159
+ const weekDays = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']
160
+ const shifts = ['am', 'pm', 'evening']
161
+ let key = 0
162
+ this.data = res.map(item => {
163
+ const scheduleData = {
164
+ key: key++
165
+ }
166
+ this.configData.columnsName.forEach(columnName => { scheduleData[columnName] = item[columnName] })
167
+ weekDays.forEach(day => {
168
+ scheduleData[day.charAt(0).toUpperCase() + day.slice(1)] = shifts.map(shift => item[`f_${day}_${shift}`] === '1' ? 1 : 0)
169
+ })
170
+ return scheduleData
171
+ })
172
+ // 保存原始数据
173
+ this.originalData = JSON.parse(JSON.stringify(this.data))
174
+ }
175
+ })
176
+ })
177
+ },
178
+ // 查询数据函数
179
+ filterTableData (filters) {
180
+ if (!filters || Object.keys(filters).length === 0) {
181
+ // 如果没有过滤条件,恢复原始数据
182
+ this.data = JSON.parse(JSON.stringify(this.originalData))
183
+ return
184
+ }
185
+ // 从原始数据开始过滤
186
+ this.data = this.originalData.filter(item => {
187
+ // 检查每一项是否满足所有过滤条件
188
+ return Object.entries(filters).every(([key, value]) => {
189
+ // 如果过滤值是字符串,进行模糊匹配
190
+ if (typeof value === 'string') {
191
+ return item[key] && item[key].toString().toLowerCase().includes(value.toLowerCase())
192
+ }
193
+ // 如果过滤值是数字,进行精确匹配
194
+ return item[key] === value
195
+ })
196
+ })
197
+ }
198
+ },
199
+ watch: {
200
+ queryParamsName: {
201
+ handler (newValue) {
202
+ this.init(newValue)
203
+ },
204
+ deep: true,
205
+ immediate: true
206
+ }
207
+ }
208
+ }
209
+ </script>
210
+
211
+ <style scoped type="less">
212
+ .time-title {
213
+ display: flex !important;
214
+ flex-direction: column !important;
215
+ align-items: center !important;
216
+ }
217
+ ::v-deep .ant-table-thead > tr > th,
218
+ ::v-deep .ant-table-tbody > tr > td {
219
+ padding: 8px 16px !important;
220
+ overflow-wrap: break-word;
221
+ }
222
+ </style>