非在编加班统计

master
lion 8 months ago
parent 89d6102636
commit eed815548f

@ -5,52 +5,50 @@
<template #buttons> <template #buttons>
<el-date-picker v-model="select.month" type="month" size="small" value-format="yyyy-MM" placeholder="月份" <el-date-picker v-model="select.month" type="month" size="small" value-format="yyyy-MM" placeholder="月份"
format="yyyy-MM" /> format="yyyy-MM" />
<el-select v-if="is_bgs" style="width:250px;margin-left:6px" size="small" @change="changeDepartment" <el-select v-if="is_bgs" style="width:250px;margin-left:6px" size="small" @change="changeDepartment"
v-model="select.department_id" placeholder="请选择"> v-model="select.department_id" placeholder="请选择">
<el-option v-for="item in departments" :key="item.id" :label="item.name" :value="item.id"> <el-option v-for="item in departments" :key="item.id" :label="item.name" :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
<el-switch <el-switch style="margin-left:15px" v-model="select.is_week" :active-value="1" :inactive-value="0"
style="margin-left:15px" active-text="双休" inactive-text="节假日">
v-model="select.is_week"
:active-value="1"
:inactive-value="0"
active-text="双休"
inactive-text="节假日">
</el-switch> </el-switch>
<el-button icon="el-icon-search" type="primary" plain size="small" style="margin-left: 15px;" <el-button icon="el-icon-search" type="primary" plain size="small" style="margin-left: 15px;"
@click="getList">搜索</el-button> @click="getList">搜索</el-button>
</template> </template>
</vxe-toolbar> </vxe-toolbar>
<vxe-table ref="table" stripe :border='true' style="margin-top: 10px;border:1px solid #333" :loading="loading" :max-height="1400" <vxe-table ref="table" stripe :border='true' style="margin-top: 10px;border:1px solid #333" :loading="loading"
:min-height="400" :export-config="{type: 'xlsx',filename:exportName,sheetName:exportName}" :print-config="{}" :max-height="1400" :min-height="400" :export-config="{type: 'xlsx',filename:exportName,sheetName:exportName}"
:column-config="{ resizable: true }" :expand-config="{ :print-config="{}" :column-config="{ resizable: true }" :expand-config="{
visibleMethod: () => false, visibleMethod: () => false,
trigger: 'manual' trigger: 'manual'
}" :data="tableData" :merge-cells="mergeCells"> }" :data="tableData" :merge-cells="mergeCells">
<!-- :span-method="spanMethods" --> <!-- :span-method="spanMethods" -->
<vxe-column width="180" header-align="center" align="center" field="department_name" title="科室"></vxe-column> <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="日期"> <vxe-column width="180" header-align="center" align="center" field="kaishiriqi" title="日期">
<template #default="{ row }"> <template #default="{ row }">
{{row.kaishiriqi?row.kaishiriqi.substring(0,11):''}} {{row.kaishiriqi?row.kaishiriqi.substring(0,11):''}}
</template> </template>
</vxe-column> </vxe-column>
<vxe-column width="120" header-align="center" align="center" field="day_type_name" title="类型"></vxe-column> <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 minWidth="180" header-align="center" align="center" field="yuanyinshuoming"
<vxe-column width="180" :export-method="exportjbMethod" header-align="center" align="center" field="jiabanshijian" title="加班事由"></vxe-column>
title="加班时间"> <vxe-column width="180" :export-method="exportjbMethod" header-align="center" align="center"
field="jiabanshijian" title="加班时间">
<template #default="{ row }"> <template #default="{ row }">
{{row.kaishiriqi?row.kaishiriqi.substring(11,row.kaishiriqi.length):''}}-{{row.kaishiriqi?row.jieshushijian.substring(11,row.jieshushijian.length):''}} {{row.kaishiriqi?row.kaishiriqi.substring(11,row.kaishiriqi.length):''}}-{{row.kaishiriqi?row.jieshushijian.substring(11,row.jieshushijian.length):''}}
</template> </template>
</vxe-column> </vxe-column>
<vxe-column width="120" header-align="center" align="center" field="jiabanshichang" title="加班时长(h)"></vxe-column> <vxe-column width="100" header-align="center" align="center" field="jiabanshichang"
<vxe-column width="120" header-align="center" align="center" field="convertTime" title="折算时长(h)"></vxe-column> 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 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="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> </vxe-table>
</card-container> </card-container>
</div> </div>
@ -62,8 +60,8 @@
} from "@/api/chart" } from "@/api/chart"
import { import {
departmentListNoAuth departmentListNoAuth
} from "@/api/common.js" } from "@/api/common.js"
import store from "@/store/modules/user.js" import store from "@/store/modules/user.js"
export default { export default {
data() { data() {
return { return {
@ -73,11 +71,11 @@
page: 1, page: 1,
page_size: 10, page_size: 10,
month: this.$moment().format('YYYY-MM'), month: this.$moment().format('YYYY-MM'),
department_id: '', department_id: '',
is_week:1 is_week: 1
}, },
my_department_id:"", my_department_id: "",
is_bgs:false, // is_bgs: false, //
departments: [], departments: [],
mergeCells: [], mergeCells: [],
exportName: '加班统计表', exportName: '加班统计表',
@ -118,7 +116,6 @@
let _arr = [] let _arr = []
const result = []; const result = [];
_arr = arr.filter(item => item.overtime && item.overtime.length > 0) _arr = arr.filter(item => item.overtime && item.overtime.length > 0)
_arr.forEach(item => { _arr.forEach(item => {
const { const {
id, id,
@ -126,40 +123,40 @@
department, department,
overtime overtime
} = item; } = item;
const allDay = overtime.reduce((sum, overtimeItem) => sum + parseFloat(overtimeItem.jiabanshichang), 0); let obj = {}
overtime.forEach(overtimeItem => { const allDay = overtime.reduce((sum, overtimeItem) => sum + parseFloat(overtimeItem.jiabanshichang), 0);
let convertTime = 0 // overtime.forEach(overtimeItem => {
if(overtimeItem.day_type=='normal'){ let convertTime = 0 //
overtimeItem.day_type_name = '工作日' if (overtimeItem.day_type == 'normal') {
convertTime = parseFloat(overtimeItem.jiabanshichang) * 1.5 overtimeItem.day_type_name = '工作日'
}else if(overtimeItem.day_type=='week'){ convertTime = parseFloat(overtimeItem.jiabanshichang) * 1.5
overtimeItem.day_type_name = '双休日' } else if (overtimeItem.day_type == 'week') {
convertTime = parseFloat(overtimeItem.jiabanshichang) * 2 overtimeItem.day_type_name = '双休日'
}else if(overtimeItem.day_type=='holiday'){ convertTime = parseFloat(overtimeItem.jiabanshichang) * 2
overtimeItem.day_type_name = '节假日' } else if (overtimeItem.day_type == 'holiday') {
convertTime = parseFloat(overtimeItem.jiabanshichang) * 3 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.pid = id;
overtimeItem.name = name; overtimeItem.name = name;
overtimeItem.department_name = department.name overtimeItem.department_name = department.name
overtimeItem.sortnumber = department.sortnumber overtimeItem.sortnumber = department.sortnumber
overtimeItem.department_id = department.id overtimeItem.department_id = department.id
overtimeItem.convertTime = parseFloat(convertTime).toFixed(2);
overtimeItem.allDay = parseFloat(allDay).toFixed(2); overtimeItem.allDay = parseFloat(allDay).toFixed(2);
overtimeItem.allConvertTime = parseFloat(allConvertTime).toFixed(2);
result.push(overtimeItem); 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
})
}); });
result.sort((a, b) => {
return a.sortnumber - b.sortnumber
})
this.mergeCells = this.generateMergeCells(result) this.mergeCells = this.generateMergeCells(result)
return result; return result;
}, },
@ -181,47 +178,90 @@
}, },
// //
generateMergeCells(data) { generateMergeCells(data) {
const columns = this.$refs.table.getColumns() const columns = this.$refs.table.getColumns();
let mergeCells = []; let mergeCells = [];
const columnsToMerge = ['department_name', 'name', 'allDay','allConvertTime']; const columnsToMerge = ['department_name', 'name', 'allDay', 'allConvertTime'];
columnsToMerge.forEach(key => { columnsToMerge.forEach(key => {
const col = columns.findIndex(item => item['field'] === key); const col = columns.findIndex(item => item['field'] === key);
if (col === -1) { if (col === -1) {
return; return;
} }
for (let i = 0; i < data.length; i++) {
let rowspan = 1; if (key === 'allDay' || key === 'allConvertTime') {
const currentValue = data[i][key]; // allDay allConvertTime name
for (let j = i + 1; j < data.length; j++) { const groupedByName = {};
if (data[j][key] === currentValue) { data.forEach((row, index) => {
rowspan++; const name = row.name;
} else { if (!groupedByName[name]) {
break; groupedByName[name] = [];
} }
} groupedByName[name].push({
if (rowspan > 1) { row,
mergeCells.push({ index
row: i,
col,
rowspan,
colspan: 1
}); });
i += rowspan - 1; });
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];
for (let j = i + 1; j < data.length; j++) {
if (data[j][key] === currentValue) {
rowspan++;
} else {
break;
}
}
if (rowspan > 1) {
mergeCells.push({
row: i,
col,
rowspan,
colspan: 1
});
i += rowspan - 1;
}
} }
} }
}); });
return mergeCells; return mergeCells;
}, }
}, },
computed: {}, computed: {},
created() { created() {
this.my_department_id = store.state.department?store.state.department.id:'' this.my_department_id = store.state.department ? store.state.department.id : ''
this.dName = store.state.department?store.state.department.name:'全部科室' this.dName = store.state.department ? store.state.department.name : '全部科室'
if(this.my_department_id){ if (this.my_department_id) {
this.is_bgs = this.my_department_id==2?true:false this.is_bgs = this.my_department_id == 2 ? true : false
this.select.department_id = this.my_department_id this.select.department_id = this.my_department_id
} }
this.getDepartmentList() this.getDepartmentList()
this.getList() this.getList()
@ -236,14 +276,14 @@
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
::v-deep .vxe-body--column {
::v-deep .vxe-body--column { border-left: 1px solid #333 !important;
border-left: 1px solid #333 !important; border-bottom: 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-left: 1px solid #333 !important;
border-bottom: 2px solid #333 !important; border-bottom: 2px solid #333 !important;
} }
</style> </style>

Loading…
Cancel
Save