diff --git a/src/views/attendance/otherovertimechart.vue b/src/views/attendance/otherovertimechart.vue index 8fd09fe..3886d3a 100644 --- a/src/views/attendance/otherovertimechart.vue +++ b/src/views/attendance/otherovertimechart.vue @@ -5,52 +5,50 @@ - - + - - - - + + + + - - - + + + - - + + @@ -62,8 +60,8 @@ } from "@/api/chart" import { departmentListNoAuth - } from "@/api/common.js" - import store from "@/store/modules/user.js" + } from "@/api/common.js" + import store from "@/store/modules/user.js" export default { data() { return { @@ -73,11 +71,11 @@ page: 1, page_size: 10, month: this.$moment().format('YYYY-MM'), - department_id: '', - is_week:1 - }, - my_department_id:"", - is_bgs:false, // 是否是办公室 + department_id: '', + is_week: 1 + }, + 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; - const allDay = overtime.reduce((sum, overtimeItem) => sum + parseFloat(overtimeItem.jiabanshichang), 0); - overtime.forEach(overtimeItem => { - let convertTime = 0 //折算加班 - if(overtimeItem.day_type=='normal'){ - overtimeItem.day_type_name = '工作日' - convertTime = parseFloat(overtimeItem.jiabanshichang) * 1.5 - }else if(overtimeItem.day_type=='week'){ - overtimeItem.day_type_name = '双休日' - convertTime = parseFloat(overtimeItem.jiabanshichang) * 2 - }else if(overtimeItem.day_type=='holiday'){ - overtimeItem.day_type_name = '节假日' - convertTime = parseFloat(overtimeItem.jiabanshichang) * 3 + let obj = {} + const allDay = overtime.reduce((sum, overtimeItem) => sum + parseFloat(overtimeItem.jiabanshichang), 0); + overtime.forEach(overtimeItem => { + let convertTime = 0 //折算加班 + if (overtimeItem.day_type == 'normal') { + overtimeItem.day_type_name = '工作日' + convertTime = parseFloat(overtimeItem.jiabanshichang) * 1.5 + } else if (overtimeItem.day_type == 'week') { + overtimeItem.day_type_name = '双休日' + convertTime = parseFloat(overtimeItem.jiabanshichang) * 2 + } 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.department_id = department.id 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 - }) + }); }); + result.sort((a, b) => { + return a.sortnumber - b.sortnumber + }) this.mergeCells = this.generateMergeCells(result) return result; }, @@ -181,47 +178,90 @@ }, // 合并单元格 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; } - 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 (key === 'allDay' || key === 'allConvertTime') { + // 对于 allDay 和 allConvertTime 列,先按 name 分组处理 + const groupedByName = {}; + data.forEach((row, index) => { + const name = row.name; + if (!groupedByName[name]) { + groupedByName[name] = []; } - } - if (rowspan > 1) { - mergeCells.push({ - row: i, - col, - rowspan, - colspan: 1 + groupedByName[name].push({ + row, + index }); - 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; - }, + } }, 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.select.department_id = this.my_department_id - + 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 + } this.getDepartmentList() this.getList() @@ -236,14 +276,14 @@ } -