需求原型图
统统计每周每个项目对应承接部门的计划人天和日报人天消耗对比。
具体开发
1、使用 vxe-table插件,安装vxe-table
2、根据需求及数据格式决定采用 vxe-table 中反转表格,具体可见vxe-table 官网
3、项目中使用
<template>
<div id="portal-form-list-container">
<div id="ApplicationList" ref="application" class="application-box">
<div class="custom-list-table-box">
<div ref="contentTop" class="content-top">
<a-button type="primary" @click="handleExport">导出</a-button>
</div>
<vxe-grid
class="reverse-table"
v-bind="gridOptions1"
></vxe-grid>
</div>
</div>
</div>
</template>
4、主要问题点
(1)、每个月中对应每周项目动态生成
(2)、项目对应承接部门数据动态
(3)、项目及部门对应数据
5、配置项 gridOptions1的组装
接口数据通过后端接口获得
getcalcStatisticsInfo(){
let vm = this
let formData = new FormData();
formData.append('beginDate',this.beginDate)
formData.append('endDate', this.endDate)
axios.post((window as any).config.apiHost+'/test',formData).then((res:any)=>{
if(res.errcode===0){
let list = []
this.datatest.data.map(item=>{
//处理有几列数据 begin
let len = 0
item.weeklyStatisticsResponseList.map(v=>{
// len = len + v.departmentStatisticsResponseList.length
if(v.departmentStatisticsResponseList.length ===0){
len = len+1
}else{
len = len+v.departmentStatisticsResponseList.length
}
})
list.push(len)
//处理有几列数据 end
})
let max = Math.max(...list) //最大的那个数字
console.log(max,'maxmaxmax')
this.max = max
let columns = []
let objColum:any = {}
for (let i = 0; i <= max; i++) {
const colObj:any={
field:'col'+ (i+1)
}
objColum['col'+ (i+1)] =''
columns.push(colObj)
}
this.objColum = objColum
this.gridOptions1.columns = columns
let dataList = []
let deptCJ = []
this.datatest.data.map(item=>{
let obj:any = Object.assign({},this.objColum) //将月份数据先放进去
let ob2:any = Object.assign({},this.objColum)//将周数据 放进去
let ob3:any = Object.assign({},this.objColum)//将承接部门 放进去
//月份数据
obj.col1 = '月份'
obj.col2 = item.month +'月'
ob2.col1 = '周'
ob3.col1 = '承接部门'
//周数据
dataList.push(obj)
//将周数据加进去
dataList.push(ob2)
dataList.push(ob3)
var len = 0
let deptrowList = []
let rowd :any = []
let rowday :any = []
let rowdayList :any = []
let pre = 0
let numjishu = 2
let preNmu = 1
let dianwei:any = 0 //主要用于计算合并的行和列
let leftdeptList = [] //左边部门数据
item.weeklyStatisticsResponseList.forEach((v,depIndex)=>{
var dep = []
let depatLen :any= v.departmentStatisticsResponseList.length ? v.departmentStatisticsResponseList.length:1
//设置周的数据
if(depIndex===0){
ob2.col2 = '第'+ v.weekly +'周'
preNmu = 1
dianwei = 2
}
if(depIndex >0){
let predepartLen = item.weeklyStatisticsResponseList[depIndex-1].departmentStatisticsResponseList.length
dianwei = dianwei + (predepartLen ? predepartLen:1)
let key = 'col'+ dianwei
ob2[key] = '第'+ v.weekly +'周'
}
if(v.departmentStatisticsResponseList && v.departmentStatisticsResponseList.length>0){
v.departmentStatisticsResponseList.map((dept:any)=>{
let ob2Dept:any = Object.assign({},this.objColum) //部门的,也就是项目数据
ob2Dept.col1 = dept.departmentName
const foundNumber = dataList.find(fitem => fitem.col1 === dept.departmentName)
const isDept = leftdeptList.find(fitem => fitem.undertakingDepartment === dept.undertakingDepartment)
if(!isDept){
leftdeptList.push(dept)
}
rowdayList.push(dept)
rowd.push(dept.projectName) //承接部门的数据
rowday.push(dept.planDay+ '/' + (dept.actualDay))
})
}else{
rowd.push(null)
rowday.push(null)
rowdayList.push(null)
}
})
//处理承接部门的数据
rowd.forEach((r,Rindex)=>{
let len = Rindex+2
var type = 'col'+len
ob3[type] = r
})
leftdeptList.forEach((d:any,Dindex)=>{
console.log()
let ob2Dept:any = Object.assign({},this.objColum) //部门的,也就是项目数据
ob2Dept.col1 = d.departmentName
dataList.push(ob2Dept)
rowdayList.forEach((r,Dindex)=>{
let len = Dindex+2
var type = 'col'+len
if(d && r){
if(r.departmentName === d.departmentName){
ob2Dept[type] = r.planDay +'/' + r.actualDay
}
}
})
})
})
this.dataList = dataList
this.gridOptions1.data = dataList
console.log(dataList,'dataListdataListdataList')
this.mergeCells()
}
})
}
//计算合并的行和列
mergeCells(){
let mergeCells = []
let rowZlist={
}
this.dataList.map((Mitem:any,MIndex:any)=>{
if(Mitem.col1 ==='月份'){
var objMY:any={
row: MIndex, col: 1, rowspan: 0, colspan: this.max+1
}
mergeCells.push(objMY)
}
if(Mitem.col1 ==='周'){
rowZlist[MIndex] = MIndex
let objW = Mitem
let col = 1
let indexB = 0
let preB = 0
let W1 = 0
let W2 = 0
let W3 = 0
let W4 = 0
let W5 = 0
let itemList = this.dataList[MIndex].length
var arr = Object.keys(Mitem); //对象最大的长度
let itemLen = arr.length
for (var i in Mitem){
col = indexB -1
if(Mitem[i]==='第1周'){
W1 = indexB
}
if(Mitem[i]==='第2周'){
W2 = indexB
var objMY:any={
row: MIndex, col: W1, rowspan: 0, colspan: W2-W1
}
mergeCells.push(objMY)
}
if(Mitem[i]==='第3周'){
W3 = indexB
var objMY3:any={
row: MIndex, col: W2, rowspan: 0, colspan: W3-W2
}
mergeCells.push(objMY3)
}
if(Mitem[i]==='第4周'){
W4 = indexB
var objMY4:any={
row: MIndex, col: W3, rowspan: 0, colspan: W4-W3
}
mergeCells.push(objMY4)
}
if(Mitem[i]==='第5周'){
W5 = indexB
console.log(indexB,'第5周')
var objMY5:any={
row: MIndex, col: W4, rowspan: 0, colspan: W5-W4
}
console.log(indexB,'indexBindexBindexB')
mergeCells.push(objMY5)
var objMY6:any={
row: MIndex, col: W5, rowspan: 0, colspan:itemLen- W5
}
mergeCells.push(objMY6)
}
indexB ++
}
}
})
this.gridOptions1.mergeCells = mergeCells
}
5、模拟数据
data :any = {
"errcode": 0,
"errmsg": "",
"data": [
{
"month": 7,
"weeklyStatisticsResponseList": [
{
"weekly": 1,
"departmentStatisticsResponseList": [
{
"projectId": "67fc3c17ab4948aab45a6a7d630bccc8",
"projectName": "测试任务管理1-zzq",
"undertakingDepartment": "2c2c80848c1041cc018c90511e350d64",
"departmentName": "真空事业部",
"planDay": 112,
"actualDay": 0
},
{
"projectId": "debb7c17c9674b69a21eaf2da7d70021",
"projectName": "测试项目001",
"undertakingDepartment": "2c2c80848c0fd791018c10029bb10004",
"departmentName": "天骏创客",
"planDay": 152,
"actualDay": 0
},
{
"projectId": "d3602c541f3a42ee98c6b6ed70013956",
"projectName": "测试项目任务管理3",
"undertakingDepartment": "2c2c80848c1041cc018c90511e430d6d",
"departmentName": "项目部",
"planDay": 112,
"actualDay": 0
}
],
"dayList": [
"2024-07-01",
"2024-07-02",
"2024-07-03",
"2024-07-04",
"2024-07-05",
"2024-07-06",
"2024-07-07"
]
},
{
"weekly": 2,
"departmentStatisticsResponseList": [
{
"projectId": "d3602c541f3a42ee98c6b6ed70013956",
"projectName": "测试项目任务管理3",
"undertakingDepartment": "2c2c80848c1041cc018c90511e430d6d",
"departmentName": "项目部",
"planDay": 56,
"actualDay": 0
},
{
"projectId": "debb7c17c9674b69a21eaf2da7d70021",
"projectName": "测试项目001",
"undertakingDepartment": "2c2c80848c0fd791018c10029bb10004",
"departmentName": "天骏创客",
"planDay": 8,
"actualDay": 0
},
{
"projectId": "67fc3c17ab4948aab45a6a7d630bccc8",
"projectName": "测试任务管理1-zzq",
"undertakingDepartment": "2c2c80848c1041cc018c90511e350d64",
"departmentName": "真空事业部",
"planDay": 56,
"actualDay": 0
}
],
"dayList": [
"2024-07-08",
"2024-07-09",
"2024-07-10",
"2024-07-11",
"2024-07-12",
"2024-07-13",
"2024-07-14"
]
},
{
"weekly": 3,
"departmentStatisticsResponseList": [
{
"projectId": "d3602c541f3a42ee98c6b6ed70013956",
"projectName": "测试项目任务管理3",
"undertakingDepartment": "2c2c80848c1041cc018c90511e430d6d",
"departmentName": "项目部",
"planDay": 56,
"actualDay": 0
},
{
"projectId": "67fc3c17ab4948aab45a6a7d630bccc8",
"projectName": "测试任务管理1-zzq",
"undertakingDepartment": "2c2c80848c1041cc018c90511e350d64",
"departmentName": "真空事业部",
"planDay": 56,
"actualDay": 0
}
],
"dayList": [
"2024-07-15",
"2024-07-16",
"2024-07-17",
"2024-07-18",
"2024-07-19",
"2024-07-20",
"2024-07-21"
]
},
{
"weekly": 4,
"departmentStatisticsResponseList": [
{
"projectId": "d3602c541f3a42ee98c6b6ed70013956",
"projectName": "测试项目任务管理3",
"undertakingDepartment": "2c2c80848c1041cc018c90511e430d6d",
"departmentName": "项目部",
"planDay": 56,
"actualDay": 0
},
{
"projectId": "67fc3c17ab4948aab45a6a7d630bccc8",
"projectName": "测试任务管理1-zzq",
"undertakingDepartment": "2c2c80848c1041cc018c90511e350d64",
"departmentName": "真空事业部",
"planDay": 56,
"actualDay": 0
}
],
"dayList": [
"2024-07-22",
"2024-07-23",
"2024-07-24",
"2024-07-25",
"2024-07-26",
"2024-07-27",
"2024-07-28"
]
},
{
"weekly": 5,
"departmentStatisticsResponseList": [
{
"projectId": "d3602c541f3a42ee98c6b6ed70013956",
"projectName": "测试项目任务管理3",
"undertakingDepartment": "2c2c80848c1041cc018c90511e430d6d",
"departmentName": "项目部",
"planDay": 24,
"actualDay": 0
},
{
"projectId": "67fc3c17ab4948aab45a6a7d630bccc8",
"projectName": "测试任务管理1-zzq",
"undertakingDepartment": "2c2c80848c1041cc018c90511e350d64",
"departmentName": "真空事业部",
"planDay": 24,
"actualDay": 0
}
],
"dayList": [
"2024-07-29",
"2024-07-30",
"2024-07-31"
]
}
]
},
{
"month": 8,
"weeklyStatisticsResponseList": [
{
"weekly": 1,
"departmentStatisticsResponseList": [
{
"projectId": "67fc3c17ab4948aab45a6a7d630bccc8",
"projectName": "8月测试项目1",
"undertakingDepartment": "2c2c80848c1041cc018c90511e350d64",
"departmentName": "开发部1",
"planDay": 112,
"actualDay": 0
},
{
"projectId": "debb7c17c9674b69a21eaf2da7d70021",
"projectName": "8月测试项目2",
"undertakingDepartment": "2c2c80848c0fd791018c10029bb10004",
"departmentName": "开发部2",
"planDay": 152,
"actualDay": 0
},
{
"projectId": "d3602c541f3a42ee98c6b6ed70013956",
"projectName": "8月测试项目3",
"undertakingDepartment": "2c2c80848c1041cc018c90511e430d6d",
"departmentName": "项目部",
"planDay": 112,
"actualDay": 0
}
],
"dayList": [
"2024-07-01",
"2024-07-02",
"2024-07-03",
"2024-07-04",
"2024-07-05",
"2024-07-06",
"2024-07-07"
]
},
{
"weekly": 2,
"departmentStatisticsResponseList": [
{
"projectId": "d3602c541f3a42ee98c6b6ed70013956",
"projectName": "2周项目1",
"undertakingDepartment": "2c2c80848c1041cc018c90511e430d6d",
"departmentName": "项目部",
"planDay": 56,
"actualDay": 0
},
{
"projectId": "debb7c17c9674b69a21eaf2da7d70021",
"projectName": "2周项目2",
"undertakingDepartment": "2c2c80848c0fd791018c10029bb10004",
"departmentName": "天骏创客",
"planDay": 8,
"actualDay": 0
},
{
"projectId": "67fc3c17ab4948aab45a6a7d630bccc8",
"projectName": "2周项目3",
"undertakingDepartment": "2c2c80848c1041cc018c90511e350d64",
"departmentName": "真空事业部",
"planDay": 56,
"actualDay": 0
}
],
"dayList": [
"2024-07-08",
"2024-07-09",
"2024-07-10",
"2024-07-11",
"2024-07-12",
"2024-07-13",
"2024-07-14"
]
},
{
"weekly": 3,
"departmentStatisticsResponseList": [
{
"projectId": "d3602c541f3a42ee98c6b6ed70013956",
"projectName": "测试项目任务管理3",
"undertakingDepartment": "2c2c80848c1041cc018c90511e430d6d",
"departmentName": "项目部",
"planDay": 56,
"actualDay": 123
},
{
"projectId": "67fc3c17ab4948aab45a6a7d630bccc8",
"projectName": "测试任务管理1-zzq",
"undertakingDepartment": "2c2c80848c1041cc018c90511e350d64",
"departmentName": "真空事业部",
"planDay": 33,
"actualDay": 34
}
],
"dayList": [
"2024-07-15",
"2024-07-16",
"2024-07-17",
"2024-07-18",
"2024-07-19",
"2024-07-20",
"2024-07-21"
]
},
{
"weekly": 4,
"departmentStatisticsResponseList": [
{
"projectId": "d3602c541f3a42ee98c6b6ed70013956",
"projectName": "8月4周1",
"undertakingDepartment": "2c2c80848c1041cc018c90511e430d6d",
"departmentName": "项目部",
"planDay": 98,
"actualDay": 4
},
{
"projectId": "67fc3c17ab4948aab45a6a7d630bccc8",
"projectName": "8月4周2-zzq",
"undertakingDepartment": "2c2c80848c1041cc018c90511e350d64",
"departmentName": "真空事业部",
"planDay": 33,
"actualDay": 68
}
],
"dayList": [
"2024-07-22",
"2024-07-23",
"2024-07-24",
"2024-07-25",
"2024-07-26",
"2024-07-27",
"2024-07-28"
]
},
{
"weekly": 5,
"departmentStatisticsResponseList": [
{
"projectId": "d3602c541f3a42ee98c6b6ed70013956",
"projectName": "测试项目任务管理3",
"undertakingDepartment": "2c2c80848c1041cc018c90511e430d6d",
"departmentName": "项目部",
"planDay": 24,
"actualDay": 0
},
{
"projectId": "67fc3c17ab4948aab45a6a7d630bccc8",
"projectName": "测试任务管理1-zzq",
"undertakingDepartment": "2c2c80848c1041cc018c90511e350d64",
"departmentName": "真空事业部",
"planDay": 24,
"actualDay": 0
}
],
"dayList": [
"2024-07-29",
"2024-07-30",
"2024-07-31"
]
}
]
}
]
}
6、最终展示效果