You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

267 lines
9.5 KiB

9 months ago
<template>
<div>
<card-container>
<vxe-toolbar print custom export>
<template #buttons>
<el-date-picker v-model="select.month" type="month" size="small" value-format="yyyy-MM" placeholder="月份"
format="yyyy-MM" />
9 months ago
<el-select v-if="is_bgs" style="width:250px;margin-left:6px" size="small" @change="changeDepartment"
9 months ago
v-model="select.department_id" placeholder="请选择">
9 months ago
<el-option v-for="item in departments" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
<el-button icon="el-icon-search" type="primary" plain size="small" style="margin-left: 15px;"
6 months ago
@click="getList">搜索</el-button>
<el-popover
v-if="is_bgs"
placement="bottom-start"
title="导入加班"
width="400"
trigger="click">
<template #reference>
<el-button style="margin-left: 10px;" type="primary" size="small" icon="el-icon-upload">导入加班</el-button>
</template>
<template #default>
<el-upload
ref="upload"
:action="action"
:on-success="uploadSuccess"
accept=".xls,.xlsx"
:headers="{
'Authorization': 'Bearer ' + getToken()
}"
:auto-upload="false">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<el-button style="margin-left: 10px;" size="small" type="success" @click="uploadData"></el-button>
<div slot="tip" class="el-upload__tip">只能上传xls/xlsx文件</div>
</el-upload>
</template>
</el-popover>
9 months ago
</template>
</vxe-toolbar>
9 months ago
<vxe-table ref="table" stripe :border='true' style="margin-top: 10px;border:1px solid #333" :loading="loading" :max-height="1400"
9 months ago
:min-height="400" :export-config="{type: 'xlsx',filename:exportName,sheetName:exportName}" :print-config="{}"
:column-config="{ resizable: true }" :expand-config="{
9 months ago
visibleMethod: () => false,
trigger: 'manual'
9 months ago
}" :data="tableData" :merge-cells="mergeCells">
<!-- :span-method="spanMethods" -->
9 months ago
<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="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>
9 months ago
<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"
9 months ago
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>
9 months ago
<vxe-column width="180" header-align="center" align="center" field="jiabanshichang" title="加班时长(h)"></vxe-column>
9 months ago
<!-- <vxe-column header-align="center" align="center" field="day" title="day"></vxe-column> -->
9 months ago
<vxe-column width="180" header-align="center" align="center" field="allDay" title="本月累计(h)"></vxe-column>
9 months ago
</vxe-table>
</card-container>
</div>
</template>
<script>
import {
overtimeList
} from "@/api/chart"
import {
departmentListNoAuth
9 months ago
} from "@/api/common.js"
6 months ago
import store from "@/store/modules/user.js"
import { getToken } from "@/utils/auth";
9 months ago
export default {
data() {
return {
loading: false,
6 months ago
tableData: [],
action: `${process.env.VUE_APP_BASE_API}/api/oa/statistics/import-overtime`, // 导入加班
9 months ago
select: {
page: 1,
page_size: 10,
month: this.$moment().format('YYYY-MM'),
department_id: '',
9 months ago
},
my_department_id:"",
is_bgs:false, // 是否是办公室
9 months ago
departments: [],
9 months ago
mergeCells: [],
exportName: '加班统计表',
dName: '全部科室'
9 months ago
}
},
6 months ago
methods: {
// 导入加班
getToken,
uploadData() {
this.$refs.upload.submit();
},
uploadSuccess(response) {
console.log(response)
let arr = response.data
let str = ''
if(arr.err.length>0){
arr.err.map(item=>{
str+=`${item}`
})
this.$message.error(`${str}导入失败`)
this.getList(true)
}else{
this.$message.success(`导入成功`)
this.getList(true)
}
},
9 months ago
async getList() {
this.loading = true;
try {
const res = await overtimeList(this.select, false);
console.log(res);
let data = res?.users || [];
9 months ago
this.tableData = this.overtimeData(data)
let date = this.$moment(this.select.month).format("YYYY年MM月")
this.exportName = `${date}${this.dName}加班统计表`
9 months ago
this.loading = false;
} catch (err) {
console.error(err);
this.loading = false;
}
},
async getDepartmentList() {
try {
const res = await departmentListNoAuth();
console.log(res);
let arr = res
this.departments = arr
this.departments.unshift({
id: '',
name: '全部'
})
} catch (err) {
console.error(err);
}
},
overtimeData(arr) {
let _arr = []
const result = [];
_arr = arr.filter(item => item.overtime.length > 0)
_arr.forEach(item => {
const {
id,
name,
department,
overtime
} = item;
const allDay = overtime.reduce((sum, overtimeItem) => sum + parseFloat(overtimeItem.jiabanshichang), 0);
9 months ago
overtime.forEach(overtimeItem => {
overtimeItem.pid = id;
overtimeItem.name = name;
overtimeItem.department_name = department.name
9 months ago
overtimeItem.sortnumber = department.sortnumber
overtimeItem.department_id = department.id
9 months ago
overtimeItem.allDay = parseFloat(allDay).toFixed(2);
9 months ago
result.push(overtimeItem);
});
9 months ago
result.sort((a, b) => {
return a.sortnumber - b.sortnumber
})
9 months ago
});
9 months ago
this.mergeCells = this.generateMergeCells(result)
9 months ago
return result;
},
exportjbMethod({
row
}) {
return `${row.kaishiriqi?row.kaishiriqi.substring(11,row.kaishiriqi.length):''}-${row.kaishiriqi?row.jieshushijian.substring(11,row.jieshushijian.length):''}`
},
9 months ago
changeDepartment(e) {
if (e) {
this.departments.map(item => {
if (item.id == e) {
this.dName = item.name
9 months ago
}
9 months ago
})
} else {
this.dName = '全部科室'
9 months ago
}
},
// 合并单元格
9 months ago
generateMergeCells(data) {
const columns = this.$refs.table.getColumns()
let mergeCells = [];
const columnsToMerge = ['department_name', 'name', 'allDay'];
columnsToMerge.forEach(key => {
const col = columns.findIndex(item => item['field'] === key);
if (col === -1) {
return;
}
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;
9 months ago
}
}
9 months ago
});
9 months ago
return mergeCells;
9 months ago
},
9 months ago
},
computed: {},
9 months ago
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.select.department_id = this.my_department_id
}
9 months ago
this.getDepartmentList()
this.getList()
},
mounted() {
this.$nextTick(() => {
if (this.$refs["table"] && this.$refs["toolbar"]) {
this.$refs["table"].connect(this.$refs["toolbar"]);
}
});
},
}
</script>
9 months ago
<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{
border-left: 1px solid #333 !important;
border-bottom: 2px solid #333 !important;
}
9 months ago
</style>