|
|
|
@ -4,8 +4,7 @@
|
|
|
|
|
display: flex;flex-direction: row;justify-content: space-between">
|
|
|
|
|
<div style="width: 32%; height: 100%;display: flex;flex-direction: column">
|
|
|
|
|
<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; ">
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
@ -37,8 +36,9 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<p class="p-subtitle">进度</p>
|
|
|
|
|
<el-progress :status="(totalNum !== 0 && completeNum === totalNum) ? 'success' : ''"
|
|
|
|
|
:percentage="totalNum === 0 ? 0 : Math.round(completeNum * 100 / totalNum)" />
|
|
|
|
|
<el-progress
|
|
|
|
|
:status="(totalNum!==0&&completeNum===totalNum) ? 'success' : ''"
|
|
|
|
|
:percentage="totalNum===0?0:Math.round(completeNum*100/totalNum)"/>
|
|
|
|
|
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
@ -47,8 +47,7 @@
|
|
|
|
|
</div>
|
|
|
|
|
<div style="flex: 1;margin-left: 30px;height: 100%;display: flex;flex-direction: column">
|
|
|
|
|
<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;">
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
@ -60,12 +59,10 @@
|
|
|
|
|
<div style="margin: 0 10px 0 10px;
|
|
|
|
|
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>
|
|
|
|
|
<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
|
|
|
|
|
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">
|
|
|
|
|
<div style="flex:1;margin-top: 30px;padding: 20px;
|
|
|
|
|
display: flex;flex-direction: column; justify-content: space-between;background-color: white; border-radius: 10px; ">
|
|
|
|
|
<el-row class="row-info">
|
|
|
|
|
<el-col :span="6">
|
|
|
|
|
<p class="p-subtitle">英文简称</p>
|
|
|
|
@ -149,55 +146,12 @@
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
<div style="flex: 1;margin-left: 30px;display: flex;flex-direction: column;">
|
|
|
|
|
|
|
|
|
|
<div>
|
|
|
|
|
<p class="p-title" style="margin-left: 10px;width: 40%;float: left;">公告</p>
|
|
|
|
|
<div style="width: 80px;height: 40px;float:right;">
|
|
|
|
|
<el-button @click="addggboxbtn()" type="primary">新增</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
<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;
|
|
|
|
|
display: flex;flex-direction: column; justify-content: space-between;background-color: white; border-radius: 10px;">
|
|
|
|
|
<p>{{ project.projectDescription }}</p>
|
|
|
|
|
</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;"> < 返回</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 }} 发布人:{{ findGgInfoContent.announcementPublisherName }}
|
|
|
|
|
</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>
|
|
|
|
|
|
|
|
|
@ -255,51 +209,16 @@
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</el-scrollbar>
|
|
|
|
|
|
|
|
|
|
<EditProjectDialog :dialogFormVisible="editProjectDialogVisible" :projectClasses="projectClasses"
|
|
|
|
|
:projectSubClasses="projectSubClasses" :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>
|
|
|
|
|
<EditProjectDialog
|
|
|
|
|
:dialogFormVisible="editProjectDialogVisible" :projectClasses="projectClasses"
|
|
|
|
|
:projectSubClasses="projectSubClasses"
|
|
|
|
|
:projectInfo="editProjectInfo"
|
|
|
|
|
@edited="onEdited"/>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup>
|
|
|
|
|
|
|
|
|
|
import { ref } from 'vue'
|
|
|
|
|
import {ref} from 'vue'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
@ -310,7 +229,7 @@ import EditProjectDialog from "../components/EditProjectDialog";
|
|
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
name: "ProjectInfo",
|
|
|
|
|
components: { EditProjectDialog },
|
|
|
|
|
components: {EditProjectDialog},
|
|
|
|
|
data() {
|
|
|
|
|
return {
|
|
|
|
|
project: {
|
|
|
|
@ -344,29 +263,7 @@ export default {
|
|
|
|
|
viewHeight: 0,
|
|
|
|
|
|
|
|
|
|
editProjectDialogVisible: false,
|
|
|
|
|
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:""
|
|
|
|
|
|
|
|
|
|
editProjectInfo: {}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
props: {
|
|
|
|
@ -425,9 +322,7 @@ export default {
|
|
|
|
|
created() {
|
|
|
|
|
this.getProjectInfo();
|
|
|
|
|
this.getProjectStats();
|
|
|
|
|
this.getProjectClass();
|
|
|
|
|
this.getannouncementList();
|
|
|
|
|
|
|
|
|
|
this.getProjectClass()
|
|
|
|
|
},
|
|
|
|
|
mounted() {
|
|
|
|
|
const that = this
|
|
|
|
@ -435,154 +330,15 @@ export default {
|
|
|
|
|
window.onresize = () => {
|
|
|
|
|
that.viewHeight = window.innerHeight - 150;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
|
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)过滤掉大于10日期前面的0
|
|
|
|
|
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() {
|
|
|
|
|
let { ...copy } = this.project
|
|
|
|
|
copy.projectStartDate = new Date(this.project.projectStartDate * 1000)
|
|
|
|
|
copy.projectOnlineDate = new Date(this.project.projectOnlineDate * 1000)
|
|
|
|
|
copy.projectFirstTestDate = new Date(this.project.projectFirstTestDate * 1000)
|
|
|
|
|
copy.projectFinalTestDate = new Date(this.project.projectFinalTestDate * 1000)
|
|
|
|
|
copy.projectEndDate = new Date(this.project.projectEndDate * 1000)
|
|
|
|
|
let {...copy} = this.project
|
|
|
|
|
copy.projectStartDate = new Date(this.project.projectStartDate*1000)
|
|
|
|
|
copy.projectOnlineDate = new Date(this.project.projectOnlineDate*1000)
|
|
|
|
|
copy.projectFirstTestDate = new Date(this.project.projectFirstTestDate*1000)
|
|
|
|
|
copy.projectFinalTestDate = new Date(this.project.projectFinalTestDate*1000)
|
|
|
|
|
copy.projectEndDate = new Date(this.project.projectEndDate*1000)
|
|
|
|
|
|
|
|
|
|
this.editProjectInfo = copy
|
|
|
|
|
//this.getProjectClass()
|
|
|
|
@ -594,10 +350,9 @@ export default {
|
|
|
|
|
},
|
|
|
|
|
formatDate(date) {
|
|
|
|
|
if (date)
|
|
|
|
|
return moment(date * 1000).format("yyyy年MM月DD日 HH:mm")
|
|
|
|
|
return moment(date * 1000).format("yyyy年MM月DD日")
|
|
|
|
|
return '无'
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
getProjectInfo() {
|
|
|
|
|
const that = this
|
|
|
|
|
request({
|
|
|
|
@ -653,28 +408,6 @@ export default {
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<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 {
|
|
|
|
|
margin-bottom: 40px;
|
|
|
|
|
}
|
|
|
|
|