初步完成公告和统计图显示

main
A 2022-07-13 10:12:42 +08:00
parent 291eb9f596
commit aa82ccfee1
5 changed files with 330 additions and 31 deletions

View File

View File

@ -5,7 +5,6 @@
title="添加成员" title="添加成员"
:before-close="handleClose" :before-close="handleClose"
v-model="dialogFormVisible" v-model="dialogFormVisible"
width="500px" width="500px"
> >
<el-form :model="form" :rules="rules" ref="form"> <el-form :model="form" :rules="rules" ref="form">

View File

@ -87,7 +87,8 @@ export default {
option.legend = { option.legend = {
type: 'scroll', type: 'scroll',
orient: 'vertical', orient: 'vertical',
right: 10, // right: 10,
left:350,
top: 20, top: 20,
bottom: 20, bottom: 20,
} }

View File

@ -70,6 +70,7 @@
<p style="'Segoe UI',sans-serif;font-size: 20px;font-weight: bold;color: #606266;margin: 15px 0 30px 0;flex-shrink: 0;"> <p style="'Segoe UI',sans-serif;font-size: 20px;font-weight: bold;color: #606266;margin: 15px 0 30px 0;flex-shrink: 0;">
团队工作情况统计</p> 团队工作情况统计</p>
<div style="flex: 1;background-color: white; border-radius: 10px;"> <div style="flex: 1;background-color: white; border-radius: 10px;">
<EchartsPie id="pie_team" ref="pie_team" :isLegend="true" :dataList="teamList"/>
<!-- <EchartsPie id="pie_team" :isRadius="true" />--> <!-- <EchartsPie id="pie_team" :isRadius="true" />-->
</div> </div>
</div> </div>
@ -129,6 +130,7 @@ export default {
return { return {
// //
stationList: [], stationList: [],
teamList: [],
total: 20, total: 20,
currentPage: 1, currentPage: 1,
pageSize: 10, pageSize: 10,
@ -193,6 +195,34 @@ export default {
console.log(error); console.log(error);
}); });
}, },
getTeamList() {
let projectId = this.$route.params.projectId;
request({
url: `project/${projectId}/task/stats/group`,
method: "get",
})
.then((response) => {
if (response.data.code === 200) {
console.log(response.data.data);
let data = response.data.data;
let array = [];
for (let key in data) {
array.push({ value: data[key], name: key });
}
this.teamList = array;
this.$nextTick(() => {
this.$refs.pie_team.updateEcharts();
});
console.log(array);
}
})
.catch(function (error) {
console.log(error);
});
},
onCreatePerson() { onCreatePerson() {
this.dialogFormVisible = true; this.dialogFormVisible = true;
}, },
@ -246,6 +276,7 @@ export default {
}; };
this.getTableData(data); this.getTableData(data);
this.getStationList(); this.getStationList();
this.getTeamList();
this.$emit('groupChanged') this.$emit('groupChanged')
}, },
getTableData(param) { getTableData(param) {
@ -290,6 +321,7 @@ export default {
}, },
mounted() { mounted() {
this.getStationList(); this.getStationList();
this.getTeamList();
const param = { const param = {
pageCurrent: this.currentPage, pageCurrent: this.currentPage,
pageSize: this.pageSize, pageSize: this.pageSize,

View File

@ -4,7 +4,8 @@
display: flex;flex-direction: row;justify-content: space-between"> display: flex;flex-direction: row;justify-content: space-between">
<div style="width: 32%; height: 100%;display: flex;flex-direction: column"> <div style="width: 32%; height: 100%;display: flex;flex-direction: column">
<p class="p-title" style="margin-left: 10px">基本信息</p> <p class="p-title" style="margin-left: 10px">基本信息</p>
<div style="flex:1;margin-top: 30px;padding: 20px; <div
style="flex:1;margin-top: 30px;padding: 20px;
display: flex;flex-direction: column; justify-content: space-between;background-color: white; border-radius: 10px; "> display: flex;flex-direction: column; justify-content: space-between;background-color: white; border-radius: 10px; ">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
@ -36,9 +37,8 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<p class="p-subtitle">进度</p> <p class="p-subtitle">进度</p>
<el-progress <el-progress :status="(totalNum !== 0 && completeNum === totalNum) ? 'success' : ''"
:status="(totalNum!==0&&completeNum===totalNum) ? 'success' : ''" :percentage="totalNum === 0 ? 0 : Math.round(completeNum * 100 / totalNum)" />
:percentage="totalNum===0?0:Math.round(completeNum*100/totalNum)"/>
</el-col> </el-col>
</el-row> </el-row>
@ -47,7 +47,8 @@
</div> </div>
<div style="flex: 1;margin-left: 30px;height: 100%;display: flex;flex-direction: column"> <div style="flex: 1;margin-left: 30px;height: 100%;display: flex;flex-direction: column">
<p class="p-title" style="margin-left: 10px">工作项统计</p> <p class="p-title" style="margin-left: 10px">工作项统计</p>
<div style="flex:1;margin-top: 30px;padding: 20px; <div
style="flex:1;margin-top: 30px;padding: 20px;
display: flex;flex-direction: column; justify-content: space-between;background-color: white; border-radius: 10px;"> display: flex;flex-direction: column; justify-content: space-between;background-color: white; border-radius: 10px;">
</div> </div>
@ -59,10 +60,12 @@
<div style="margin: 0 10px 0 10px; <div style="margin: 0 10px 0 10px;
display: flex;flex-direction: row;justify-content: space-between"> display: flex;flex-direction: row;justify-content: space-between">
<p style="font-family: 'Segoe UI',sans-serif;font-size: 20px;font-weight: bold;color: #606266">详细信息</p> <p style="font-family: 'Segoe UI',sans-serif;font-size: 20px;font-weight: bold;color: #606266">详细信息</p>
<el-button v-if="projectAccessLevel===1" type="primary" @click.native="onEditProjectClick"></el-button> <el-button v-if="projectAccessLevel === 1" type="primary" @click.native="onEditProjectClick"></el-button>
</div> </div>
<div style="flex:1;margin-top: 30px;padding: 20px; <div
display: flex;flex-direction: column; justify-content: space-between;background-color: white; border-radius: 10px; "> style="flex:1;margin-top: 30px;padding: 20px;
display: flex;flex-direction: column; justify-content: space-between;background-color: white; border-radius: 10px; "
ref="refs" id="refs">
<el-row class="row-info"> <el-row class="row-info">
<el-col :span="6"> <el-col :span="6">
<p class="p-subtitle">英文简称</p> <p class="p-subtitle">英文简称</p>
@ -146,27 +149,105 @@
</div> </div>
</div> </div>
<div style="flex: 1;margin-left: 30px;display: flex;flex-direction: column"> <div style="flex: 1;margin-left: 30px;display: flex;flex-direction: column;">
<p class="p-title" style="margin-left: 10px">公告</p>
<div style="flex:1;margin-top: 30px;padding: 20px; <div>
display: flex;flex-direction: column; justify-content: space-between;background-color: white; border-radius: 10px;"> <p class="p-title" style="margin-left: 10px;width: 40%;float: left;">公告</p>
<p>{{ project.projectDescription }}</p> <div style="width: 80px;height: 40px;float:right;">
<el-button @click="addggboxbtn()" type="primary">新增</el-button>
</div> </div>
</div> </div>
<!-- 公告具体内容 -->
<div
style="margin-top: 15px;padding: 8px;background-color: white; border-radius: 10px;height: 470px;overflow: auto;position: relative;">
<div v-if="findGgBoxShow "
style="position: absolute;width:100%;height: 470px;left:0;top:0;background-color: #ffffff;z-index: 999;">
<div style="width:100%;height:10%;float:left;">
<p @click="gbGgBosShow()"
style="width:20%;height:100%;float:left;color: #606266;line-height: 250%;cursor: pointer;"> &lt;&nbsp;返回</p>
<div style="width:60%;height:100%;float:left;line-height: 250%;text-align: center;">
<h3>{{ findGgInfoContent.announcementTitle }} </h3></div>
<div @click="showDelbox(findGgInfoContent.announcementId)"
style="width:20%;height:100%;float:right;color: #409EFF;line-height: 250%;text-align: center;cursor: pointer;" >
删除</div>
</div>
<div style="width:100%;height:7%;float:left;line-height: 250%;text-align: right;background:#EBEFF1;color: #898989;font-size:14px ">
日期{{ findGgInfoContent.announcementPublishTime }} &nbsp;&nbsp;&nbsp;发布人{{ findGgInfoContent.announcementPublisherName }} &nbsp;
</div>
<div style="width:100%;height:80%;float:left;line-height: 120%;text-align: left;overflow: auto;">
{{ findGgInfoContent.announcementContent }}
</div>
</div>
<div v-if="!findGgBoxShow" >
<el-timeline>
<el-timeline-item timestamp="" placement="top" v-for="(item, index) in ggList" :key="index">
<el-card @click="findggInfo(item.announcementId)">
<h3
style="white-space: nowrap;text-overflow: ellipsis;-o-text-overflow: ellipsis; overflow: hidden;width:524px;cursor: pointer;">
{{ item.announcementTitle }}</h3>
<p> {{ item.announcementPublisherName }} 发布于 {{ item.announcementPublishTime }}</p>
</el-card>
</el-timeline-item>
</el-timeline>
</div>
</div>
<!-- 公告具体内容结束 -->
</div>
</div> </div>
</el-scrollbar> </el-scrollbar>
<EditProjectDialog
:dialogFormVisible="editProjectDialogVisible" :projectClasses="projectClasses" <EditProjectDialog :dialogFormVisible="editProjectDialogVisible" :projectClasses="projectClasses"
:projectSubClasses="projectSubClasses" :projectSubClasses="projectSubClasses" :projectInfo="editProjectInfo" @edited="onEdited" />
:projectInfo="editProjectInfo" <!-- 新增公告框开始 -->
@edited="onEdited"/>
<el-dialog title="添加项目公告" v-model="centerDialogVisible" width="40%" center>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="标题" prop="addggbttxt">
<el-input type="text" placeholder="请输入项目公告标题" v-model="form.addggbttxt" maxlength="45" show-word-limit>
</el-input>
</el-form-item>
<el-form-item label="内容" prop="addggtextarea">
<el-input type="textarea" placeholder="请输入项目公告内容" v-model="form.addggtextarea" maxlength="1000" show-word-limit :rows="10">
</el-input>
</el-form-item>
</el-form>
<template #footer>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="addxtggsj('form')"> </el-button>
<el-button @click="centerDialogVisible = false"> </el-button>
</span>
</template>
</el-dialog>
<!-- 新增公告框结束 -->
<!-- 删除公告 -->
<el-dialog
title="提示"
v-model="dialogVisible"
width="30%"
:before-close="handleClose">
<div>确认删除该公告?</div>
<template #footer>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="delxtggsj()"> </el-button>
</span>
</template>
</el-dialog>
</template> </template>
<script setup> <script setup>
import {ref} from 'vue' import { ref } from 'vue'
</script> </script>
@ -177,7 +258,7 @@ import EditProjectDialog from "../components/EditProjectDialog";
export default { export default {
name: "ProjectInfo", name: "ProjectInfo",
components: {EditProjectDialog}, components: { EditProjectDialog },
data() { data() {
return { return {
project: { project: {
@ -211,7 +292,29 @@ export default {
viewHeight: 0, viewHeight: 0,
editProjectDialogVisible: false, editProjectDialogVisible: false,
editProjectInfo: {} editProjectInfo: {},
//
ggList: [],
//
centerDialogVisible: false,
form: {
addggbttxt: "",
addggtextarea: '',
},
rules: {
addggbttxt: [
{ required: true, message: '请输入公告标题', trigger: 'blur' },
],
addggtextarea: [
{ required: true, message: '请输入公告内容', trigger: 'blur' },
],
},
findGgInfoContent: "",
findGgBoxShow: false,
dialogVisible:false,
delGGid:""
} }
}, },
props: { props: {
@ -270,7 +373,9 @@ export default {
created() { created() {
this.getProjectInfo(); this.getProjectInfo();
this.getProjectStats(); this.getProjectStats();
this.getProjectClass() this.getProjectClass();
this.getannouncementList();
}, },
mounted() { mounted() {
const that = this const that = this
@ -278,15 +383,154 @@ export default {
window.onresize = () => { window.onresize = () => {
that.viewHeight = window.innerHeight - 150; that.viewHeight = window.innerHeight - 150;
}; };
}, },
methods: { methods: {
//
delxtggsj(){
var that = this;
let projectId = this.$route.params.projectId;
let announcementId= that.delGGid;
request({
url: `project/${projectId}/announcement/${announcementId}`,
method: "DELETE",
})
.then((response) => {
if (response.data.code === 200) {
console.log("成功");
this.$message({
message: '删除成功',
type: 'success'
});
that.dialogVisible = false;
that.getannouncementList();
let data = response.data.data;
console.log(data);
//
that.gbGgBosShow();
}
})
.catch(function (error) {
console.log(error);
});
},
showDelbox(id){
var that = this;
that.dialogVisible = true;
that.delGGid = id;
},
//
findggInfo(announcementId) {
console.log("这里是查看公告")
var that = this;
let projectId = this.$route.params.projectId;
request({
url: `project/${projectId}/announcement/${announcementId}`,
method: "get",
})
.then((response) => {
if (response.data.code === 200) {
that.findGgBoxShow = true;
let data = response.data.data;
console.log(data);
data.announcementPublishTime = that.formatDate(data.announcementPublishTime)
that.findGgInfoContent = data;
}
})
.catch(function (error) {
console.log(error);
});
},
gbGgBosShow() {
this.findGgBoxShow = false;
},
//
addxtggsj(formName) {
var that = this;
let projectId = this.$route.params.projectId;
this.$refs[formName].validate((valid) => {
if (valid) {
console.log('submit')
let { ...form} = this.form
request({
url: `project/${projectId}/announcement`,
method: 'post',
data: {
announcementContent: that.form.addggtextarea,
announcementTitle: that.form.addggbttxt,
}
}).then((response) => {
if (response.data.code === 200) {
console.log("成功");
this.$message({
message: '新增成功',
type: 'success'
});
that.getannouncementList();
that.centerDialogVisible = false;
}
})
.catch(function (error) {
console.log(error);
})
} else {
console.log('error submit!!')
return false
}
})
},
//
addggboxbtn() {
this.centerDialogVisible = true;
console.log(this.centerDialogVisible)
},
//
getannouncementList() {
var that = this;
let projectId = this.$route.params.projectId;
request({
url: `project/${projectId}/announcement`,
method: "get",
})
.then((response) => {
if (response.data.code === 200) {
let data = response.data.data;
console.log("公告");
data.records.forEach(item => {
item.announcementPublishTime = that.formatDate(item.announcementPublishTime)
})
that.ggList = data.records
console.log(that.ggList);
}
})
.catch(function (error) {
console.log(error);
});
},
formatDate(datetime) {
// slice(-2)100
year = datetime.getFullYear(),
month = ("0" + (datetime.getMonth() + 1)).slice(-2),
date = ("0" + datetime.getDate()).slice(-2),
hour = ("0" + datetime.getHours()).slice(-2),
minute = ("0" + datetime.getMinutes()).slice(-2),
second = ("0" + datetime.getSeconds()).slice(-2);
//
var result = year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second;
//
return result;
},
onEditProjectClick() { onEditProjectClick() {
let {...copy} = this.project let { ...copy } = this.project
copy.projectStartDate = new Date(this.project.projectStartDate*1000) copy.projectStartDate = new Date(this.project.projectStartDate * 1000)
copy.projectOnlineDate = new Date(this.project.projectOnlineDate*1000) copy.projectOnlineDate = new Date(this.project.projectOnlineDate * 1000)
copy.projectFirstTestDate = new Date(this.project.projectFirstTestDate*1000) copy.projectFirstTestDate = new Date(this.project.projectFirstTestDate * 1000)
copy.projectFinalTestDate = new Date(this.project.projectFinalTestDate*1000) copy.projectFinalTestDate = new Date(this.project.projectFinalTestDate * 1000)
copy.projectEndDate = new Date(this.project.projectEndDate*1000) copy.projectEndDate = new Date(this.project.projectEndDate * 1000)
this.editProjectInfo = copy this.editProjectInfo = copy
//this.getProjectClass() //this.getProjectClass()
@ -298,9 +542,10 @@ export default {
}, },
formatDate(date) { formatDate(date) {
if (date) if (date)
return moment(date * 1000).format("yyyy年MM月DD日") return moment(date * 1000).format("yyyy年MM月DD日 HH:mm")
return '无' return '无'
}, },
getProjectInfo() { getProjectInfo() {
const that = this const that = this
request({ request({
@ -356,6 +601,28 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
//
.gg-box {
width: 100%;
height: 100%;
float: left;
font-size: 14px;
}
.gg-info-txt {}
.gg-del-btn {
width: 12%;
height: 30px;
float: right;
font-size: 14px;
line-height: 30px;
color: #409eff;
cursor: pointer;
}
//
.row-info { .row-info {
margin-bottom: 40px; margin-bottom: 40px;
} }