|
|
|
|
@ -10,47 +10,45 @@
|
|
|
|
|
<el-option v-for="item in departments" :key="item.id" :label="item.name" :value="item.id">
|
|
|
|
|
</el-option>
|
|
|
|
|
</el-select>
|
|
|
|
|
<el-switch
|
|
|
|
|
style="margin-left:15px"
|
|
|
|
|
v-model="select.is_week"
|
|
|
|
|
:active-value="1"
|
|
|
|
|
:inactive-value="0"
|
|
|
|
|
active-text="双休"
|
|
|
|
|
inactive-text="节假日">
|
|
|
|
|
<el-switch style="margin-left:15px" v-model="select.is_week" :active-value="1" :inactive-value="0"
|
|
|
|
|
active-text="双休" inactive-text="节假日">
|
|
|
|
|
</el-switch>
|
|
|
|
|
<el-button icon="el-icon-search" type="primary" plain size="small" style="margin-left: 15px;"
|
|
|
|
|
@click="getList">搜索</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</vxe-toolbar>
|
|
|
|
|
<vxe-table ref="table" stripe :border='true' style="margin-top: 10px;border:1px solid #333" :loading="loading" :max-height="1400"
|
|
|
|
|
:min-height="400" :export-config="{type: 'xlsx',filename:exportName,sheetName:exportName}" :print-config="{}"
|
|
|
|
|
:column-config="{ resizable: true }" :expand-config="{
|
|
|
|
|
<vxe-table ref="table" stripe :border='true' style="margin-top: 10px;border:1px solid #333" :loading="loading"
|
|
|
|
|
:max-height="1400" :min-height="400" :export-config="{type: 'xlsx',filename:exportName,sheetName:exportName}"
|
|
|
|
|
:print-config="{}" :column-config="{ resizable: true }" :expand-config="{
|
|
|
|
|
visibleMethod: () => false,
|
|
|
|
|
trigger: 'manual'
|
|
|
|
|
}" :data="tableData" :merge-cells="mergeCells">
|
|
|
|
|
<!-- :span-method="spanMethods" -->
|
|
|
|
|
<vxe-column width="180" header-align="center" align="center" field="department_name" title="科室"></vxe-column>
|
|
|
|
|
<vxe-column width="120" header-align="center" align="center" field="name" title="姓名"></vxe-column>
|
|
|
|
|
<vxe-column width="100" header-align="center" align="center" field="name" title="姓名"></vxe-column>
|
|
|
|
|
<vxe-column width="180" header-align="center" align="center" field="kaishiriqi" title="日期">
|
|
|
|
|
<template #default="{ row }">
|
|
|
|
|
{{row.kaishiriqi?row.kaishiriqi.substring(0,11):''}}
|
|
|
|
|
</template>
|
|
|
|
|
</vxe-column>
|
|
|
|
|
<vxe-column width="120" header-align="center" align="center" field="day_type_name" title="类型"></vxe-column>
|
|
|
|
|
<vxe-column minWidth="180" header-align="center" align="center" field="yuanyinshuoming" title="加班事由"></vxe-column>
|
|
|
|
|
<vxe-column width="180" :export-method="exportjbMethod" header-align="center" align="center" field="jiabanshijian"
|
|
|
|
|
title="加班时间">
|
|
|
|
|
<vxe-column width="100" header-align="center" align="center" field="day_type_name" title="类型"></vxe-column>
|
|
|
|
|
<vxe-column minWidth="180" header-align="center" align="center" field="yuanyinshuoming"
|
|
|
|
|
title="加班事由"></vxe-column>
|
|
|
|
|
<vxe-column width="180" :export-method="exportjbMethod" header-align="center" align="center"
|
|
|
|
|
field="jiabanshijian" title="加班时间">
|
|
|
|
|
<template #default="{ row }">
|
|
|
|
|
{{row.kaishiriqi?row.kaishiriqi.substring(11,row.kaishiriqi.length):''}}-{{row.kaishiriqi?row.jieshushijian.substring(11,row.jieshushijian.length):''}}
|
|
|
|
|
</template>
|
|
|
|
|
</vxe-column>
|
|
|
|
|
<vxe-column width="120" header-align="center" align="center" field="jiabanshichang" title="加班时长(h)"></vxe-column>
|
|
|
|
|
<vxe-column width="120" header-align="center" align="center" field="convertTime" title="折算时长(h)"></vxe-column>
|
|
|
|
|
<vxe-column width="100" header-align="center" align="center" field="jiabanshichang"
|
|
|
|
|
title="加班时长(h)"></vxe-column>
|
|
|
|
|
<vxe-column width="100" header-align="center" align="center" field="convertTime" title="折算时长(h)"></vxe-column>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- <vxe-column header-align="center" align="center" field="day" title="day"></vxe-column> -->
|
|
|
|
|
<vxe-column width="120" header-align="center" align="center" field="allDay" title="本月累计(h)"></vxe-column>
|
|
|
|
|
<vxe-column width="120" header-align="center" align="center" field="allConvertTime" title="本月折算累计(h)"></vxe-column>
|
|
|
|
|
<vxe-column width="120" header-align="center" align="center" field="allConvertTime"
|
|
|
|
|
title="本月折算累计(h)"></vxe-column>
|
|
|
|
|
</vxe-table>
|
|
|
|
|
</card-container>
|
|
|
|
|
</div>
|
|
|
|
|
@ -74,10 +72,10 @@
|
|
|
|
|
page_size: 10,
|
|
|
|
|
month: this.$moment().format('YYYY-MM'),
|
|
|
|
|
department_id: '',
|
|
|
|
|
is_week:1
|
|
|
|
|
is_week: 1
|
|
|
|
|
},
|
|
|
|
|
my_department_id:"",
|
|
|
|
|
is_bgs:false, // 是否是办公室
|
|
|
|
|
my_department_id: "",
|
|
|
|
|
is_bgs: false, // 是否是办公室
|
|
|
|
|
departments: [],
|
|
|
|
|
mergeCells: [],
|
|
|
|
|
exportName: '加班统计表',
|
|
|
|
|
@ -118,7 +116,6 @@
|
|
|
|
|
let _arr = []
|
|
|
|
|
const result = [];
|
|
|
|
|
_arr = arr.filter(item => item.overtime && item.overtime.length > 0)
|
|
|
|
|
|
|
|
|
|
_arr.forEach(item => {
|
|
|
|
|
const {
|
|
|
|
|
id,
|
|
|
|
|
@ -126,40 +123,40 @@
|
|
|
|
|
department,
|
|
|
|
|
overtime
|
|
|
|
|
} = item;
|
|
|
|
|
let obj = {}
|
|
|
|
|
const allDay = overtime.reduce((sum, overtimeItem) => sum + parseFloat(overtimeItem.jiabanshichang), 0);
|
|
|
|
|
overtime.forEach(overtimeItem => {
|
|
|
|
|
let convertTime = 0 //折算加班
|
|
|
|
|
if(overtimeItem.day_type=='normal'){
|
|
|
|
|
if (overtimeItem.day_type == 'normal') {
|
|
|
|
|
overtimeItem.day_type_name = '工作日'
|
|
|
|
|
convertTime = parseFloat(overtimeItem.jiabanshichang) * 1.5
|
|
|
|
|
}else if(overtimeItem.day_type=='week'){
|
|
|
|
|
} else if (overtimeItem.day_type == 'week') {
|
|
|
|
|
overtimeItem.day_type_name = '双休日'
|
|
|
|
|
convertTime = parseFloat(overtimeItem.jiabanshichang) * 2
|
|
|
|
|
}else if(overtimeItem.day_type=='holiday'){
|
|
|
|
|
} else if (overtimeItem.day_type == 'holiday') {
|
|
|
|
|
overtimeItem.day_type_name = '节假日'
|
|
|
|
|
convertTime = parseFloat(overtimeItem.jiabanshichang) * 3
|
|
|
|
|
}
|
|
|
|
|
overtimeItem.convertTime = parseFloat(convertTime).toFixed(2);
|
|
|
|
|
});
|
|
|
|
|
const allConvertTime = overtime.reduce((sum, overtimeItem) => sum + parseFloat(overtimeItem.convertTime),
|
|
|
|
|
0);
|
|
|
|
|
overtime.forEach(overtimeItem => {
|
|
|
|
|
overtimeItem.pid = id;
|
|
|
|
|
overtimeItem.name = name;
|
|
|
|
|
overtimeItem.department_name = department.name
|
|
|
|
|
overtimeItem.sortnumber = department.sortnumber
|
|
|
|
|
overtimeItem.department_id = department.id
|
|
|
|
|
overtimeItem.convertTime = parseFloat(convertTime).toFixed(2);
|
|
|
|
|
overtimeItem.allDay = parseFloat(allDay).toFixed(2);
|
|
|
|
|
overtimeItem.allConvertTime = parseFloat(allConvertTime).toFixed(2);
|
|
|
|
|
result.push(overtimeItem);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 累计折算时长
|
|
|
|
|
const allConvertTime = result.reduce((sum, overtimeItem) => sum + parseFloat(overtimeItem.convertTime), 0);
|
|
|
|
|
result.forEach(overtimeItem => {
|
|
|
|
|
overtimeItem.allConvertTime = parseFloat(allConvertTime).toFixed(2);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
result.sort((a, b) => {
|
|
|
|
|
return a.sortnumber - b.sortnumber
|
|
|
|
|
})
|
|
|
|
|
});
|
|
|
|
|
this.mergeCells = this.generateMergeCells(result)
|
|
|
|
|
return result;
|
|
|
|
|
},
|
|
|
|
|
@ -181,14 +178,55 @@
|
|
|
|
|
},
|
|
|
|
|
// 合并单元格
|
|
|
|
|
generateMergeCells(data) {
|
|
|
|
|
const columns = this.$refs.table.getColumns()
|
|
|
|
|
const columns = this.$refs.table.getColumns();
|
|
|
|
|
let mergeCells = [];
|
|
|
|
|
const columnsToMerge = ['department_name', 'name', 'allDay','allConvertTime'];
|
|
|
|
|
const columnsToMerge = ['department_name', 'name', 'allDay', 'allConvertTime'];
|
|
|
|
|
|
|
|
|
|
columnsToMerge.forEach(key => {
|
|
|
|
|
const col = columns.findIndex(item => item['field'] === key);
|
|
|
|
|
if (col === -1) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (key === 'allDay' || key === 'allConvertTime') {
|
|
|
|
|
// 对于 allDay 和 allConvertTime 列,先按 name 分组处理
|
|
|
|
|
const groupedByName = {};
|
|
|
|
|
data.forEach((row, index) => {
|
|
|
|
|
const name = row.name;
|
|
|
|
|
if (!groupedByName[name]) {
|
|
|
|
|
groupedByName[name] = [];
|
|
|
|
|
}
|
|
|
|
|
groupedByName[name].push({
|
|
|
|
|
row,
|
|
|
|
|
index
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
for (const nameGroup of Object.values(groupedByName)) {
|
|
|
|
|
for (let i = 0; i < nameGroup.length; i++) {
|
|
|
|
|
let rowspan = 1;
|
|
|
|
|
const currentValue = nameGroup[i].row[key];
|
|
|
|
|
for (let j = i + 1; j < nameGroup.length; j++) {
|
|
|
|
|
if (nameGroup[j].row[key] === currentValue) {
|
|
|
|
|
rowspan++;
|
|
|
|
|
} else {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (rowspan > 1) {
|
|
|
|
|
const realRowIndex = nameGroup[i].index;
|
|
|
|
|
mergeCells.push({
|
|
|
|
|
row: realRowIndex,
|
|
|
|
|
col,
|
|
|
|
|
rowspan,
|
|
|
|
|
colspan: 1
|
|
|
|
|
});
|
|
|
|
|
i += rowspan - 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 对于其他列,正常合并相邻且值相同的单元格
|
|
|
|
|
for (let i = 0; i < data.length; i++) {
|
|
|
|
|
let rowspan = 1;
|
|
|
|
|
const currentValue = data[i][key];
|
|
|
|
|
@ -209,17 +247,19 @@
|
|
|
|
|
i += rowspan - 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return mergeCells;
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
|
computed: {},
|
|
|
|
|
created() {
|
|
|
|
|
this.my_department_id = store.state.department?store.state.department.id:''
|
|
|
|
|
this.dName = store.state.department?store.state.department.name:'全部科室'
|
|
|
|
|
if(this.my_department_id){
|
|
|
|
|
this.is_bgs = this.my_department_id==2?true:false
|
|
|
|
|
this.my_department_id = store.state.department ? store.state.department.id : ''
|
|
|
|
|
this.dName = store.state.department ? store.state.department.name : '全部科室'
|
|
|
|
|
if (this.my_department_id) {
|
|
|
|
|
this.is_bgs = this.my_department_id == 2 ? true : false
|
|
|
|
|
this.select.department_id = this.my_department_id
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
@ -237,12 +277,12 @@
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
|
|
|
|
|
|
|
::v-deep .vxe-body--column {
|
|
|
|
|
border-left: 1px solid #333 !important;
|
|
|
|
|
border-bottom: 1px solid #333 !important;
|
|
|
|
|
}
|
|
|
|
|
::v-deep th.vxe-header--column{
|
|
|
|
|
|
|
|
|
|
::v-deep th.vxe-header--column {
|
|
|
|
|
border-left: 1px solid #333 !important;
|
|
|
|
|
border-bottom: 2px solid #333 !important;
|
|
|
|
|
}
|
|
|
|
|
|