master
lion 9 months ago
parent abe6ccaf1f
commit 0b529ba1ed

@ -69,9 +69,9 @@ export default {
})
// When there is only one child router, the child router is displayed by default
if (showingChildren.length === 1) {
return true
}
// if (showingChildren.length === 1) {
// return true
// }
// Show parent if there are no child router to display
if (showingChildren.length === 0) {

@ -7,13 +7,13 @@ import Nested from "@/layout/nested.vue"
const loadView = (view) => {
return (resolve) => require([`@/views${view}`], resolve);
}
const componentHandle = (path, route)=> {
if (/^#+/.test(path)) {
const componentHandle = (url, route)=> {
if (/^#+/.test(route.path) && route.pid === 0) {
return Layout
} else if (/^#+/.test(path) && route.pid !== 0) {
} else if (/^#+/.test(route.path) && route.pid !== 0) {
return Nested
} else {
return loadView(path)
return loadView(url)
}
}
@ -22,6 +22,23 @@ export function filterAsyncRoutes(routes) {
routes.forEach(route => {
if (!route.visible) return
let params = {};
if(route.path?.includes('?')){
let flag = route.path.split('?')
route.path = flag[0]
if(flag[1]){
let list = flag[1].split('&')
list.forEach(item => {
let kv = item.split('=')
Object.defineProperty(params,kv[0],{
value:kv[1],
writable:true,
enumerable:true,
configurable:false
})
})
}
}
let tmp= {
key: `key-${route.id}`,
path: route.path === '#' ? '' : route.path,
@ -33,6 +50,7 @@ export function filterAsyncRoutes(routes) {
icon: route.icon,
guard: route.guard_name,
folder: route.folder,
params
}
}

@ -1,78 +1,110 @@
<template>
<div>
<card-container>
<vxe-grid v-bind="tableData">
<template #toolbarButtons>
<el-date-picker v-model="select.year" type="year" size="small" value-format="yyyy"></el-date-picker>
<el-button icon="el-icon-search" type="primary" plain size="small" style="margin-left: 6px;" @click="getData"></el-button>
</template>
</vxe-grid>
</card-container>
</div>
</template>
<script>
import { leaveByYear } from '@/api/attendance'
export default {
data() {
return {
select: {
year: new Date().getFullYear().toString()
},
tableData: {}
}
},
methods: {
async getData() {
try {
const res = await leaveByYear(this.select)
if (res[0].other) {
this.tableData = {
minHeight: 200,
maxHeight: 600,
toolbarConfig: {
print: true,
export: true,
custom: true,
slots: {
buttons: 'toolbarButtons'
}
},
sortConfig: {
},
columns: [
{
title: '姓名',
field: 'name',
width: 120,
align: 'center',
filters: [{ data: '' }],
filterRender: {
name: 'input'
}
},
...Object.keys(res[0].other)?.map(key => ({
title: key,
width: 'auto',
field: 'other',
align: 'center',
formatter: ({ cellValue }) => cellValue[key] ?? 0,
}))
],
data: res
}
}
} catch (err) {
console.error(err)
}
}
},
computed: {},
created() {
this.getData()
}
}
</script>
<style scoped lang="scss">
<template>
<div>
<card-container>
<vxe-toolbar print custom export>
<template #buttons>
<el-date-picker v-model="select.month" type="month" size="small" value-format="MM" placeholder="月份"
format="yyyy-MM" />
<!-- <el-select v-if="is_bgs" style="width:250px;margin-left:6px" size="small" @change="changeDepartment"
v-model="select.department_id" placeholder="请选择">
<el-option v-for="item in departments" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select> -->
<el-select style="width:250px;margin-left:6px" size="small" v-model="select.department_id" placeholder="请选择">
<el-option v-for="item in departments" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
<el-input size="small" style="width:250px;margin-left:6px" v-model="select.keyword"
placeholder="请输入关键词"></el-input>
<el-button icon="el-icon-search" type="primary" plain size="small" style="margin-left: 15px;"
@click="getData">搜索</el-button>
</template>
</vxe-toolbar>
<vxe-table ref="table" stripe :border='true' style="margin-top: 10px;" :min-height="400" :max-height="600"
:export-config="{type: 'xlsx'}" :print-config="{}" :column-config="{ resizable: true }" :sort-config="{}"
:data="tableData">
<!-- :span-method="spanMethods" -->
<!-- :filters="[{ 'data': '' }]",
:filterRender="{ name: 'input' }" -->
<vxe-column width="120" header-align="center" fixed="left" align="center" field="user.name" title="姓名"
:filters="[{'user.name':''}]" :filterRender="{
name: 'input',
}"></vxe-column>
<vxe-column width="120" header-align="center" align="center" field="year_holiday" title="年休假总天数"></vxe-column>
<vxe-column width="120" header-align="center" align="center" field="annual_leave_days"
title="年休假天数"></vxe-column>
<vxe-column width="120" header-align="center" align="center" field="overtime_days" title="加班天数"></vxe-column>
<vxe-column width="120" header-align="center" align="center" field="chuchai_days" title="出差天数"></vxe-column>
<vxe-column width="80" header-align="center" align="center" field="personal_leave" title="事假"></vxe-column>
<vxe-column width="80" header-align="center" align="center" field="sick_leave" title="病假"></vxe-column>
<vxe-column width="80" header-align="center" align="center" field="marriage_leave" title="婚假"></vxe-column>
<vxe-column width="80" header-align="center" align="center" field="pregnant_leave" title="产假"></vxe-column>
<vxe-column width="120" header-align="center" align="center" field="nursing_leave" title="护理假"></vxe-column>
<vxe-column width="120" header-align="center" align="center" field="birth_leave" title="育儿假"></vxe-column>
<vxe-column width="80" header-align="center" align="center" field="death_leave" title="丧假"></vxe-column>
<vxe-column width="120" header-align="center" align="center" field="injured" title="工伤假"></vxe-column>
<vxe-column width="180" header-align="center" align="center" field="nursing_leave_birth"
title="独生子女带薪护理假"></vxe-column>
<vxe-column width="80" header-align="center" align="center" field="rest_leave" title="调休"></vxe-column>
<vxe-column width="80" header-align="center" align="center" field="other_leave" title="其他"></vxe-column>
</vxe-table>
</card-container>
</div>
</template>
<script>
import {
leaveByYear
} from '@/api/attendance'
import {
departmentListNoAuth
} from "@/api/common.js"
export default {
data() {
return {
select: {
month: (new Date().getMonth() + 1) < 10 ? '0' + (new Date().getMonth() + 1) : new Date().getMonth(),
department_id: '',
keyword: ''
},
tableData: [],
departments: []
}
},
methods: {
async getData() {
try {
const res = await leaveByYear(this.select)
this.tableData = res
} catch (err) {
console.error(err)
}
},
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);
}
},
},
computed: {},
created() {
this.getData()
this.getDepartmentList()
}
}
</script>
<style scoped lang="scss">
</style>

@ -4,15 +4,21 @@
<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" />
format="yyyy-MM" />
<!-- v-if="is_bgs" -->
<el-select v-if="is_bgs" style="width:250px;margin-left:6px" size="small" @change="changeDepartment"
v-model="select.department_id" placeholder="请选择">
<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"
<!-- <el-switch style="margin-left:15px" v-model="select.is_week" :active-value="1" :inactive-value="0"
active-text="双休" inactive-text="节假日">
</el-switch>
</el-switch> -->
<el-radio-group style="margin-left:15px" v-model="select.is_week">
<el-radio :label="0">工作日/节假日</el-radio>
<el-radio :label="1">双休</el-radio>
</el-radio-group>
<el-button icon="el-icon-search" type="primary" plain size="small" style="margin-left: 15px;"
@click="getList">搜索</el-button>
</template>
@ -48,7 +54,15 @@
<!-- <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>
title="本月折算累计(h)"></vxe-column>
<vxe-column width="120" header-align="center" align="center" field="time_off"
title="调休汇总(h)"></vxe-column>
<vxe-column width="120" header-align="center" align="center" field="use_overtime"
title="扣减调休后汇总(h)"></vxe-column>
<vxe-column width="120" header-align="center" align="center" field="discount"
title="扣减调休后的折算累计(h)"></vxe-column>
</vxe-table>
</card-container>
</div>
@ -72,7 +86,7 @@
page_size: 10,
month: this.$moment().format('YYYY-MM'),
department_id: '',
is_week: 1
is_week: 0
},
my_department_id: "",
is_bgs: false, //
@ -121,7 +135,10 @@
id,
name,
department,
overtime
overtime,
time_off,
use_overtime,
discount,
} = item;
let obj = {}
const allDay = overtime.reduce((sum, overtimeItem) => sum + parseFloat(overtimeItem.jiabanshichang), 0);
@ -148,7 +165,10 @@
overtimeItem.sortnumber = department.sortnumber
overtimeItem.department_id = department.id
overtimeItem.allDay = parseFloat(allDay).toFixed(2);
overtimeItem.allConvertTime = parseFloat(allConvertTime).toFixed(2);
overtimeItem.allConvertTime = parseFloat(allConvertTime).toFixed(2);
overtimeItem.time_off = parseFloat(time_off).toFixed(2);
overtimeItem.use_overtime = parseFloat(use_overtime).toFixed(2);
overtimeItem.discount = parseFloat(discount).toFixed(2);
result.push(overtimeItem);
//
@ -179,8 +199,9 @@
//
generateMergeCells(data) {
const columns = this.$refs.table.getColumns();
let mergeCells = [];
const columnsToMerge = ['department_name', 'name', 'allDay', 'allConvertTime'];
let mergeCells = [];
const columnsToMerge = ['department_name', 'name', 'allDay', 'allConvertTime','time_off','use_overtime','discount'];
columnsToMerge.forEach(key => {
const col = columns.findIndex(item => item['field'] === key);

@ -4,6 +4,13 @@
<vxe-toolbar export print custom ref="toolbar">
<template #buttons>
<el-date-picker v-model="select.month" type="month" size="small" value-format="yyyy-MM"></el-date-picker>
<el-select style="width:250px;margin-left:6px" size="small"
v-model="select.department_id" placeholder="请选择">
<el-option v-for="item in departments" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
<el-input size="small" style="width:250px;margin-left:6px" v-model="select.keyword" placeholder="请输入关键词"></el-input>
<el-button icon="el-icon-search" type="primary" plain size="small" style="margin-left: 6px;" @click="getStatistics"></el-button>
</template>
</vxe-toolbar>
@ -93,12 +100,18 @@
<script>
import { throttle } from '@/utils'
import { statistics } from '@/api/attendance'
import {
departmentListNoAuth
} from "@/api/common.js"
export default {
data() {
return {
select: {
month: this.$moment().format('YYYY-MM')
month: this.$moment().format('YYYY-MM'),
department_id:'',
keyword:""
},
departments: [],
tableData: {
admins: [],
dates: [],
@ -122,7 +135,20 @@ export default {
console.error(err)
}
},
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);
}
},
getRemark(row) {
let result = ''
let overtimeDay = 0
@ -177,6 +203,7 @@ export default {
},
created() {
this.getStatistics()
this.getDepartmentList()
},
mounted() {
this.bindToolbar()

Loading…
Cancel
Save