vue2-client 1.15.106 → 1.15.109
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/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114001.vue +342 -0
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114005.vue +342 -0
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114014.vue +345 -0
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114020.vue +345 -0
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114028.vue +345 -0
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114108.vue +345 -0
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114115.vue +345 -0
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114333.vue +346 -0
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114339.vue +350 -0
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114344.vue +355 -0
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114351.vue +355 -0
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114408.vue +355 -0
- package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114410.vue +355 -0
- package/package.json +1 -1
- package/src/base-client/components/common/XForm/XFormItem.vue +8 -26
- package/src/base-client/components/his/XImportExcelButton/XFrontImportExcelDemo.vue +3 -1
- package/src/base-client/components/his/XShiftSchedule/XShiftSchedule.vue +39 -26
- package/src/utils/routerUtil.js +7 -0
package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114001.vue
ADDED
@@ -0,0 +1,342 @@
|
|
1
|
+
<template>
|
2
|
+
<div v-if="pattern == 'schedule'">
|
3
|
+
<a-table
|
4
|
+
:columns="columns"
|
5
|
+
:data-source="data"
|
6
|
+
:rowSelection="rowSelection"
|
7
|
+
:scroll="{ y: configData.height == null? '70%' : configData.height }">
|
8
|
+
<span slot="time" class="time-title">
|
9
|
+
<span v-for="(item, index) in configData.timePeriod" :key="index">{{ item }}</span>
|
10
|
+
</span>
|
11
|
+
<div v-for="(item, index) in weekDays" :key="index" :slot="item.key" class="week_last_next_btn">
|
12
|
+
<a-button slot="lastWeek" icon="left" size="large" @click="handleLastWeek" v-if="item.title == '周一'" />
|
13
|
+
<div class="time-title">
|
14
|
+
<span>{{ item.title }}</span>
|
15
|
+
<span>{{ currentWeekDates[index].toLocaleDateString() }}</span>
|
16
|
+
</div>
|
17
|
+
<a-button slot="nextWeek" icon="right" size="large" @click="handleNextWeek" v-if="item.title == '周日'"/>
|
18
|
+
</div>
|
19
|
+
<template :slot="day.key" slot-scope="text, record" v-for="day in shiftTable">
|
20
|
+
<div class="time-title" :key="day.key">
|
21
|
+
<a-button v-for="(item, index) in record[day.key]" :key="index" @click="handleShiftChange(day.key, index, record)">{{ item === 1 || item === '1' ? '坐诊' : '休息' }}</a-button>
|
22
|
+
</div>
|
23
|
+
</template>
|
24
|
+
<template slot="sk_limit" slot-scope="text, record">
|
25
|
+
<a-input-number id="inputNumber" v-model="record.sk_limit" :min="configData.sk_limitMin" :max="configData.sk_limitMax" />
|
26
|
+
</template>
|
27
|
+
</a-table>
|
28
|
+
</div>
|
29
|
+
<div v-else-if="pattern == 'form'">
|
30
|
+
<a-table :columns="columns" :data-source='data' :row-selection="rowSelection" bordered :scroll="{ y: configData.height == null? '70%' : configData.height }">
|
31
|
+
<template v-for="(n, i) in inputColumns" :slot="n.dataIndex" slot-scope="text, record">
|
32
|
+
<div class="a-div" :key="i">
|
33
|
+
<a-input
|
34
|
+
v-for="(item, index) in n.row"
|
35
|
+
:key="index"
|
36
|
+
placeholder=""
|
37
|
+
class="ant-input"
|
38
|
+
v-model="record[n.dataIndex][index + 1]"
|
39
|
+
@input="handleInputChange(record, n.dataIndex, index + 1, $event.target.value)"
|
40
|
+
/>
|
41
|
+
</div>
|
42
|
+
</template>
|
43
|
+
<div class="a-div" v-for="(n, i) in numberColumns" :slot="n.dataIndex" :key="i">
|
44
|
+
<div v-for="(item, index) in n.row" :key="index" class="number">{{item}}</div>
|
45
|
+
</div>
|
46
|
+
</a-table>
|
47
|
+
</div>
|
48
|
+
</template>
|
49
|
+
<script>
|
50
|
+
import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
|
51
|
+
|
52
|
+
export default {
|
53
|
+
data () {
|
54
|
+
return {
|
55
|
+
// 高度
|
56
|
+
height: '70%',
|
57
|
+
// 输入框数据
|
58
|
+
inputData: [],
|
59
|
+
// 模式
|
60
|
+
pattern: 'schedule',
|
61
|
+
data: [],
|
62
|
+
// 列配置
|
63
|
+
columns: [],
|
64
|
+
// 列名
|
65
|
+
columnNames: [],
|
66
|
+
// 选中的行键值集合
|
67
|
+
selectedRows: [],
|
68
|
+
// 选中的行信息集合
|
69
|
+
selectedRowKeys: [],
|
70
|
+
// 原始数据备份
|
71
|
+
originalData: [],
|
72
|
+
// 配置参数
|
73
|
+
configData: {},
|
74
|
+
// 当前显示的周次日期
|
75
|
+
currentWeekDates: [],
|
76
|
+
weekDays: [...['周一', '周二', '周三', '周四', '周五', '周六', '周日'].map((title, index) => {
|
77
|
+
const key = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'][index]
|
78
|
+
return { title, key }
|
79
|
+
})],
|
80
|
+
// 排班时间表
|
81
|
+
shiftTable: [...['周一', '周二', '周三', '周四', '周五', '周六', '周日'].map((title, index) => {
|
82
|
+
const key = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'][index]
|
83
|
+
return {
|
84
|
+
key, dataIndex: key, scopedSlots: { customRender: key }, slots: { title: key }, align: 'center', width: key === 'Monday' || key === 'Sunday' ? 170 : 120
|
85
|
+
}
|
86
|
+
}),
|
87
|
+
{
|
88
|
+
title: '排班数',
|
89
|
+
key: 'sk_limit',
|
90
|
+
dataIndex: 'sk_limit',
|
91
|
+
scopedSlots: { customRender: 'sk_limit' },
|
92
|
+
align: 'center'
|
93
|
+
}
|
94
|
+
]
|
95
|
+
}
|
96
|
+
},
|
97
|
+
props: {
|
98
|
+
// 配置名
|
99
|
+
queryParamsName: {
|
100
|
+
type: String,
|
101
|
+
default: ''
|
102
|
+
},
|
103
|
+
// 服务名
|
104
|
+
serviceName: {
|
105
|
+
type: String,
|
106
|
+
default: 'af-his'
|
107
|
+
}
|
108
|
+
},
|
109
|
+
computed: {
|
110
|
+
rowSelection () {
|
111
|
+
return {
|
112
|
+
selectedRowKeys: this.selectedRowKeys,
|
113
|
+
onChange: (selectedRowKeys, selectedRows) => {
|
114
|
+
this.onSelectChange(selectedRowKeys, selectedRows)
|
115
|
+
}
|
116
|
+
}
|
117
|
+
},
|
118
|
+
inputColumns () {
|
119
|
+
return this.columns.filter(col => col.type === 'input')
|
120
|
+
},
|
121
|
+
numberColumns () {
|
122
|
+
return this.columns.filter(col => col.type === 'number')
|
123
|
+
}
|
124
|
+
},
|
125
|
+
mounted () {
|
126
|
+
this.initWeekDates()
|
127
|
+
},
|
128
|
+
methods: {
|
129
|
+
handleShiftChange (day, index, record) {
|
130
|
+
// 找到当前记录在data中的索引
|
131
|
+
const dataIndex = this.data.findIndex(item => item.id === record.id)
|
132
|
+
if (dataIndex === -1) return
|
133
|
+
// 获取当前状态
|
134
|
+
const currentValue = record[day][index]
|
135
|
+
const newValue = currentValue === 1 || currentValue === '1' ? 0 : 1
|
136
|
+
// 更新按钮显示
|
137
|
+
this.$set(record[day], index, newValue)
|
138
|
+
// 同步更新data中的数据
|
139
|
+
this.$set(this.data[dataIndex][day], index, newValue)
|
140
|
+
},
|
141
|
+
onSelectChange (selectedRowKeys, selectedRows) {
|
142
|
+
this.selectedRowKeys = selectedRowKeys
|
143
|
+
this.selectedRows = selectedRows
|
144
|
+
},
|
145
|
+
// 处理输入框数据变化
|
146
|
+
handleInputChange (record, field, index, value) {
|
147
|
+
// 更新数据
|
148
|
+
this.$set(record[field], index, value)
|
149
|
+
},
|
150
|
+
// 获取选中的行数据
|
151
|
+
getSelectedRowData () {
|
152
|
+
if (this.pattern === 'form') {
|
153
|
+
// 在form模式下,返回包含输入框数据的完整信息
|
154
|
+
return this.selectedRows.map(row => {
|
155
|
+
const result = { ...row }
|
156
|
+
// 将对象格式的输入框数据转换为数组格式
|
157
|
+
this.inputColumns.forEach(col => {
|
158
|
+
if (row[col.dataIndex] && typeof row[col.dataIndex] === 'object') {
|
159
|
+
const fieldData = row[col.dataIndex]
|
160
|
+
const arrayData = []
|
161
|
+
// 将对象转换为数组,保持键的顺序
|
162
|
+
Object.keys(fieldData).forEach(key => {
|
163
|
+
arrayData.push(fieldData[key])
|
164
|
+
})
|
165
|
+
result[col.dataIndex] = arrayData
|
166
|
+
}
|
167
|
+
})
|
168
|
+
return result
|
169
|
+
})
|
170
|
+
}
|
171
|
+
return this.selectedRows
|
172
|
+
},
|
173
|
+
// 获取全部数据
|
174
|
+
getAllTable () {
|
175
|
+
return this.data
|
176
|
+
},
|
177
|
+
// 初始化数据
|
178
|
+
async init (queryParamsName) {
|
179
|
+
getConfigByName(queryParamsName, this.serviceName, result => {
|
180
|
+
this.configData = result
|
181
|
+
runLogic(result.dataSource, {}, this.serviceName).then(res => {
|
182
|
+
this.columns = []
|
183
|
+
this.columns = JSON.parse(JSON.stringify(this.configData.columns))
|
184
|
+
this.pattern = result.pattern
|
185
|
+
if (this.pattern == 'schedule') {
|
186
|
+
for (let i = 0; i < this.shiftTable.length; i++) {
|
187
|
+
this.columns.push(this.shiftTable[i])
|
188
|
+
}
|
189
|
+
if (res && Array.isArray(res)) {
|
190
|
+
const weekDays = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']
|
191
|
+
const shifts = ['am', 'pm', 'evening']
|
192
|
+
let key = 0
|
193
|
+
this.data = res.map(item => {
|
194
|
+
const scheduleData = {
|
195
|
+
key: key++
|
196
|
+
}
|
197
|
+
this.configData.columnsName.forEach(columnName => { scheduleData[columnName] = item[columnName] })
|
198
|
+
weekDays.forEach(day => {
|
199
|
+
scheduleData[day.charAt(0).toUpperCase() + day.slice(1)] = shifts.map(shift => item[`f_${day}_${shift}`] === '1' ? 1 : 0)
|
200
|
+
})
|
201
|
+
return scheduleData
|
202
|
+
})
|
203
|
+
// 保存原始数据
|
204
|
+
this.originalData = JSON.parse(JSON.stringify(this.data))
|
205
|
+
}
|
206
|
+
} else if (this.pattern == 'form') {
|
207
|
+
const inputFields = this.configData.columns.filter(col => col.type === 'input').map(col => col.dataIndex)
|
208
|
+
this.data = res.map((item, index) => {
|
209
|
+
const newItem = {
|
210
|
+
...item,
|
211
|
+
key: item.id || `form_row_${index}_${Date.now()}` // 确保每行有唯一的key
|
212
|
+
}
|
213
|
+
inputFields.forEach(field => {
|
214
|
+
const column = this.configData.columns.find(col => col.dataIndex === field)
|
215
|
+
if (column && column.type === 'input' && column.row) {
|
216
|
+
const rowCount = column.row.length || 1 // 默认长度1
|
217
|
+
// 创建对象格式的数据,键为1,2,3...,值为空字符串
|
218
|
+
const fieldData = {}
|
219
|
+
for (let i = 1; i <= rowCount; i++) {
|
220
|
+
fieldData[i] = ''
|
221
|
+
}
|
222
|
+
newItem[field] = fieldData
|
223
|
+
} else {
|
224
|
+
newItem[field] = item[field] || ''
|
225
|
+
}
|
226
|
+
})
|
227
|
+
return newItem
|
228
|
+
})
|
229
|
+
}
|
230
|
+
})
|
231
|
+
})
|
232
|
+
},
|
233
|
+
// 查询数据函数
|
234
|
+
filterTableData (filters) {
|
235
|
+
if (!filters || Object.keys(filters).length === 0) {
|
236
|
+
// 如果没有过滤条件,恢复原始数据
|
237
|
+
this.data = JSON.parse(JSON.stringify(this.originalData))
|
238
|
+
return
|
239
|
+
}
|
240
|
+
// 从原始数据开始过滤
|
241
|
+
this.data = this.originalData.filter(item => {
|
242
|
+
// 检查每一项是否满足所有过滤条件
|
243
|
+
return Object.entries(filters).every(([key, value]) => {
|
244
|
+
// 如果过滤值是字符串,进行模糊匹配
|
245
|
+
if (typeof value === 'string') {
|
246
|
+
return item[key] && item[key].toString().toLowerCase().includes(value.toLowerCase())
|
247
|
+
}
|
248
|
+
// 如果过滤值是数字,进行精确匹配
|
249
|
+
return item[key] === value
|
250
|
+
})
|
251
|
+
})
|
252
|
+
},
|
253
|
+
// 初始化周次日期
|
254
|
+
initWeekDates () {
|
255
|
+
const today = new Date()
|
256
|
+
const currentDay = today.getDay() || 7 // 将周日的0转换为7
|
257
|
+
const monday = new Date(today)
|
258
|
+
monday.setDate(today.getDate() - currentDay + 1) // 设置为本周一
|
259
|
+
this.currentWeekDates = Array.from({ length: 7 }, (_, index) => {
|
260
|
+
const date = new Date(monday)
|
261
|
+
date.setDate(monday.getDate() + index)
|
262
|
+
return date
|
263
|
+
})
|
264
|
+
},
|
265
|
+
// 切换到上一周
|
266
|
+
handleLastWeek () {
|
267
|
+
const monday = new Date(this.currentWeekDates[0])
|
268
|
+
monday.setDate(monday.getDate() - 7)
|
269
|
+
this.updateWeekDates(monday)
|
270
|
+
},
|
271
|
+
// 切换到下一周
|
272
|
+
handleNextWeek () {
|
273
|
+
const monday = new Date(this.currentWeekDates[0])
|
274
|
+
monday.setDate(monday.getDate() + 7)
|
275
|
+
this.updateWeekDates(monday)
|
276
|
+
},
|
277
|
+
// 更新周次日期
|
278
|
+
updateWeekDates (monday) {
|
279
|
+
this.currentWeekDates = Array.from({ length: 7 }, (_, index) => {
|
280
|
+
const date = new Date(monday)
|
281
|
+
date.setDate(monday.getDate() + index)
|
282
|
+
return date
|
283
|
+
})
|
284
|
+
}
|
285
|
+
},
|
286
|
+
watch: {
|
287
|
+
queryParamsName: {
|
288
|
+
handler (newValue) {
|
289
|
+
this.init(newValue)
|
290
|
+
},
|
291
|
+
deep: true,
|
292
|
+
immediate: true
|
293
|
+
}
|
294
|
+
}
|
295
|
+
}
|
296
|
+
</script>
|
297
|
+
|
298
|
+
<style scoped>
|
299
|
+
.time-title {
|
300
|
+
display: flex !important;
|
301
|
+
flex-direction: column !important;
|
302
|
+
align-items: center !important;
|
303
|
+
}
|
304
|
+
.week_last_next_btn {
|
305
|
+
display: flex;
|
306
|
+
flex-direction: row;
|
307
|
+
align-items: center;
|
308
|
+
justify-content: center;
|
309
|
+
gap: 16px;
|
310
|
+
}
|
311
|
+
::v-deep .ant-table-thead > tr > th,
|
312
|
+
::v-deep .ant-table-tbody > tr > td {
|
313
|
+
padding: 8px 16px !important;
|
314
|
+
overflow-wrap: break-word;
|
315
|
+
}
|
316
|
+
.ant-input {
|
317
|
+
width: 100%;
|
318
|
+
}
|
319
|
+
.a-div{
|
320
|
+
display: flex;
|
321
|
+
flex-direction: column;
|
322
|
+
}
|
323
|
+
.number{
|
324
|
+
box-sizing: border-box;
|
325
|
+
margin: 0;
|
326
|
+
padding: 0;
|
327
|
+
font-variant: tabular-nums;
|
328
|
+
list-style: none;
|
329
|
+
font-feature-settings: 'tnum';
|
330
|
+
position: relative;
|
331
|
+
display: inline-block;
|
332
|
+
width: 100%;
|
333
|
+
height: 32px;
|
334
|
+
padding: 4px 11px;
|
335
|
+
color: rgba(0, 0, 0, 0.65);
|
336
|
+
font-size: 14px;
|
337
|
+
line-height: 1.5;
|
338
|
+
background-image: none;
|
339
|
+
border-radius: 4px;
|
340
|
+
transition: all 0.3s;
|
341
|
+
}
|
342
|
+
</style>
|
package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250811114005.vue
ADDED
@@ -0,0 +1,342 @@
|
|
1
|
+
<template>
|
2
|
+
<div v-if="pattern == 'schedule'">
|
3
|
+
<a-table
|
4
|
+
:columns="columns"
|
5
|
+
:data-source="data"
|
6
|
+
:rowSelection="rowSelection"
|
7
|
+
:scroll="{ y: configData.height == null? '70%' : configData.height }">
|
8
|
+
<span slot="time" class="time-title">
|
9
|
+
<span v-for="(item, index) in configData.timePeriod" :key="index">{{ item }}</span>
|
10
|
+
</span>
|
11
|
+
<div v-for="(item, index) in weekDays" :key="index" :slot="item.key" class="week_last_next_btn">
|
12
|
+
<a-button slot="lastWeek" icon="left" size="large" @click="handleLastWeek" v-if="item.title == '周一'" />
|
13
|
+
<div class="time-title">
|
14
|
+
<span>{{ item.title }}</span>
|
15
|
+
<span>{{ currentWeekDates[index].toLocaleDateString() }}</span>
|
16
|
+
</div>
|
17
|
+
<a-button slot="nextWeek" icon="right" size="large" @click="handleNextWeek" v-if="item.title == '周日'"/>
|
18
|
+
</div>
|
19
|
+
<template :slot="day.key" slot-scope="text, record" v-for="day in shiftTable">
|
20
|
+
<div class="time-title" :key="day.key">
|
21
|
+
<a-button v-for="(item, index) in record[day.key]" :key="index" @click="handleShiftChange(day.key, index, record)">{{ item === 1 || item === '1' ? '坐诊' : '休息' }}</a-button>
|
22
|
+
</div>
|
23
|
+
</template>
|
24
|
+
<template slot="sk_limit" slot-scope="text, record">
|
25
|
+
<a-input-number id="inputNumber" v-model="record.sk_limit" :min="configData.sk_limitMin" :max="configData.sk_limitMax" />
|
26
|
+
</template>
|
27
|
+
</a-table>
|
28
|
+
</div>
|
29
|
+
<div v-else-if="pattern == 'form'">
|
30
|
+
<a-table :columns="columns" :data-source='data' :row-selection="rowSelection" bordered :scroll="{ y: configData.height == null? '70%' : configData.height }">
|
31
|
+
<template v-for="(n, i) in inputColumns" :slot="n.dataIndex" slot-scope="text, record">
|
32
|
+
<div class="a-div" :key="i">
|
33
|
+
<a-input
|
34
|
+
v-for="(item, index) in n.row"
|
35
|
+
:key="index"
|
36
|
+
placeholder=""
|
37
|
+
class="ant-input"
|
38
|
+
v-model="record[n.dataIndex][index + 1]"
|
39
|
+
@input="handleInputChange(record, n.dataIndex, index + 1, $event.target.value)"
|
40
|
+
/>
|
41
|
+
</div>
|
42
|
+
</template>
|
43
|
+
<div class="a-div" v-for="(n, i) in numberColumns" :slot="n.dataIndex" :key="i">
|
44
|
+
<div v-for="(item, index) in n.row" :key="index" class="number">{{item}}</div>
|
45
|
+
</div>
|
46
|
+
</a-table>
|
47
|
+
</div>
|
48
|
+
</template>
|
49
|
+
<script>
|
50
|
+
import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
|
51
|
+
|
52
|
+
export default {
|
53
|
+
data () {
|
54
|
+
return {
|
55
|
+
// 高度
|
56
|
+
height: '70%',
|
57
|
+
// 输入框数据
|
58
|
+
inputData: [],
|
59
|
+
// 模式
|
60
|
+
pattern: 'schedule',
|
61
|
+
data: [],
|
62
|
+
// 列配置
|
63
|
+
columns: [],
|
64
|
+
// 列名
|
65
|
+
columnNames: [],
|
66
|
+
// 选中的行键值集合
|
67
|
+
selectedRows: [],
|
68
|
+
// 选中的行信息集合
|
69
|
+
selectedRowKeys: [],
|
70
|
+
// 原始数据备份
|
71
|
+
originalData: [],
|
72
|
+
// 配置参数
|
73
|
+
configData: {},
|
74
|
+
// 当前显示的周次日期
|
75
|
+
currentWeekDates: [],
|
76
|
+
weekDays: [...['周一', '周二', '周三', '周四', '周五', '周六', '周日'].map((title, index) => {
|
77
|
+
const key = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'][index]
|
78
|
+
return { title, key }
|
79
|
+
})],
|
80
|
+
// 排班时间表
|
81
|
+
shiftTable: [...['周一', '周二', '周三', '周四', '周五', '周六', '周日'].map((title, index) => {
|
82
|
+
const key = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'][index]
|
83
|
+
return {
|
84
|
+
key, dataIndex: key, scopedSlots: { customRender: key }, slots: { title: key }, align: 'center', width: key === 'Monday' || key === 'Sunday' ? 170 : 120
|
85
|
+
}
|
86
|
+
}),
|
87
|
+
{
|
88
|
+
title: '排班数',
|
89
|
+
key: 'sk_limit',
|
90
|
+
dataIndex: 'sk_limit',
|
91
|
+
scopedSlots: { customRender: 'sk_limit' },
|
92
|
+
align: 'center'
|
93
|
+
}
|
94
|
+
]
|
95
|
+
}
|
96
|
+
},
|
97
|
+
props: {
|
98
|
+
// 配置名
|
99
|
+
queryParamsName: {
|
100
|
+
type: String,
|
101
|
+
default: ''
|
102
|
+
},
|
103
|
+
// 服务名
|
104
|
+
serviceName: {
|
105
|
+
type: String,
|
106
|
+
default: 'af-his'
|
107
|
+
}
|
108
|
+
},
|
109
|
+
computed: {
|
110
|
+
rowSelection () {
|
111
|
+
return {
|
112
|
+
selectedRowKeys: this.selectedRowKeys,
|
113
|
+
onChange: (selectedRowKeys, selectedRows) => {
|
114
|
+
this.onSelectChange(selectedRowKeys, selectedRows)
|
115
|
+
}
|
116
|
+
}
|
117
|
+
},
|
118
|
+
inputColumns () {
|
119
|
+
return this.columns.filter(col => col.type === 'input')
|
120
|
+
},
|
121
|
+
numberColumns () {
|
122
|
+
return this.columns.filter(col => col.type === 'number')
|
123
|
+
}
|
124
|
+
},
|
125
|
+
mounted () {
|
126
|
+
this.initWeekDates()
|
127
|
+
},
|
128
|
+
methods: {
|
129
|
+
handleShiftChange (day, index, record) {
|
130
|
+
// 找到当前记录在data中的索引
|
131
|
+
const dataIndex = this.data.findIndex(item => item.id === record.id)
|
132
|
+
if (dataIndex === -1) return
|
133
|
+
// 获取当前状态
|
134
|
+
const currentValue = record[day][index]
|
135
|
+
const newValue = currentValue === 1 || currentValue === '1' ? 0 : 1
|
136
|
+
// 更新按钮显示
|
137
|
+
this.$set(record[day], index, newValue)
|
138
|
+
// 同步更新data中的数据
|
139
|
+
this.$set(this.data[dataIndex][day], index, newValue)
|
140
|
+
},
|
141
|
+
onSelectChange (selectedRowKeys, selectedRows) {
|
142
|
+
this.selectedRowKeys = selectedRowKeys
|
143
|
+
this.selectedRows = selectedRows
|
144
|
+
},
|
145
|
+
// 处理输入框数据变化
|
146
|
+
handleInputChange (record, field, index, value) {
|
147
|
+
// 更新数据
|
148
|
+
this.$set(record[field], index, value)
|
149
|
+
},
|
150
|
+
// 获取选中的行数据
|
151
|
+
getSelectedRowData () {
|
152
|
+
if (this.pattern === 'form') {
|
153
|
+
// 在form模式下,返回包含输入框数据的完整信息
|
154
|
+
return this.selectedRows.map(row => {
|
155
|
+
const result = { ...row }
|
156
|
+
// 将对象格式的输入框数据转换为数组格式
|
157
|
+
this.inputColumns.forEach(col => {
|
158
|
+
if (row[col.dataIndex] && typeof row[col.dataIndex] === 'object') {
|
159
|
+
const fieldData = row[col.dataIndex]
|
160
|
+
const arrayData = []
|
161
|
+
// 将对象转换为数组,保持键的顺序
|
162
|
+
Object.keys(fieldData).forEach(key => {
|
163
|
+
arrayData.push(fieldData[key])
|
164
|
+
})
|
165
|
+
result[col.dataIndex] = arrayData
|
166
|
+
}
|
167
|
+
})
|
168
|
+
return result
|
169
|
+
})
|
170
|
+
}
|
171
|
+
return this.selectedRows
|
172
|
+
},
|
173
|
+
// 获取全部数据
|
174
|
+
getAllTable () {
|
175
|
+
return this.data
|
176
|
+
},
|
177
|
+
// 初始化数据
|
178
|
+
async init (queryParamsName) {
|
179
|
+
getConfigByName(queryParamsName, this.serviceName, result => {
|
180
|
+
this.configData = result
|
181
|
+
runLogic(result.dataSource, {}, this.serviceName).then(res => {
|
182
|
+
this.columns = []
|
183
|
+
this.columns = JSON.parse(JSON.stringify(this.configData.columns))
|
184
|
+
this.pattern = result.pattern
|
185
|
+
if (this.pattern == 'schedule') {
|
186
|
+
for (let i = 0; i < this.shiftTable.length; i++) {
|
187
|
+
this.columns.push(this.shiftTable[i])
|
188
|
+
}
|
189
|
+
if (res && Array.isArray(res)) {
|
190
|
+
const weekDays = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']
|
191
|
+
const shifts = ['am', 'pm', 'evening']
|
192
|
+
let key = 0
|
193
|
+
this.data = res.map(item => {
|
194
|
+
const scheduleData = {
|
195
|
+
key: key++
|
196
|
+
}
|
197
|
+
this.configData.columnsName.forEach(columnName => { scheduleData[columnName] = item[columnName] })
|
198
|
+
weekDays.forEach(day => {
|
199
|
+
scheduleData[day.charAt(0).toUpperCase() + day.slice(1)] = shifts.map(shift => item[`f_${day}_${shift}`] === '1' ? 1 : 0)
|
200
|
+
})
|
201
|
+
return scheduleData
|
202
|
+
})
|
203
|
+
// 保存原始数据
|
204
|
+
this.originalData = JSON.parse(JSON.stringify(this.data))
|
205
|
+
}
|
206
|
+
} else if (this.pattern == 'form') {
|
207
|
+
const inputFields = this.configData.columns.filter(col => col.type === 'input').map(col => col.dataIndex)
|
208
|
+
this.data = res.map((item, index) => {
|
209
|
+
const newItem = {
|
210
|
+
...item,
|
211
|
+
key: item.id || `form_row_${index}_${Date.now()}` // 确保每行有唯一的key
|
212
|
+
}
|
213
|
+
inputFields.forEach(field => {
|
214
|
+
const column = this.configData.columns.find(col => col.dataIndex === field)
|
215
|
+
if (column && column.type === 'input' && column.row) {
|
216
|
+
const rowCount = column.row.length || 1 // 默认长度1
|
217
|
+
// 创建对象格式的数据,键为1,2,3...,值为空字符串
|
218
|
+
const fieldData = {}
|
219
|
+
for (let i = 1; i <= rowCount; i++) {
|
220
|
+
fieldData[i] = ''
|
221
|
+
}
|
222
|
+
newItem[field] = fieldData
|
223
|
+
} else {
|
224
|
+
newItem[field] = item[field] || ''
|
225
|
+
}
|
226
|
+
})
|
227
|
+
return newItem
|
228
|
+
})
|
229
|
+
}
|
230
|
+
})
|
231
|
+
})
|
232
|
+
},
|
233
|
+
// 查询数据函数
|
234
|
+
filterTableData (filters) {
|
235
|
+
if (!filters || Object.keys(filters).length === 0) {
|
236
|
+
// 如果没有过滤条件,恢复原始数据
|
237
|
+
this.data = JSON.parse(JSON.stringify(this.originalData))
|
238
|
+
return
|
239
|
+
}
|
240
|
+
// 从原始数据开始过滤
|
241
|
+
this.data = this.originalData.filter(item => {
|
242
|
+
// 检查每一项是否满足所有过滤条件
|
243
|
+
return Object.entries(filters).every(([key, value]) => {
|
244
|
+
// 如果过滤值是字符串,进行模糊匹配
|
245
|
+
if (typeof value === 'string') {
|
246
|
+
return item[key] && item[key].toString().toLowerCase().includes(value.toLowerCase())
|
247
|
+
}
|
248
|
+
// 如果过滤值是数字,进行精确匹配
|
249
|
+
return item[key] === value
|
250
|
+
})
|
251
|
+
})
|
252
|
+
},
|
253
|
+
// 初始化周次日期
|
254
|
+
initWeekDates () {
|
255
|
+
const today = new Date()
|
256
|
+
const currentDay = today.getDay() || 7 // 将周日的0转换为7
|
257
|
+
const monday = new Date(today)
|
258
|
+
monday.setDate(today.getDate() - currentDay + 1) // 设置为本周一
|
259
|
+
this.currentWeekDates = Array.from({ length: 7 }, (_, index) => {
|
260
|
+
const date = new Date(monday)
|
261
|
+
date.setDate(monday.getDate() + index)
|
262
|
+
return date
|
263
|
+
})
|
264
|
+
},
|
265
|
+
// 切换到上一周
|
266
|
+
handleLastWeek () {
|
267
|
+
const monday = new Date(this.currentWeekDates[0])
|
268
|
+
monday.setDate(monday.getDate() - 7)
|
269
|
+
this.updateWeekDates(monday)
|
270
|
+
},
|
271
|
+
// 切换到下一周
|
272
|
+
handleNextWeek () {
|
273
|
+
const monday = new Date(this.currentWeekDates[0])
|
274
|
+
monday.setDate(monday.getDate() + 7)
|
275
|
+
this.updateWeekDates(monday)
|
276
|
+
},
|
277
|
+
// 更新周次日期
|
278
|
+
updateWeekDates (monday) {
|
279
|
+
this.currentWeekDates = Array.from({ length: 7 }, (_, index) => {
|
280
|
+
const date = new Date(monday)
|
281
|
+
date.setDate(monday.getDate() + index)
|
282
|
+
return date
|
283
|
+
})
|
284
|
+
}
|
285
|
+
},
|
286
|
+
watch: {
|
287
|
+
queryParamsName: {
|
288
|
+
handler (newValue) {
|
289
|
+
this.init(newValue)
|
290
|
+
},
|
291
|
+
deep: true,
|
292
|
+
immediate: true
|
293
|
+
}
|
294
|
+
}
|
295
|
+
}
|
296
|
+
</script>
|
297
|
+
|
298
|
+
<style scoped>
|
299
|
+
.time-title {
|
300
|
+
display: flex !important;
|
301
|
+
flex-direction: column !important;
|
302
|
+
align-items: center !important;
|
303
|
+
}
|
304
|
+
.week_last_next_btn {
|
305
|
+
display: flex;
|
306
|
+
flex-direction: row;
|
307
|
+
align-items: center;
|
308
|
+
justify-content: center;
|
309
|
+
gap: 16px;
|
310
|
+
}
|
311
|
+
::v-deep .ant-table-thead > tr > th,
|
312
|
+
::v-deep .ant-table-tbody > tr > td {
|
313
|
+
padding: 8px 16px !important;
|
314
|
+
overflow-wrap: break-word;
|
315
|
+
}
|
316
|
+
.ant-input {
|
317
|
+
width: 100%;
|
318
|
+
}
|
319
|
+
.a-div{
|
320
|
+
display: flex;
|
321
|
+
flex-direction: column;
|
322
|
+
}
|
323
|
+
.number{
|
324
|
+
box-sizing: border-box;
|
325
|
+
margin: 0;
|
326
|
+
padding: 0;
|
327
|
+
font-variant: tabular-nums;
|
328
|
+
list-style: none;
|
329
|
+
font-feature-settings: 'tnum';
|
330
|
+
position: relative;
|
331
|
+
display: inline-block;
|
332
|
+
width: 100%;
|
333
|
+
height: 32px;
|
334
|
+
padding: 4px 11px;
|
335
|
+
color: rgba(0, 0, 0, 0.65);
|
336
|
+
font-size: 14px;
|
337
|
+
line-height: 1.5;
|
338
|
+
background-image: none;
|
339
|
+
border-radius: 4px;
|
340
|
+
transition: all 0.3s;
|
341
|
+
}
|
342
|
+
</style>
|