中航光电热表web
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

689 lines
24 KiB

6 months ago
<template>
5 months ago
<basic-container>
<!-- 重点工作管理 -->
4 months ago
<avue-crud :option="option" :table-loading="loading" :data="data" v-model="form" v-model:page="page" ref="crud"
@row-del="rowDel" @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
@current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
5 months ago
<template #menu-left>
<el-button type="primary" icon="el-icon-plus" @click="handleAdd">新增</el-button>
</template>
<template #menu="{ row }">
<el-button type="text" @click="handleView(row)">详情</el-button>
<el-button type="text" @click="handleEdit(row)">修改</el-button>
4 months ago
<el-button type="text" v-if="row.status == 1" @click="checkRow(row)">审核</el-button>
5 months ago
<el-button type="text" @click="deleteRow(row)">删除</el-button>
</template>
<template #userName="{ row }">{{ row.projectHead.userName }}</template>
<template #touchingMan="{ row }">{{ row.touchingMan.userName }}</template>
<template #tsName="{ row }">{{ row.touchingDept.tsName }}</template>
3 months ago
<!-- 列表嵌套表格 -->
5 months ago
<template #expand="{ row }">
3 months ago
<el-table :data="row.stoneList">
4 months ago
<el-table-column label="里程碑计划" align="center" prop="milestonePlan"></el-table-column>
<el-table-column label="里程碑负责人" align="center" prop="milestoneMan.userName"></el-table-column>
<el-table-column label="里程碑输出物" align="center" prop="outputMaterial"></el-table-column>
<el-table-column label="里程碑节点" width="200" align="center" prop="milestoneNode"></el-table-column>
<el-table-column align="center" label="执行类型" prop="executeResultTitle"></el-table-column>
<el-table-column align="center" label="状态" prop="statusTitle"></el-table-column>
<el-table-column align="center" label="延期时间" prop="delayTime"></el-table-column>
<el-table-column align="center" label="核查结果" prop="checkResultTitle"></el-table-column>
<el-table-column align="center" label="核查人" prop="checkMan.userName"></el-table-column>
<el-table-column align="center" label="评价等级" prop="gradeTitle"></el-table-column>
<el-table-column align="center" label="评价人" prop="gradeMan.userName"></el-table-column>
<el-table-column align="center" label="业务领导评价" prop="evaluate"></el-table-column>
5 months ago
<el-table-column label="操作">
<template #default="scope">
4 months ago
<el-button type="text" v-if="scope.row.status == 3" @click="executeRow(row, scope.row)">执行</el-button>
<el-button type="text" v-if="scope.row.status == 4" @click="auditRow(row, scope.row)">核查</el-button>
<el-button type="text" v-if="scope.row.status == 6" @click="examineRow(row, scope.row)">核准</el-button>
6 months ago
</template>
5 months ago
</el-table-column>
</el-table>
</template>
</avue-crud>
4 months ago
<!-- 新增弹窗 -->
3 months ago
<add-dialog :title="title" :visible="addDialogVisible" :add-form="addForm" :add-rules="addRules"
@close="addDialogVisible = false" @submit-form="submitForm"></add-dialog>
5 months ago
<!-- 审核弹窗 -->
<el-dialog v-model="checkDialog" title="审核" append-to-body>
4 months ago
<el-form ref="checkForm" :model="checkForm" :rules="checkRules" label-width="80px">
5 months ago
<el-form-item label="审核结果" prop="checkResult">
<el-select placeholder="请选择审核结果" v-model="checkForm.checkResult">
<el-option label="通过" value="1"></el-option>
<el-option label="不通过" value="2"></el-option>
</el-select>
</el-form-item>
4 months ago
<el-form-item label="审核意见" prop="checkOpinion">
4 months ago
<el-input type="textarea" placeholder="请输入审核意见" v-model="checkForm.checkOpinion"></el-input>
4 months ago
</el-form-item>
5 months ago
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="checkDialog = false"> </el-button>
<el-button type="primary" @click="submitCheck"> </el-button>
</span>
</template>
</el-dialog>
<!-- 执行/核查/核准弹窗 -->
<el-dialog append-to-body :title="subTitle" v-model="executeDialog">
4 months ago
<el-form :model="executeForm" :rules="executeRules" ref="executeForm" label-width="100">
5 months ago
<el-form-item label="项目名称">
<el-input disabled v-model="detailForm.projectName"></el-input>
</el-form-item>
<el-form-item label="项目负责人">
<el-input disabled v-model="detailForm.projectHead.userName"></el-input>
</el-form-item>
<el-form-item label="里程碑计划">
<el-input disabled v-model="executeForm.milestonePlan"></el-input>
</el-form-item>
<el-form-item label="里程碑负责人">
<el-input disabled v-model="executeForm.milestoneMan.userName"></el-input>
</el-form-item>
<el-form-item label="项目目标">
4 months ago
<el-input disabled v-model="executeForm.fmProjectApplication.projectTarget"></el-input>
5 months ago
</el-form-item>
<el-form-item label="预期效果">
4 months ago
<el-input disabled v-model="executeForm.fmProjectApplication.desiredResult"></el-input>
5 months ago
</el-form-item>
<el-form-item label="项目背景">
4 months ago
<el-input disabled v-model="executeForm.fmProjectApplication.projectBackcloth"></el-input>
5 months ago
</el-form-item>
<el-form-item label="里程碑节点">
<el-input disabled v-model="executeForm.milestoneNode"></el-input>
</el-form-item>
<el-form-item label="执行类型" prop="executeResult">
4 months ago
<el-select :disabled="subTitle == '核查' || subTitle == '核准'" v-model="executeForm.executeResult">
5 months ago
<el-option label="延期" :value="1"></el-option>
<el-option label="终止" :value="2"></el-option>
<el-option label="完成" :value="3"></el-option>
</el-select>
</el-form-item>
<el-form-item label="延期时间" v-if="executeForm.executeResult == 1">
4 months ago
<el-date-picker :disabled="subTitle == '核查' || subTitle == '核准'" style="width: 100%"
v-model="executeForm.delayTime" type="datetime" placeholder="选择日期时间" />
5 months ago
</el-form-item>
<el-form-item label="里程碑描述" prop="milestoneMemo">
4 months ago
<el-input :disabled="subTitle == '核查' || subTitle == '核准'" type="textarea"
v-model="executeForm.milestoneMemo"></el-input>
5 months ago
</el-form-item>
<el-form-item label="里程碑进展" prop="evolve">
4 months ago
<el-input :disabled="subTitle == '核查' || subTitle == '核准'" type="textarea"
v-model="executeForm.evolve"></el-input>
5 months ago
</el-form-item>
<el-form-item label="下一步计划" prop="lastPlan">
4 months ago
<el-input :disabled="subTitle == '核查' || subTitle == '核准'" type="textarea"
v-model="executeForm.lastPlan"></el-input>
5 months ago
</el-form-item>
4 months ago
<el-form-item label="附件" v-if="subTitle == '执行' || subTitle == '核查' || subTitle == '核准'">
4 months ago
<el-upload class="upload-demo" action="https://jsonplaceholder.typicode.com/posts/"
:on-preview="handlePreview" :on-remove="handleRemove" :before-remove="beforeRemove" multiple :limit="3"
:on-exceed="handleExceed" :file-list="fileList">
5 months ago
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">不能上传 exe 附件且不超过 20M</div>
</el-upload>
4 months ago
<div v-if="subTitle == '核查' || subTitle == '核准'" class="attachment-list">
<h4>附件下载</h4>
<ul>
<li v-for="(file, index) in existingFiles" :key="index">
<a href="javascript:void(0)" @click="downloadFile(file)">{{ file.name }}</a>
<el-button type="text" size="small" @click="removeExistingFile(index)">删除</el-button>
</li>
</ul>
</div>
5 months ago
</el-form-item>
<el-form-item label="核查人" v-if="subTitle == '执行'">
<el-select v-model="executeForm.userId">
<el-option label="审核人一" value="1"></el-option>
<el-option label="审核人二" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="核查结果" v-if="subTitle == '核查'">
<el-select v-model="executeForm.checkResult">
<el-option label="通过" value="1"></el-option>
<el-option label="不通过" value="2"></el-option>
</el-select>
</el-form-item>
4 months ago
<el-form-item label="审核人" v-if="subTitle == '核查' && executeForm.checkResult == 1">
5 months ago
<el-select v-model="executeForm.userId">
<el-option label="审核人一" value="1"></el-option>
<el-option label="审核人二" value="2"></el-option>
</el-select>
</el-form-item>
<div v-if="subTitle == '核准'" style="color: #ffc300; margin-bottom: 10px">
评价等级分为:(95以上节点推进超前完成质量高)(85-95节点推进正常质量较好)(75-84节点推进轻微拖期完成质量一般)(75以下进展滞后完成质量较差)
</div>
<el-form-item v-if="subTitle == '核准'" label="评价分数">
<el-input v-model="executeForm.score"></el-input>
</el-form-item>
<el-form-item v-if="subTitle == '核准'" label="评语">
<el-input type="textarea" v-model="executeForm.evaluate"></el-input>
</el-form-item>
4 months ago
4 months ago
<el-form-item label="审核意见" prop="checkOpinion" label-width="80px">
4 months ago
<el-input type="textarea" placeholder="请输入审核意见" v-model="checkForm.checkOpinion"></el-input>
4 months ago
</el-form-item>
5 months ago
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="executeDialog = false"> </el-button>
<el-button type="primary" @click="submitExecute"> </el-button>
</span>
</template>
</el-dialog>
</basic-container>
6 months ago
</template>
<script>
3 months ago
import { getProcessList, addProcess } from '../../api/flowManagement/index'
import AddDialog from './addDialog.vue';
6 months ago
export default {
3 months ago
components: { AddDialog },
5 months ago
data() {
return {
// 状态
// 0-立项待提交、1-立项待审核、2-立项审批不通过、3-项目进行中、
// 4-项目待核查、5-项目核查不通过、6-项目待核准、7-项目核准不通过、
// 8-项目已核准
3 months ago
addDialogVisible: false, // 新增弹窗显隐控制
title: "新增",
5 months ago
loading: false,
title: "新增",
checkDialog: false,
subTitle: "执行",
detailForm: {},
checkForm: {},
4 months ago
detailListSelectList: [],
5 months ago
checkRules: {
checkResult: [{ required: true, message: "请选择审核结果", trigger: "blur" }],
},
executeDialog: false,
executeForm: {},
executeRules: {
executeResult: [{ required: true, message: "请选择执行类型", trigger: "blur" }],
milestoneMemo: [{ required: true, message: "请填写里程碑描述", trigger: "blur" }],
evolve: [{ required: true, message: "请填写里程碑进展", trigger: "blur" }],
lastPlan: [{ required: true, message: "请填写下一步计划", trigger: "blur" }],
},
data: [],
form: {},
4 months ago
existingFiles: [], // 已有附件列表
5 months ago
addForm: {
},
addRules: {
projectName: [{ required: true, message: "请输入项目名称", trigger: "blur" }],
bsBasicClass: {
bcId: [{ required: true, message: "请选择项目类型", trigger: "blur" }],
},
touchingDept: {
tsId: [{ required: true, message: "请选择制单部门", trigger: "blur" }],
},
projectBackcloth: [
{ required: true, message: "请输入项目背景", trigger: "blur" },
],
projectTarget: [{ required: true, message: "请输入项目目标", trigger: "blur" }],
desiredResult: [{ required: true, message: "请输入预期效果", trigger: "blur" }],
memberId: [{ required: true, message: "请选择成员", trigger: "blur" }],
projectHead: {
userId: [{ required: true, message: "请选择项目负责人", trigger: "blur" }],
},
projectSupportMan: {
userId: [{ required: true, message: "请选择项目支持人", trigger: "blur" }],
},
projectStartTime: [
{ required: true, message: "请选择项目开始时间", trigger: "blur" },
],
projectDesiredEnd: [
{ required: true, message: "请选择项目结束预期时间", trigger: "blur" },
],
},
page: {
pageSize: 10,
currentPage: 1,
total: 0,
},
option: {
columnSort: true,
tip: false,
expand: true,
rowKey: "id",
height: "auto",
align: "center",
calcHeight: 32,
simplePage: false,
searchShow: true,
searchMenuSpan: 6,
searchIcon: true,
searchIndex: 3,
tree: false,
border: true,
index: false,
selection: true,
viewBtn: false,
delBtn: false,
editBtn: false,
editBtnText: "修改",
editBtnIcon: " ",
delBtnIcon: " ",
addBtn: false,
labelWidth: 120,
searchLabelWidth: 120,
menu: true,
menuWidth: 200,
dialogWidth: 600,
dialogClickModal: false,
searchEnter: true,
excelBtn: true,
gridBtn: false,
searchShowBtn: false,
showOverflowTooltip: true,
searchLabelPosition: "left",
searchLabelPosition: "left",
searchGutter: 24,
searchSpan: 6,
menuAlign: "left",
gridBtn: false,
searchMenuPosition: "right",
addBtnIcon: " ",
viewBtnIcon: " ",
delBtnIcon: " ",
editBtnIcon: " ",
searchShowBtn: false,
column: [
{
label: "单据号",
prop: "paCode",
span: 24,
labelWidth: 140,
overflow: true,
search: true,
rules: [
{
required: true,
message: "请输入单据号",
trigger: "blur",
},
],
},
{
label: "项目名称",
prop: "projectName",
span: 24,
labelWidth: 140,
overflow: true,
search: true,
rules: [
{
required: true,
message: "请输入项目名称",
trigger: "blur",
},
],
},
{
label: "项目负责人",
3 months ago
prop: "projectHead",
5 months ago
span: 24,
labelWidth: 140,
overflow: true,
search: true,
rules: [
{
required: true,
message: "请输入项目负责人",
trigger: "blur",
},
],
},
{
label: "项目开始时间",
prop: "projectStartTime",
span: 24,
labelWidth: 140,
overflow: true,
search: false,
rules: [
{
required: true,
message: "请输入项目开始时间",
trigger: "blur",
},
],
},
{
label: "项目预期结束时间",
prop: "projectDesiredEnd",
span: 24,
labelWidth: 140,
overflow: true,
search: false,
rules: [
{
required: true,
message: "请输入项目预期结束时间",
trigger: "blur",
},
],
},
{
label: "制单人",
prop: "touchingMan",
span: 24,
labelWidth: 140,
overflow: true,
search: false,
rules: [
{
required: true,
message: "请输入制单人",
trigger: "blur",
},
],
},
{
label: "制单部门",
3 months ago
prop: "touchingDept",
5 months ago
span: 24,
labelWidth: 140,
overflow: true,
search: false,
rules: [
{
required: true,
message: "请输入制单部门",
trigger: "blur",
},
],
},
{
label: "制单时间",
prop: "touchingTime",
span: 24,
labelWidth: 140,
overflow: true,
search: false,
rules: [
{
required: true,
message: "请输入制单时间",
trigger: "blur",
},
],
},
{
label: "状态",
3 months ago
prop: "approvalStatus",
5 months ago
span: 24,
labelWidth: 140,
overflow: true,
search: false,
rules: [
{
required: true,
message: "请输入状态",
trigger: "blur",
},
],
},
],
},
};
},
4 months ago
mounted() { },
5 months ago
methods: {
4 months ago
insertEvent() {
4 months ago
// 插入一行
3 months ago
this.addForm.stoneList.push({
4 months ago
})
},
4 months ago
openDialog() {
4 months ago
// 添加新的里程碑行
const newRow = {
status: 3,
statusTitle: "待执行",
checkMan: null,
checkResult: 0,
checkResultTitle: "未核查",
checkTime: null,
delayDate: false,
delayTime: null,
evaluate: null,
evolve: "",
executeResult: 0,
executeResultTitle: "无",
grade: 0,
gradeMan: null,
gradeTitle: "未评价",
keyValue: Date.now(),
lastPlan: "",
milestoneMan: {
accountId: null,
userId: null,
userName: ""
},
milestoneMemo: "",
milestoneNode: "",
milestonePlan: "",
okTime: null,
outputMaterial: "",
3 months ago
paIndex: (this.addForm.stoneList?.length || 0) + 1,
4 months ago
pmId: this.addForm.paId,
score: null,
updateMan: null
};
4 months ago
3 months ago
if (!this.addForm.stoneList) {
this.addForm.stoneList = [];
4 months ago
}
3 months ago
this.addForm.stoneList.push(newRow);
4 months ago
this.$message.success('插入成功');
4 months ago
},
5 months ago
handleAdd() {
this.title = "新增";
this.addForm = {
bsBasicClass: {
bcId: "",
},
touchingDept: {
tsId: "",
},
projectHead: {
userId: "",
},
projectSupportMan: {
userId: "",
},
};
3 months ago
this.addDialogVisible = true;
5 months ago
},
// 查看详情
handleView(row) {
this.title = "详情";
this.addForm = row;
3 months ago
this.addDialogVisible = true;
5 months ago
},
// 修改
handleEdit(row) {
this.addForm = row;
this.title = "修改";
3 months ago
this.addDialogVisible = true;
5 months ago
},
// 删除
deleteRow(row) {
this.$confirm("确定将选择数据删除?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
4 months ago
}).then((res) => { });
5 months ago
},
// 新增/编辑确定
submitForm() {
3 months ago
console.log(tijiaole)
this.loading = true;
this.addDialogVisible = false
this.onLoad(this.page)
5 months ago
},
3 months ago
5 months ago
// 审核立项
checkRow() {
this.checkDialog = true;
},
//确定审核立项
submitCheck() {
this.$refs.checkForm.validate((valid) => {
if (valid) {
this.checkDialog = false;
}
});
},
// 执行
executeRow(row, detail) {
this.executeForm = {};
this.detailForm = row;
this.subTitle = "执行";
this.executeDialog = true;
},
// 确定执行
submitExecute() {
this.$refs.executeForm.validate((valid) => {
if (valid) {
this.executeDialog = false;
}
});
},
// 核查
auditRow(row, detail) {
this.subTitle = "核查";
this.detailForm = row;
this.executeForm = detail;
this.executeForm.checkResult = "";
4 months ago
// 模拟加载已有附件
this.existingFiles = [
{ name: "项目计划书.pdf", url: "#" },
{ name: "进度报告.docx", url: "#" }
];
5 months ago
this.executeDialog = true;
},
// 核准
examineRow(row, detail) {
this.subTitle = "核准";
this.detailForm = row;
this.executeForm = detail;
4 months ago
// 模拟加载已有附件
this.existingFiles = [
{ name: "项目计划书.pdf", url: "#" },
{ name: "进度报告.docx", url: "#" },
{ name: "验收单.xlsx", url: "#" }
];
5 months ago
this.executeDialog = true;
},
4 months ago
// 下载附件
downloadFile(file) {
const link = document.createElement('a');
link.href = file.url;
link.download = file.name;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
},
// 删除已有附件
removeExistingFile(index) {
this.$confirm('确定删除该附件?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.existingFiles.splice(index, 1);
this.$message.success('删除成功');
4 months ago
}).catch(() => { });
4 months ago
},
4 months ago
delTable(index) {
this.$confirm('确定删除该条数据么?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
3 months ago
this.addForm.stoneList.splice(index, 1);
4 months ago
this.$message.success('删除成功');
}).catch(() => { });
},
3 months ago
searchReset() {
this.query = {};
this.onLoad(this.page);
},
searchChange(params, done) {
this.query = params;
this.page.currentPage = 1;
this.onLoad(this.page, params);
done();
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
},
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
refreshChange() {
this.onLoad(this.page, this.query);
},
onLoad(page, params = {}) {
this.loading = true;
getProcessList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(
res => {
this.data = res.data.data.records;
// console.log( this.data ,'----this.data---')
this.loading = false;
this.page.total = res.data.data.total;
// this.selectionClear();
}
);
5 months ago
},
},
};
6 months ago
</script>
4 months ago
<style scoped>
.attachment-list {
margin-top: 10px;
padding: 10px;
border: 1px solid #EBEEF5;
border-radius: 4px;
background-color: #FAFAFA;
}
.attachment-list h4 {
margin: 0 0 10px 0;
font-size: 14px;
color: #606266;
}
.attachment-list ul {
margin: 0;
padding: 0;
list-style-type: none;
}
.attachment-list li {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 0;
border-bottom: 1px solid #EBEEF5;
}
.attachment-list li:last-child {
border-bottom: none;
}
.attachment-list a {
color: #409EFF;
text-decoration: none;
}
.attachment-list a:hover {
color: #66b1ff;
text-decoration: underline;
}
</style>