Files
fad_oa/ruoyi-ui/src/views/oa/closure/index.vue
2026-04-13 17:04:38 +08:00

160 lines
3.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="container">
<h1>项目结项报告</h1>
<p><strong>项目名称</strong> {{ project.projectName }}</p>
<p><strong>项目总成本</strong> ¥{{ project.funds }}</p>
<p><strong>项目用时</strong> {{ (new Date(project.postponeTime)-new Date(project.beginTime))/1000/60/60/24 }}</p>
<div v-for="(item,index) in stepsList" :key="index">
<h2>{{item.dictLabel}}-人员情况</h2>
<div v-for="(task,index) in item.taskList" :key="index">
<h3>负责人-{{task.collaborator}}</h3>
<table>
<tr>
<th>姓名</th>
<th>工作时长 ()</th>
<th>人力成本 (/)</th>
<th>总成本 ()</th>
</tr>
<tr v-for="member in task.workerList" :key="member.name">
<td>{{ member.nickName }}</td>
<td>{{ member.workTime }}</td>
<td>{{ member.laborCost }}</td>
<td>{{ (member.workTime * member.laborCost).toLocaleString() }}</td>
</tr>
<tr class="summary">
<td colspan="3">总计</td>
<td>¥{{ task.projectCostTotal }}</td>
</tr>
</table>
</div>
</div>
<div class="footer">
<p>© 2024 项目结项报告 | 由项目团队生成</p>
</div>
</div>
</template>
<script>
import {getProject} from "@/api/oa/project";
import {getTaskByDictType} from "@/api/oa/task";
export default {
name: "closure",
data() {
return {
// 项目名
projectName: "AI 数据分析系统开发",
// 项目涉及人员
teamMembers: [
{name: '李某某', role: '项目经理', hours: 160, rate: 300, completed: '已完成'},
{name: '王某', role: '前端开发', hours: 150, rate: 250, completed: '已完成'},
{name: '张某', role: '后端开发', hours: 170, rate: 280, completed: '进行中'},
{name: '陈某', role: '测试工程师', hours: 140, rate: 220, completed: '已完成'},
{name: '赵某', role: '产品经理', hours: 130, rate: 350, completed: '已完成'}
],
// 项目花费
projectCost: 990000,
totalHumanCost: 10000,
project:{},
stepsList:[],
active:{}
}
},
created() {
this.projectId = this.$route.params.projectId;
this.getProject()
// this.getTaskByDictType(this.projectId);
},
methods:{
getProject(){
getProject(this.projectId).then(response => {
this.project = response.data;
})
},
// /**new-工作类型进度**/
// getTaskByDictType(pid) {
// getTaskByDictType(pid).then(res => {
// //排序
// this.stepsList = res.data.data.taskList.sort((a, b) => parseInt(a.dictValue) - parseInt(b.dictValue));
// this.active = res.data.data.active;
// })
// },
}
}
</script>
<style scoped lang="scss">
* {
margin: 15px auto;
padding: 0;
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
background-color: #f5f5f5;
padding: 20px;
}
.container {
max-width: 800px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
padding: 20px;
margin: auto;
}
h1 {
text-align: center;
color: #333;
margin-bottom: 30px;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th, td {
padding: 12px;
border: 1px solid #ddd;
text-align: center;
}
th {
background-color: #007bff;
color: #fff;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
.summary {
font-weight: bold;
color: #007bff;
}
.footer {
text-align: center;
margin-top: 30px;
font-size: 14px;
color: #666;
}
</style>