重点工作管理接口联调

dev-scheduling
zhangdi 3 months ago
parent 9aae1104f2
commit d7925fffc7
  1. 72
      src/api/flowManagement/index.js
  2. 56
      src/views/changeJobManagement/trainingRecordManagement.vue
  3. 937
      src/views/flowManagement/addDialog.vue
  4. 441
      src/views/flowManagement/managementOfKeyTasks.vue

@ -22,3 +22,75 @@ export const addProcess = (data) => {
data data
}); });
} }
// 删除
export const delProcess = (data) => {
return request({
url: '/blade-desk/fmProjectApplication/remove',
method: 'post',
params:data
});
}
// 修改
export const updateProcess = (data) => {
return request({
url: '/blade-desk/fmProjectApplication/update',
method: 'post',
data
});
}
// 查看详情
export const getProcessDetail = (id) => {
return request({
url: '/blade-desk/fmProjectApplication/detail',
method: 'get',
params: {
id
}
});
}
// 导出数据
export const exportfmProjectMilestone = (params) => {
return request({
url: '/blade-desk/fmProjectApplication/export-fmProjectApplication',
method: 'get',
params: params
});
}
// 执行
export const projectExecute = (data) => {
return request({
url: '/blade-desk/fmProjectMilestone/projectExecute',
method: 'post',
data
});
}
// 核查
export const projectCheck = (data) => {
return request({
url: '/blade-desk/fmProjectMilestone/sendCheck',
method: 'post',
data
});
}
// 核准
export const projectApprove = (data) => {
return request({
url: '/blade-desk/fmProjectMilestone/gradeSubmit',
method: 'post',
data
});
}

@ -8,7 +8,6 @@
v-model="form" v-model="form"
v-model:page="page" v-model:page="page"
ref="crud" ref="crud"
@row-del="rowDel"
@search-change="searchChange" @search-change="searchChange"
@search-reset="searchReset" @search-reset="searchReset"
@selection-change="selectionChange" @selection-change="selectionChange"
@ -29,7 +28,7 @@
> >
<el-button <el-button
type="text" type="text"
v-if="scope.row.caStatus == 3 || scope.row.caStatus == 4 || scope.row.caStatus == 5" v-if="scope.row.caStatus == 3 || scope.row.caStatus == 4 || scope.row.caStatus == 5|| scope.row.caStatus == 6"
@click="handleDetail(scope.row)" @click="handleDetail(scope.row)"
>培训详情</el-button >培训详情</el-button
> >
@ -49,17 +48,24 @@
>完成</el-button >完成</el-button
> >
</template> </template>
<template #distributeTime="scope"> <template #distributeTime="scope">
{{ scope.row.distributeTime ? scope.row.distributeTime.substring(0, 10) : '' }} {{ scope.row.distributeTime ? scope.row.distributeTime.substring(0, 10) : '' }}
</template> </template>
</avue-crud> </avue-crud>
<!-- 资料上传 --> <!-- 资料上传 -->
<el-dialog title="资料上传" append-to-body v-model="fileDialog" width="555px" v-if="fileDialog"> <el-dialog title="资料上传" append-to-body v-model="fileDialog" width="555px" v-if="fileDialog">
<avue-form :option="fileOption" v-model="fileForm" :upload-after="uploadAfter"> </avue-form> <avue-form
:option="fileOption"
v-model="fileForm"
:upload-after="uploadAfter"
:upload-exceed="uploadExceed"
:upload-delete="uploadDelete"
>
</avue-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="closeDialog"> </el-button> <el-button @click="fileDialog=false"> </el-button>
<el-button type="primary" @click="submitUpload()"> </el-button> <el-button type="primary" @click="submitUpload()"> </el-button>
</span> </span>
</template> </template>
@ -72,7 +78,7 @@
<el-table-column align="center" label="资料"> <el-table-column align="center" label="资料">
<template #default="scope"> <template #default="scope">
<!-- attachLink --> <!-- attachLink -->
<el-button type="text">资料下载</el-button> <el-button v-if="scope.row.attachLink!=''" type="text" @click="downloadFile(scope.row)">资料下载</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -167,14 +173,16 @@ export default {
label: '资料上传', label: '资料上传',
prop: 'excelFile', prop: 'excelFile',
type: 'upload', type: 'upload',
drag: true, // drag: true,
loadText: '附件上传中,请稍等', loadText: '附件上传中,请稍等',
span: 24, span: 24,
limit: 1,
fileSize: 10000,
propsHttp: { propsHttp: {
res: 'data', res: 'data',
}, },
tip: '不能上传 附件,且不超过 10M', tip: '不能上传 附件,且不超过 10M',
action: '/blade-system/user/import-user', action: '/api/blade-resource/oss/endpoint/put-file-attach',
}, },
], ],
}, },
@ -334,13 +342,17 @@ export default {
}, },
uploadInfo: {}, uploadInfo: {},
rowData: {}, rowData: {},
attachLink:''
}; };
}, },
mounted() { mounted() {
this.getPlanList() this.getPlanList();
this.getUserList() this.getUserList();
}, },
methods: { methods: {
downloadFile(link) {
window.open(link);
},
// //
handleUpdate(row) { handleUpdate(row) {
this.rowData = row; this.rowData = row;
@ -356,7 +368,7 @@ export default {
this.teacherArr = res.data.data.records; this.teacherArr = res.data.data.records;
}); });
}, },
// //
changeTeacher(val) { changeTeacher(val) {
let select = this.teacherArr.find(e => e.id == val); let select = this.teacherArr.find(e => e.id == val);
this.formModel.teacherName = select.realName; this.formModel.teacherName = select.realName;
@ -379,6 +391,9 @@ export default {
} }
}); });
}, },
refreshChange() {
this.onLoad(this.page, this.query);
},
searchReset() { searchReset() {
this.query = {}; this.query = {};
this.onLoad(this.page, this.query); this.onLoad(this.page, this.query);
@ -444,8 +459,21 @@ export default {
}); });
} }
}, },
uploadAfter(res, done, loading, column) {
console.log('uploadAfter', res, done, loading, column);
this.attachLink = res.link;
// this.fileForm.excelFile = [res.link];
// done();
},
uploadDelete(file, column) {
// this.fileForm.excelFile = [];
},
uploadExceed(limit, files, fileList, column) {
this.$message.error('最多只能上传一个文件');
},
// //
handleUpload(type, row) { handleUpload(type, row) {
this.fileForm.excelFile = [];
if (type == 'all') { if (type == 'all') {
if (this.selectionList.length == 0) { if (this.selectionList.length == 0) {
this.$message.error('请至少选择一条数据'); this.$message.error('请至少选择一条数据');
@ -465,10 +493,10 @@ export default {
}, },
// //
submitUpload() { submitUpload() {
console.log(this.fileForm, 'fileForm'); console.log(this.fileForm,this.attachLink , 'fileForm');
if (this.selectionList.length > 0) { if (this.selectionList.length > 0) {
this.selectionList.forEach(item => { this.selectionList.forEach(item => {
item.attachLink = ''; item.attachLink = this.attachLink ;
}); });
uploadMaterials(this.selectionList).then(res => { uploadMaterials(this.selectionList).then(res => {
this.$message.success('上传成功'); this.$message.success('上传成功');
@ -478,7 +506,7 @@ export default {
}); });
} else { } else {
this.uploadInfo.forEach(item => { this.uploadInfo.forEach(item => {
this.fileForm.attachLink = ''; this.fileForm.attachLink = this.attachLink ;
}); });
uploadMaterials(this.uploadInfo).then(res => { uploadMaterials(this.uploadInfo).then(res => {
this.$message.success('上传成功'); this.$message.success('上传成功');

@ -1,428 +1,555 @@
<!-- addDialog.vue -->
<template> <template>
<el-dialog append-to-body="false" :title="title" :model-value="visible" width="80%" @close="handleClose"> <el-dialog
<!-- 单个 Form 包裹所有内容基础信息 + 表格 --> append-to-body="false"
<el-form ref="addForm" :model="addForm" :rules="addRules" label-width="140px"> :title="title"
<!-- 全局错误提示 --> :model-value="visible"
<div v-if="formError" class="error-message" style="color: #f56c6c; margin-bottom: 10px;"> width="70%"
{{ formError }} @close="handleClose"
</div>
>
<!-- 单个 Form 包裹所有内容基础信息 + 表格 -->
<el-form ref="addForm" :model="addForm" :rules="addRules" label-width="140px">
<!-- 全局错误提示 -->
<div v-if="formError" class="error-message" style="color: #f56c6c; margin-bottom: 10px">
{{ formError }}
</div>
<!-- 项目基础信息表单 --> <!-- 项目基础信息表单 -->
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="项目名称" prop="projectName"> <el-form-item label="项目名称" prop="projectName">
<el-input :disabled="isDetail" v-model="addForm.projectName"></el-input> <el-input :disabled="isDetail" v-model="addForm.projectName"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="项目类型" prop="bcId"> <el-form-item label="项目类型" prop="bcId">
<el-select :disabled="isDetail" v-model="addForm.bcId"> <el-select :disabled="isDetail" v-model="addForm.bcId">
<el-option label="成本效率" :value="'310'"></el-option> <el-option label="成本效率" :value="'310'"></el-option>
<el-option label="成本效率1" :value="'311'"></el-option> <el-option label="成本效率1" :value="'311'"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="制单部门" prop="touchingDept"> <el-form-item label="制单部门" prop="touchingDept">
<el-select :disabled="isDetail" v-model="addForm.touchingDept"> <el-select :disabled="isDetail" v-model="addForm.touchingDept">
<el-option label="化学镀镍一班崔胜伟" value="61"></el-option> <el-option label="化学镀镍一班崔胜伟" value="61"></el-option>
<el-option label="部门二" value="62"></el-option> <el-option label="部门二" value="62"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="项目背景" prop="projectBackcloth"> <el-form-item label="项目背景" prop="projectBackcloth">
<el-input :disabled="isDetail" type="textarea" v-model="addForm.projectBackcloth"></el-input> <el-input
</el-form-item> :disabled="isDetail"
</el-col> type="textarea"
</el-row> v-model="addForm.projectBackcloth"
<el-row> ></el-input>
<el-col :span="24"> </el-form-item>
<el-form-item label="项目目标" prop="projectTarget"> </el-col>
<el-input :disabled="isDetail" type="textarea" v-model="addForm.projectTarget"></el-input> </el-row>
</el-form-item> <el-row>
</el-col> <el-col :span="24">
</el-row> <el-form-item label="项目目标" prop="projectTarget">
<el-row> <el-input
<el-col :span="24"> :disabled="isDetail"
<el-form-item label="预期效果" prop="desiredResult"> type="textarea"
<el-input :disabled="isDetail" type="textarea" v-model="addForm.desiredResult"></el-input> v-model="addForm.projectTarget"
</el-form-item> ></el-input>
</el-col> </el-form-item>
</el-row> </el-col>
<el-row> </el-row>
<el-col :span="8"> <el-row>
<el-form-item label="项目负责人" prop="projectHead"> <el-col :span="24">
<el-select :disabled="isDetail" v-model="addForm.projectHead"> <el-form-item label="预期效果" prop="desiredResult">
<el-option label="admin" :value="1"></el-option> <el-input
<el-option label="负责人二" :value="2"></el-option> :disabled="isDetail"
</el-select> type="textarea"
</el-form-item> v-model="addForm.desiredResult"
</el-col> ></el-input>
<el-col :span="8"> </el-form-item>
<el-form-item label="成员名称" prop="memberName"> </el-col>
<el-select :disabled="isDetail" v-model="addForm.memberName" multiple placeholder="请选择成员名称"> </el-row>
<el-option label="测试" :value="521"></el-option> <el-row>
<el-option label="成员二" :value="2"></el-option> <el-col :span="8">
</el-select> <el-form-item label="项目负责人" prop="projectHead">
</el-form-item> <el-select :disabled="isDetail" v-model="addForm.projectHead">
</el-col> <el-option label="admin" :value="1"></el-option>
</el-row> <el-option label="负责人二" :value="2"></el-option>
<el-row> </el-select>
<el-col :span="8"> </el-form-item>
<el-form-item label="项目支持人" prop="projectSupportMan"> </el-col>
<el-select :disabled="isDetail" v-model="addForm.projectSupportMan"> <el-col :span="8">
<el-option label="测试" value="521"></el-option> <el-form-item label="成员名称" prop="memberName">
<el-option label="支持人二" value="2"></el-option> <el-select
</el-select> :disabled="isDetail"
</el-form-item> v-model="addForm.memberName"
</el-col> multiple
<el-col :span="8"> placeholder="请选择成员名称"
<el-form-item label="项目开始时间" prop="projectStartTime"> >
<el-date-picker :disabled="isDetail" style="width: 100%" v-model="addForm.projectStartTime" <el-option label="测试" :value="521"></el-option>
type="datetime" placeholder="选择日期" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"> </el-date-picker> <el-option label="成员二" :value="2"></el-option>
</el-form-item> </el-select>
</el-col> </el-form-item>
<el-col :span="8"> </el-col>
<el-form-item label="项目结束预期时间" prop="projectDesiredEnd"> </el-row>
<el-date-picker :disabled="isDetail" style="width: 100%" v-model="addForm.projectDesiredEnd" <el-row>
type="datetime" placeholder="选择日期" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"></el-date-picker> <el-col :span="8">
</el-form-item> <el-form-item label="项目支持人" prop="projectSupportMan">
</el-col> <el-select :disabled="isDetail" v-model="addForm.projectSupportMan">
</el-row> <el-option label="测试" value="521"></el-option>
<el-option label="支持人二" value="2"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目开始时间" prop="projectStartTime">
<el-date-picker
:disabled="isDetail"
style="width: 100%"
v-model="addForm.projectStartTime"
type="datetime"
placeholder="选择日期"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目结束预期时间" prop="projectDesiredEnd">
<el-date-picker
:disabled="isDetail"
style="width: 100%"
v-model="addForm.projectDesiredEnd"
type="datetime"
placeholder="选择日期"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<!-- 里程碑表格操作 --> <!-- 里程碑表格操作 -->
<div style="margin: 10px 0" v-if="!isDetail"> <div style="margin: 10px 0" v-if="!isDetail">
<el-button type="primary" icon="el-icon-plus" @click="handleOpenDialog">插入一行</el-button> <el-button type="primary" @click="handleOpenDialog">插入一行</el-button>
</div> <el-button type="danger" @click="delTable">删除选中行</el-button>
</div>
<!-- 里程碑表格 --> <!-- 里程碑表格 -->
<el-table :data="addForm.stoneList" ref="detailTable" border> <el-table :data="addForm.stoneList" ref="detailTable" border @select="selectChange">
<el-table-column type="selection"></el-table-column> <el-table-column type="selection"></el-table-column>
<el-table-column type="index" width="80" label="序号"></el-table-column> <el-table-column type="index" width="80" label="序号"></el-table-column>
<el-table-column align="center" :width="isDetail ? '120' : ''" label="里程碑计划"> <el-table-column align="center" :width="isDetail ? '120' : ''" label="里程碑计划">
<template #default="scope"> <template #default="scope">
<template v-if="!isDetail"> <template v-if="!isDetail">
<el-form-item label-width="0" :prop="`stoneList[${scope.$index}].milestonePlan`" <el-form-item
:rules="addRules.milestonePlan"> label-width="0"
<el-input v-model="scope.row.milestonePlan" placeholder="请输入里程碑计划"></el-input> :prop="`stoneList[${scope.$index}].milestonePlan`"
</el-form-item> :rules="addRules.milestonePlan"
</template> >
<template v-else> <el-input
<span>{{ scope.row.milestonePlan }}</span> v-model="scope.row.milestonePlan"
</template> placeholder="请输入里程碑计划"
</template> ></el-input>
</el-table-column> </el-form-item>
<el-table-column align="center" :width="isDetail ? '120' : ''" label="里程碑负责人" prop="milestoneMan"> </template>
<template #default="scope"> <template v-else>
<template v-if="!isDetail"> <span>{{ scope.row.milestonePlan }}</span>
<el-form-item label-width="0" :prop="`stoneList[${scope.$index}].milestoneMan`" </template>
:rules="addRules.milestoneMan"> </template>
<el-select v-model="scope.row.milestoneMan" placeholder="请选择里程碑负责人"> </el-table-column>
<el-option label="负责人一" :value="1"></el-option> <el-table-column
<el-option label="负责人二" :value="2"></el-option> align="center"
</el-select> :width="isDetail ? '120' : ''"
</el-form-item> label="里程碑负责人"
</template> prop="milestoneMan"
<template v-else> >
<span>{{ scope.row.milestoneMan }}</span> <template #default="scope">
</template> <template v-if="!isDetail">
</template> <el-form-item
</el-table-column> label-width="0"
<el-table-column align="center" :width="isDetail ? '120' : ''" label="里程碑输出物" prop="outputMaterial"> :prop="`stoneList[${scope.$index}].milestoneMan`"
<template #default="scope"> :rules="addRules.milestoneMan"
<template v-if="!isDetail"> >
<el-form-item label-width="0" :prop="`stoneList[${scope.$index}].outputMaterial`" <el-select v-model="scope.row.milestoneMan" placeholder="请选择里程碑负责人">
:rules="addRules.outputMaterial"> <el-option label="负责人一" :value="1"></el-option>
<el-input v-model="scope.row.outputMaterial" placeholder="请输入里程碑输出物"></el-input> <el-option label="负责人二" :value="2"></el-option>
</el-form-item> </el-select>
</template> </el-form-item>
<template v-else> </template>
<span>{{ scope.row.outputMaterial }}</span> <template v-else>
</template> <span>{{ scope.row.milestoneMan }}</span>
</template> </template>
</el-table-column> </template>
<el-table-column align="center" :width="isDetail ? '180' : ''" label="里程碑节点" prop="milestoneNode"> </el-table-column>
<template #default="scope"> <el-table-column
<template v-if="!isDetail"> align="center"
<el-form-item label-width="0" :prop="`stoneList[${scope.$index}].milestoneNode`" :width="isDetail ? '120' : ''"
:rules="addRules.milestoneNode"> label="里程碑输出物"
<el-date-picker v-model="scope.row.milestoneNode" type="datetime" placeholder="选择日期时间" prop="outputMaterial"
style="width: 100%" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"/> >
</el-form-item> <template #default="scope">
</template> <template v-if="!isDetail">
<template v-else> <el-form-item
<span>{{ scope.row.milestoneNode }}</span> label-width="0"
</template> :prop="`stoneList[${scope.$index}].outputMaterial`"
</template> :rules="addRules.outputMaterial"
</el-table-column> >
<!-- 详情页专属列 --> <el-input
<el-table-column v-if="isDetail" align="center" label="执行类型" prop="executeType"></el-table-column> v-model="scope.row.outputMaterial"
<el-table-column v-if="isDetail" align="center" label="延期时间" prop="delayTime"></el-table-column> placeholder="请输入里程碑输出物"
<el-table-column v-if="isDetail" align="center" label="核查结果" prop="checkResult"></el-table-column> ></el-input>
<el-table-column v-if="isDetail" align="center" label="核查人" prop="checkMan"></el-table-column> </el-form-item>
<el-table-column v-if="isDetail" align="center" label="评价等级" prop="grade"></el-table-column> </template>
<el-table-column v-if="isDetail" align="center" label="评价人" prop="gradeMan"></el-table-column> <template v-else>
<el-table-column v-if="isDetail" width="200" align="center" label="业务领导评价" <span>{{ scope.row.outputMaterial }}</span>
prop="evaluate"></el-table-column> </template>
<el-table-column v-if="isDetail" align="center" label="附件"> </template>
<el-button type="text">附件</el-button> </el-table-column>
</el-table-column> <el-table-column
<!-- 通用操作列 --> align="center"
<el-table-column label="操作"> :width="isDetail ? '180' : ''"
<template #default="scope"> label="里程碑节点"
<el-button plain type="danger" @click="handleDelTable(scope.$index)">删除</el-button> prop="milestoneNode"
</template> >
</el-table-column> <template #default="scope">
</el-table> <template v-if="!isDetail">
</el-form> <el-form-item
<!-- 弹窗底部按钮 --> label-width="0"
<template #footer> :prop="`stoneList[${scope.$index}].milestoneNode`"
<span class="dialog-footer"> :rules="addRules.milestoneNode"
<el-button @click="visible = false"> </el-button> >
<el-button type="primary" @click="handleSubmitForm"> </el-button> <el-date-picker
</span> v-model="scope.row.milestoneNode"
</template> type="datetime"
</el-dialog> placeholder="选择日期时间"
style="width: 100%"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-form-item>
</template>
<template v-else>
<span>{{ scope.row.milestoneNode }}</span>
</template>
</template>
</el-table-column>
<!-- 详情页专属列 -->
<el-table-column
v-if="isDetail"
align="center"
label="执行类型"
prop="executeType"
></el-table-column>
<el-table-column
v-if="isDetail"
align="center"
label="延期时间"
prop="delayTime"
></el-table-column>
<el-table-column
v-if="isDetail"
align="center"
label="核查结果"
prop="checkResult"
></el-table-column>
<el-table-column
v-if="isDetail"
align="center"
label="核查人"
prop="checkMan"
></el-table-column>
<el-table-column
v-if="isDetail"
align="center"
label="评价等级"
prop="grade"
></el-table-column>
<el-table-column
v-if="isDetail"
align="center"
label="评价人"
prop="gradeMan"
></el-table-column>
<el-table-column
v-if="isDetail"
width="200"
align="center"
label="业务领导评价"
prop="evaluate"
></el-table-column>
<el-table-column v-if="isDetail" align="center" label="附件">
<el-button type="text">附件</el-button>
</el-table-column>
<!-- 通用操作列 -->
<!-- <el-table-column label="操作">
<template #default="scope">
<el-button plain type="danger" @click="handleDelTable(scope.$index)">删除</el-button>
</template>
</el-table-column> -->
</el-table>
</el-form>
<!-- 弹窗底部按钮 -->
<template #footer>
<span class="dialog-footer">
<el-button @click="visible = false"> </el-button>
<el-button type="primary" @click="handleSubmitForm"> </el-button>
</span>
</template>
</el-dialog>
</template> </template>
<script> <script>
import { addProcess } from '../../api/flowManagement/index' import { addProcess } from '../../api/flowManagement/index';
export default { export default {
name: 'AddDialog', name: 'AddDialog',
props: { props: {
title: { title: {
type: String, type: String,
required: true required: true,
}, },
visible: { visible: {
type: Boolean, type: Boolean,
required: true, required: true,
default: false default: false,
},
addForm: {
type: Object,
required: true,
default: () => ({
id: 0,
paCode: "",
touchingMan: "",
touchingDept: "",
touchingTime: "",
projectName: "",
bcId: 0,
projectBackcloth: "",
projectTarget: "",
desiredResult: "",
projectStartTime: "",
projectDesiredEnd: "",
projectEnd: "",
projectSupportMan: "",
projectHead: "",
memberId: 0,
memberName: "",
approvalStatus: 0,
stoneList: [] //
})
}
}, },
data() { addForm: {
return { type: Object,
formError: '', required: true,
addRules: { default: () => ({
projectName: [ id: 0,
{ required: true, message: '请填写项目名称', trigger: ['blur', 'submit'] } paCode: '',
], touchingMan: '',
bcId: [ touchingDept: '',
{ required: true, message: '请选择项目类型', trigger: ['change', 'submit'] } touchingTime: '',
], projectName: '',
touchingDept: [ bcId: 0,
{ required: true, message: '请选择制单部门', trigger: ['change', 'submit'] } projectBackcloth: '',
], projectTarget: '',
projectBackcloth: [ desiredResult: '',
{ required: true, message: '请填写项目背景', trigger: ['blur', 'submit'] } projectStartTime: '',
], projectDesiredEnd: '',
projectTarget: [ projectEnd: '',
{ required: true, message: '请填写项目目标', trigger: ['blur', 'submit'] } projectSupportMan: '',
], projectHead: '',
desiredResult: [ memberId: 0,
{ required: true, message: '请填写预期效果', trigger: ['blur', 'submit'] } memberName: '',
], approvalStatus: 0,
projectHead: [ stoneList: [], //
{ required: true, message: '请选择项目负责人', trigger: ['change', 'submit'] } }),
], },
memberName: [ },
{ required: true, message: '请选择成员名称', trigger: ['change', 'submit'] } data() {
], return {
projectSupportMan: [ formError: '',
{ required: true, message: '请选择项目支持人', trigger: ['change', 'submit'] } addRules: {
], projectName: [{ required: true, message: '请填写项目名称', trigger: ['blur', 'submit'] }],
projectStartTime: [ bcId: [{ required: true, message: '请选择项目类型', trigger: ['change', 'submit'] }],
{ required: true, message: '请选择项目开始时间', trigger: ['change', 'submit'] } touchingDept: [
], { required: true, message: '请选择制单部门', trigger: ['change', 'submit'] },
projectDesiredEnd: [ ],
{ required: true, message: '请选择项目结束预期时间', trigger: ['change', 'submit'] } projectBackcloth: [
], { required: true, message: '请填写项目背景', trigger: ['blur', 'submit'] },
stoneList: [ ],
{ projectTarget: [{ required: true, message: '请填写项目目标', trigger: ['blur', 'submit'] }],
required: true, desiredResult: [{ required: true, message: '请填写预期效果', trigger: ['blur', 'submit'] }],
message: '请至少添加一行里程碑数据', projectHead: [
trigger: 'submit', { required: true, message: '请选择项目负责人', trigger: ['change', 'submit'] },
type: 'array' ],
}, memberName: [{ required: true, message: '请选择成员名称', trigger: ['change', 'submit'] }],
{ projectSupportMan: [
validator: (rule, value, callback) => { { required: true, message: '请选择项目支持人', trigger: ['change', 'submit'] },
if (value.length === 0) { ],
callback(new Error('请至少添加一行里程碑数据')); projectStartTime: [
} else { { required: true, message: '请选择项目开始时间', trigger: ['change', 'submit'] },
callback(); ],
} projectDesiredEnd: [
}, { required: true, message: '请选择项目结束预期时间', trigger: ['change', 'submit'] },
trigger: 'submit' ],
} stoneList: [
], {
required: true,
message: '请至少添加一行里程碑数据',
trigger: 'submit',
type: 'array',
},
{
validator: (rule, value, callback) => {
if (value.length === 0) {
callback(new Error('请至少添加一行里程碑数据'));
} else {
callback();
}
},
trigger: 'submit',
},
],
// //
milestonePlan: [ milestonePlan: [
{ required: true, message: '请填写里程碑计划', trigger: ['blur', 'submit'] } { required: true, message: '请填写里程碑计划', trigger: ['blur', 'submit'] },
], ],
milestoneMan: [ milestoneMan: [
{ required: true, message: '请选择里程碑负责人', trigger: ['change', 'submit'] } { required: true, message: '请选择里程碑负责人', trigger: ['change', 'submit'] },
], ],
outputMaterial: [ outputMaterial: [
{ required: true, message: '请输入里程碑输出物', trigger: ['blur', 'submit'] } { required: true, message: '请输入里程碑输出物', trigger: ['blur', 'submit'] },
], ],
milestoneNode: [ milestoneNode: [
{ required: true, message: '请选择里程碑节点', trigger: ['change', 'submit'] } { required: true, message: '请选择里程碑节点', trigger: ['change', 'submit'] },
] ],
} },
} };
},
computed: {
//
isDetail() {
return this.title === '详情';
}, },
computed: { },
// methods: {
isDetail() { handleClose() {
return this.title === '详情'; this.$emit('close ', false);
} this.formError = '';
this.$refs.addForm?.resetFields();
},
selectChange(list, row) {
row._select = !row._select;
},
//
delTable() {
this.addForm.stoneList = this.addForm.stoneList.filter(row => !row._select);
},
//
handleOpenDialog() {
const newRow = {
id: 0,
fmProjectApplication: {},
attachList: [], //
paId: 0,
paIndex: `${(this.addForm.stoneList?.length || 0) + 1}`,
milestonePlan: '',
milestoneMan: '',
outputMaterial: '',
milestoneNode: '',
milestoneMemo: '',
evolve: '',
lastPlan: '',
grade: -32768,
score: 0,
executeResult: 0,
executeType: '',
delayTime: '',
checkResult: 0,
checkMan: '',
checkTime: '',
gradeMan: '',
evaluate: '',
okTime: '',
delayDate: false,
fileId: '',
};
if (!this.addForm.stoneList) this.addForm.stoneList = [];
this.addForm.stoneList.push(newRow);
// this.$emit('open-dialog', newRow); //
},
//
handleDelTable(index) {
this.$confirm('确定删除该条数据么?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
this.addForm.stoneList.splice(index, 1);
this.$message.success('删除成功');
this.$emit('del-table', index); //
})
.catch(() => {});
}, },
methods: { formatSubmitData(form) {
handleClose() { const submitData = JSON.parse(JSON.stringify(form));
this.$emit('close ', false); if (Array.isArray(submitData.memberName)) {
this.formError = ''; submitData.memberName = submitData.memberName.map(item => String(item)).join(',');
this.$refs.addForm?.resetFields(); }
}, submitData.stoneList = submitData.stoneList.map(row => {
// const { fmProjectApplication, attachList, paIndex, ...validData } = row;
handleOpenDialog() { return validData;
const newRow = { });
id: 0, return submitData;
fmProjectApplication: {}, },
attachList: [], // async handleSubmitForm() {
paId: 0, this.formError = '';
paIndex: `${(this.addForm.stoneList?.length || 0) + 1}`, this.$refs.addForm.validate((isValid, invalidFields) => {
milestonePlan: "", if (!isValid) {
milestoneMan: "", this.formError = '存在未完善的字段,请检查红色提示';
outputMaterial: "", this.$nextTick(() => {
milestoneNode: "", const firstError = document.querySelector('.el-form-item.is-error');
milestoneMemo: "", if (firstError) {
evolve: "", firstError.scrollIntoView({ behavior: 'smooth', block: 'center' });
lastPlan: "",
grade: -32768,
score: 0,
executeResult: 0,
executeType: "",
delayTime: "",
checkResult: 0,
checkMan: "",
checkTime: "",
gradeMan: "",
evaluate: "",
okTime: "",
delayDate: false,
fileId: ""
};
if (!this.addForm.stoneList) this.addForm.stoneList = [];
this.addForm.stoneList.push(newRow);
this.$message.success('插入成功');
this.$emit('open-dialog', newRow); //
},
//
handleDelTable(index) {
this.$confirm('确定删除该条数据么?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.addForm.stoneList.splice(index, 1);
this.$message.success('删除成功');
this.$emit('del-table', index); //
}).catch(() => { });
},
formatSubmitData(form) {
const submitData = JSON.parse(JSON.stringify(form));
if (Array.isArray(submitData.memberName)) {
submitData.memberName = submitData.memberName.map(item => String(item)).join(',');
} }
submitData.stoneList = submitData.stoneList.map(row => { });
const { fmProjectApplication, attachList, paIndex, ...validData } = row; return;
return validData; }
}); const submitData = this.formatSubmitData(this.addForm);
return submitData; try {
}, const res = addProcess(submitData);
async handleSubmitForm() { if (res.code === 200) {
this.formError = ''; this.$message.success('提交成功');
this.$refs.addForm.validate((isValid, invalidFields) => { this.visible = false;
if (!isValid) { this.$emit('submit-form', submitData);
this.formError = '存在未完善的字段,请检查红色提示'; } else {
this.$nextTick(() => { this.$message.error(res.msg || '提交失败');
const firstError = document.querySelector('.el-form-item.is-error'); }
if (firstError) { this.visible = false;
firstError.scrollIntoView({ behavior: 'smooth', block: 'center' }); this.$emit('submit-form', submitData);
} } catch (err) {
}); this.$message.error(err.message);
return; console.error('提交失败:', err);
}
const submitData = this.formatSubmitData(this.addForm)
try {
const res = addProcess(submitData);
if (res.code === 200) {
this.$message.success('提交成功');
this.visible = false;
this.$emit('submit-form', submitData);
} else {
this.$message.error(res.msg || '提交失败');
}
this.visible = false;
this.$emit('submit-form', submitData);
} catch (err) {
this.$message.error(err.message);
console.error('提交失败:', err);
}
});
} }
} });
},
},
}; };
</script> </script>
<style scoped> <style lang="scss" scoped>
/* 统一错误提示样式(和 addEditDialog 一致) */ //
.error-message { :deep(.el-table .el-form-item) {
font-size: 14px; margin-bottom: 0; //
line-height: 1.5;
} }
//
:deep(.el-form-item__error) { :deep(.el-form-item__error) {
font-size: 12px; font-size: 12px;
white-space: nowrap; white-space: nowrap;
z-index: 10; z-index: 10;
background: #fff; background: #fff;
padding: 2px 4px; padding: 2px 4px;
border: 1px solid #f56c6c; border: 1px solid #f56c6c;
border-radius: 4px; border-radius: 4px;
} }
:deep(.el-table .el-form-item) { .el-table__row {
margin-bottom: 0; height: 80px !important;
} }
</style>
.el-table__cell {
vertical-align: middle !important;
}
.error-message {
font-size: 14px;
line-height: 1.5;
}
:deep(.el-table .el-table__cell) {
height: 50px !important;
padding: 0 !important;
line-height: 50px !important;
}
</style>

@ -1,11 +1,24 @@
<template> <template>
<basic-container> <basic-container>
<!-- 重点工作管理 --> <!-- 重点工作管理 -->
<avue-crud :option="option" :table-loading="loading" :data="data" v-model="form" v-model:page="page" ref="crud" <avue-crud
@row-del="rowDel" @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange" :option="option"
@current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad"> :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"
>
<template #menu-left> <template #menu-left>
<el-button type="primary" icon="el-icon-plus" @click="handleAdd">新增</el-button> <el-button type="primary" @click="handleAdd">新增</el-button>
</template> </template>
<template #menu="{ row }"> <template #menu="{ row }">
<el-button type="text" @click="handleView(row)">详情</el-button> <el-button type="text" @click="handleView(row)">详情</el-button>
@ -20,41 +33,77 @@
<template #expand="{ row }"> <template #expand="{ row }">
<el-table :data="row.stoneList"> <el-table :data="row.stoneList">
<el-table-column label="里程碑计划" align="center" prop="milestonePlan"></el-table-column> <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
<el-table-column label="里程碑输出物" align="center" prop="outputMaterial"></el-table-column> label="里程碑负责人"
<el-table-column label="里程碑节点" width="200" align="center" prop="milestoneNode"></el-table-column> align="center"
<el-table-column align="center" label="执行类型" prop="executeResultTitle"></el-table-column> prop="milestoneMan"
></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="executeType"
></el-table-column>
<el-table-column align="center" label="状态" prop="statusTitle"></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="delayTime"></el-table-column>
<el-table-column align="center" label="核查结果" prop="checkResultTitle"></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="checkMan.userName"></el-table-column>
<el-table-column align="center" label="评价等级" prop="gradeTitle"></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="gradeMan.userName"></el-table-column>
<el-table-column align="center" label="业务领导评价" prop="evaluate"></el-table-column> <el-table-column align="center" label="业务领导评价" prop="evaluate"></el-table-column>
<el-table-column label="操作"> <el-table-column label="操作">
<template #default="scope"> <template #default="scope">
<el-button type="text" v-if="scope.row.status == 3" @click="executeRow(row, scope.row)">执行</el-button> <el-button
<el-button type="text" v-if="scope.row.status == 4" @click="auditRow(row, scope.row)">核查</el-button> type="text"
<el-button type="text" v-if="scope.row.status == 6" @click="examineRow(row, scope.row)">核准</el-button> 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
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</template> </template>
</avue-crud> </avue-crud>
<!-- 新增弹窗 --> <!-- 新增弹窗 -->
<add-dialog :title="title" :visible="addDialogVisible" :add-form="addForm" :add-rules="addRules" <add-dialog
@close="addDialogVisible = false" @submit-form="submitForm"></add-dialog> :title="title"
:visible="addDialogVisible"
:add-form="addForm"
:add-rules="addRules"
@close="addDialogVisible = false"
@submit-form="submitForm"
></add-dialog>
<!-- 审核弹窗 --> <!-- 审核弹窗 -->
<el-dialog v-model="checkDialog" title="审核" append-to-body> <el-dialog v-model="checkDialog" title="审核" append-to-body width="30%">
<el-form ref="checkForm" :model="checkForm" :rules="checkRules" label-width="80px"> <el-form ref="checkForm" :model="checkForm" :rules="checkRules" label-width="80px">
<el-form-item label="审核结果" prop="checkResult"> <el-form-item label="审核结果" prop="checkResult">
<el-select placeholder="请选择审核结果" v-model="checkForm.checkResult"> <el-radio-group v-model="checkForm.checkResult">
<el-option label="通过" value="1"></el-option> <el-radio label="1">通过</el-radio>
<el-option label="不通过" value="2"></el-option> <el-radio label="2">不通过</el-radio>
</el-select> </el-radio-group>
</el-form-item>
<el-form-item label="审核意见" prop="checkOpinion">
<el-input type="textarea" placeholder="请输入审核意见" v-model="checkForm.checkOpinion"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
@ -92,32 +141,60 @@
<el-input disabled v-model="executeForm.milestoneNode"></el-input> <el-input disabled v-model="executeForm.milestoneNode"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="执行类型" prop="executeResult"> <el-form-item label="执行类型" prop="executeResult">
<el-select :disabled="subTitle == '核查' || subTitle == '核准'" v-model="executeForm.executeResult"> <el-select
:disabled="subTitle == '核查' || subTitle == '核准'"
v-model="executeForm.executeResult"
>
<el-option label="延期" :value="1"></el-option> <el-option label="延期" :value="1"></el-option>
<el-option label="终止" :value="2"></el-option> <el-option label="终止" :value="2"></el-option>
<el-option label="完成" :value="3"></el-option> <el-option label="完成" :value="3"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="延期时间" v-if="executeForm.executeResult == 1"> <el-form-item label="延期时间" v-if="executeForm.executeResult == 1">
<el-date-picker :disabled="subTitle == '核查' || subTitle == '核准'" style="width: 100%" <el-date-picker
v-model="executeForm.delayTime" type="datetime" placeholder="选择日期时间" /> :disabled="subTitle == '核查' || subTitle == '核准'"
style="width: 100%"
v-model="executeForm.delayTime"
type="datetime"
placeholder="选择日期时间"
/>
</el-form-item> </el-form-item>
<el-form-item label="里程碑描述" prop="milestoneMemo"> <el-form-item label="里程碑描述" prop="milestoneMemo">
<el-input :disabled="subTitle == '核查' || subTitle == '核准'" type="textarea" <el-input
v-model="executeForm.milestoneMemo"></el-input> :disabled="subTitle == '核查' || subTitle == '核准'"
type="textarea"
v-model="executeForm.milestoneMemo"
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="里程碑进展" prop="evolve"> <el-form-item label="里程碑进展" prop="evolve">
<el-input :disabled="subTitle == '核查' || subTitle == '核准'" type="textarea" <el-input
v-model="executeForm.evolve"></el-input> :disabled="subTitle == '核查' || subTitle == '核准'"
type="textarea"
v-model="executeForm.evolve"
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="下一步计划" prop="lastPlan"> <el-form-item label="下一步计划" prop="lastPlan">
<el-input :disabled="subTitle == '核查' || subTitle == '核准'" type="textarea" <el-input
v-model="executeForm.lastPlan"></el-input> :disabled="subTitle == '核查' || subTitle == '核准'"
type="textarea"
v-model="executeForm.lastPlan"
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="附件" v-if="subTitle == '执行' || subTitle == '核查' || subTitle == '核准'"> <el-form-item
<el-upload class="upload-demo" action="https://jsonplaceholder.typicode.com/posts/" label="附件"
:on-preview="handlePreview" :on-remove="handleRemove" :before-remove="beforeRemove" multiple :limit="3" v-if="subTitle == '执行' || subTitle == '核查' || subTitle == '核准'"
:on-exceed="handleExceed" :file-list="fileList"> >
<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"
>
<el-button size="small" type="primary">点击上传</el-button> <el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">不能上传 exe 附件且不超过 20M</div> <div slot="tip" class="el-upload__tip">不能上传 exe 附件且不超过 20M</div>
</el-upload> </el-upload>
@ -126,7 +203,9 @@
<ul> <ul>
<li v-for="(file, index) in existingFiles" :key="index"> <li v-for="(file, index) in existingFiles" :key="index">
<a href="javascript:void(0)" @click="downloadFile(file)">{{ file.name }}</a> <a href="javascript:void(0)" @click="downloadFile(file)">{{ file.name }}</a>
<el-button type="text" size="small" @click="removeExistingFile(index)">删除</el-button> <el-button type="text" size="small" @click="removeExistingFile(index)"
>删除</el-button
>
</li> </li>
</ul> </ul>
</div> </div>
@ -160,7 +239,11 @@
</el-form-item> </el-form-item>
<el-form-item label="审核意见" prop="checkOpinion" label-width="80px"> <el-form-item label="审核意见" prop="checkOpinion" label-width="80px">
<el-input type="textarea" placeholder="请输入审核意见" v-model="checkForm.checkOpinion"></el-input> <el-input
type="textarea"
placeholder="请输入审核意见"
v-model="checkForm.checkOpinion"
></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
@ -174,7 +257,7 @@
</template> </template>
<script> <script>
import { getProcessList, addProcess } from '../../api/flowManagement/index' import { getProcessList, addProcess, updateProcess,delProcess } from '../../api/flowManagement/index';
import AddDialog from './addDialog.vue'; import AddDialog from './addDialog.vue';
export default { export default {
@ -186,56 +269,49 @@ export default {
// 4-5-6-7- // 4-5-6-7-
// 8- // 8-
addDialogVisible: false, // addDialogVisible: false, //
title: "新增", title: '新增',
loading: false, loading: false,
title: "新增", title: '新增',
checkDialog: false, checkDialog: false,
subTitle: "执行", subTitle: '执行',
detailForm: {}, detailForm: {},
checkForm: {}, checkForm: {},
detailListSelectList: [], detailListSelectList: [],
checkRules: { checkRules: {
checkResult: [{ required: true, message: "请选择审核结果", trigger: "blur" }], checkResult: [{ required: true, message: '请选择审核结果', trigger: 'blur' }],
}, },
executeDialog: false, executeDialog: false,
executeForm: {}, executeForm: {},
executeRules: { executeRules: {
executeResult: [{ required: true, message: "请选择执行类型", trigger: "blur" }], executeResult: [{ required: true, message: '请选择执行类型', trigger: 'blur' }],
milestoneMemo: [{ required: true, message: "请填写里程碑描述", trigger: "blur" }], milestoneMemo: [{ required: true, message: '请填写里程碑描述', trigger: 'blur' }],
evolve: [{ required: true, message: "请填写里程碑进展", trigger: "blur" }], evolve: [{ required: true, message: '请填写里程碑进展', trigger: 'blur' }],
lastPlan: [{ required: true, message: "请填写下一步计划", trigger: "blur" }], lastPlan: [{ required: true, message: '请填写下一步计划', trigger: 'blur' }],
}, },
data: [], data: [],
form: {}, form: {},
existingFiles: [], // existingFiles: [], //
addForm: { addForm: {},
},
addRules: { addRules: {
projectName: [{ required: true, message: "请输入项目名称", trigger: "blur" }], projectName: [{ required: true, message: '请输入项目名称', trigger: 'blur' }],
bsBasicClass: { bsBasicClass: {
bcId: [{ required: true, message: "请选择项目类型", trigger: "blur" }], bcId: [{ required: true, message: '请选择项目类型', trigger: 'blur' }],
}, },
touchingDept: { touchingDept: {
tsId: [{ required: true, message: "请选择制单部门", trigger: "blur" }], tsId: [{ required: true, message: '请选择制单部门', trigger: 'blur' }],
}, },
projectBackcloth: [ projectBackcloth: [{ required: true, message: '请输入项目背景', trigger: 'blur' }],
{ required: true, message: "请输入项目背景", trigger: "blur" }, projectTarget: [{ required: true, message: '请输入项目目标', trigger: 'blur' }],
], desiredResult: [{ required: true, message: '请输入预期效果', trigger: 'blur' }],
projectTarget: [{ required: true, message: "请输入项目目标", trigger: "blur" }], memberId: [{ required: true, message: '请选择成员', trigger: 'blur' }],
desiredResult: [{ required: true, message: "请输入预期效果", trigger: "blur" }],
memberId: [{ required: true, message: "请选择成员", trigger: "blur" }],
projectHead: { projectHead: {
userId: [{ required: true, message: "请选择项目负责人", trigger: "blur" }], userId: [{ required: true, message: '请选择项目负责人', trigger: 'blur' }],
}, },
projectSupportMan: { projectSupportMan: {
userId: [{ required: true, message: "请选择项目支持人", trigger: "blur" }], userId: [{ required: true, message: '请选择项目支持人', trigger: 'blur' }],
}, },
projectStartTime: [ projectStartTime: [{ required: true, message: '请选择项目开始时间', trigger: 'blur' }],
{ required: true, message: "请选择项目开始时间", trigger: "blur" }, projectDesiredEnd: [{ required: true, message: '请选择项目结束预期时间', trigger: 'blur' }],
],
projectDesiredEnd: [
{ required: true, message: "请选择项目结束预期时间", trigger: "blur" },
],
}, },
page: { page: {
pageSize: 10, pageSize: 10,
@ -246,9 +322,9 @@ export default {
columnSort: true, columnSort: true,
tip: false, tip: false,
expand: true, expand: true,
rowKey: "id", rowKey: 'id',
height: "auto", height: 'auto',
align: "center", align: 'center',
calcHeight: 32, calcHeight: 32,
simplePage: false, simplePage: false,
searchShow: true, searchShow: true,
@ -258,13 +334,13 @@ export default {
tree: false, tree: false,
border: true, border: true,
index: false, index: false,
selection: true, selection: false,
viewBtn: false, viewBtn: false,
delBtn: false, delBtn: false,
editBtn: false, editBtn: false,
editBtnText: "修改", editBtnText: '修改',
editBtnIcon: " ", editBtnIcon: ' ',
delBtnIcon: " ", delBtnIcon: ' ',
addBtn: false, addBtn: false,
labelWidth: 120, labelWidth: 120,
searchLabelWidth: 120, searchLabelWidth: 120,
@ -277,23 +353,23 @@ export default {
gridBtn: false, gridBtn: false,
searchShowBtn: false, searchShowBtn: false,
showOverflowTooltip: true, showOverflowTooltip: true,
searchLabelPosition: "left", searchLabelPosition: 'left',
searchLabelPosition: "left", searchLabelPosition: 'left',
searchGutter: 24, searchGutter: 24,
searchSpan: 6, searchSpan: 6,
menuAlign: "left", menuAlign: 'left',
gridBtn: false, gridBtn: false,
searchMenuPosition: "right", searchMenuPosition: 'right',
addBtnIcon: " ", addBtnIcon: ' ',
viewBtnIcon: " ", viewBtnIcon: ' ',
delBtnIcon: " ", delBtnIcon: ' ',
editBtnIcon: " ", editBtnIcon: ' ',
searchShowBtn: false, searchShowBtn: false,
column: [ column: [
{ {
label: "单据号", label: '单据号',
prop: "paCode", prop: 'paCode',
span: 24, span: 24,
labelWidth: 140, labelWidth: 140,
overflow: true, overflow: true,
@ -301,14 +377,14 @@ export default {
rules: [ rules: [
{ {
required: true, required: true,
message: "请输入单据号", message: '请输入单据号',
trigger: "blur", trigger: 'blur',
}, },
], ],
}, },
{ {
label: "项目名称", label: '项目名称',
prop: "projectName", prop: 'projectName',
span: 24, span: 24,
labelWidth: 140, labelWidth: 140,
overflow: true, overflow: true,
@ -316,14 +392,14 @@ export default {
rules: [ rules: [
{ {
required: true, required: true,
message: "请输入项目名称", message: '请输入项目名称',
trigger: "blur", trigger: 'blur',
}, },
], ],
}, },
{ {
label: "项目负责人", label: '项目负责人',
prop: "projectHead", prop: 'projectHead',
span: 24, span: 24,
labelWidth: 140, labelWidth: 140,
overflow: true, overflow: true,
@ -331,14 +407,14 @@ export default {
rules: [ rules: [
{ {
required: true, required: true,
message: "请输入项目负责人", message: '请输入项目负责人',
trigger: "blur", trigger: 'blur',
}, },
], ],
}, },
{ {
label: "项目开始时间", label: '项目开始时间',
prop: "projectStartTime", prop: 'projectStartTime',
span: 24, span: 24,
labelWidth: 140, labelWidth: 140,
overflow: true, overflow: true,
@ -346,14 +422,14 @@ export default {
rules: [ rules: [
{ {
required: true, required: true,
message: "请输入项目开始时间", message: '请输入项目开始时间',
trigger: "blur", trigger: 'blur',
}, },
], ],
}, },
{ {
label: "项目预期结束时间", label: '项目预期结束时间',
prop: "projectDesiredEnd", prop: 'projectDesiredEnd',
span: 24, span: 24,
labelWidth: 140, labelWidth: 140,
overflow: true, overflow: true,
@ -361,14 +437,14 @@ export default {
rules: [ rules: [
{ {
required: true, required: true,
message: "请输入项目预期结束时间", message: '请输入项目预期结束时间',
trigger: "blur", trigger: 'blur',
}, },
], ],
}, },
{ {
label: "制单人", label: '制单人',
prop: "touchingMan", prop: 'touchingMan',
span: 24, span: 24,
labelWidth: 140, labelWidth: 140,
overflow: true, overflow: true,
@ -376,14 +452,14 @@ export default {
rules: [ rules: [
{ {
required: true, required: true,
message: "请输入制单人", message: '请输入制单人',
trigger: "blur", trigger: 'blur',
}, },
], ],
}, },
{ {
label: "制单部门", label: '制单部门',
prop: "touchingDept", prop: 'touchingDept',
span: 24, span: 24,
labelWidth: 140, labelWidth: 140,
overflow: true, overflow: true,
@ -391,14 +467,14 @@ export default {
rules: [ rules: [
{ {
required: true, required: true,
message: "请输入制单部门", message: '请输入制单部门',
trigger: "blur", trigger: 'blur',
}, },
], ],
}, },
{ {
label: "制单时间", label: '制单时间',
prop: "touchingTime", prop: 'touchingTime',
span: 24, span: 24,
labelWidth: 140, labelWidth: 140,
overflow: true, overflow: true,
@ -406,14 +482,14 @@ export default {
rules: [ rules: [
{ {
required: true, required: true,
message: "请输入制单时间", message: '请输入制单时间',
trigger: "blur", trigger: 'blur',
}, },
], ],
}, },
{ {
label: "状态", label: '状态',
prop: "approvalStatus", prop: 'approvalStatus',
span: 24, span: 24,
labelWidth: 140, labelWidth: 140,
overflow: true, overflow: true,
@ -421,56 +497,56 @@ export default {
rules: [ rules: [
{ {
required: true, required: true,
message: "请输入状态", message: '请输入状态',
trigger: "blur", trigger: 'blur',
}, },
], ],
}, },
], ],
}, },
rowItem: {}, //
}; };
}, },
mounted() { }, mounted() {},
methods: { methods: {
insertEvent() { insertEvent() {
// //
this.addForm.stoneList.push({ this.addForm.stoneList.push({});
})
}, },
openDialog() { openDialog() {
// //
const newRow = { const newRow = {
status: 3, status: 3,
statusTitle: "待执行", statusTitle: '待执行',
checkMan: null, checkMan: null,
checkResult: 0, checkResult: 0,
checkResultTitle: "未核查", checkResultTitle: '未核查',
checkTime: null, checkTime: null,
delayDate: false, delayDate: false,
delayTime: null, delayTime: null,
evaluate: null, evaluate: null,
evolve: "", evolve: '',
executeResult: 0, executeResult: 0,
executeResultTitle: "无", executeResultTitle: '无',
grade: 0, grade: 0,
gradeMan: null, gradeMan: null,
gradeTitle: "未评价", gradeTitle: '未评价',
keyValue: Date.now(), keyValue: Date.now(),
lastPlan: "", lastPlan: '',
milestoneMan: { milestoneMan: {
accountId: null, accountId: null,
userId: null, userId: null,
userName: "" userName: '',
}, },
milestoneMemo: "", milestoneMemo: '',
milestoneNode: "", milestoneNode: '',
milestonePlan: "", milestonePlan: '',
okTime: null, okTime: null,
outputMaterial: "", outputMaterial: '',
paIndex: (this.addForm.stoneList?.length || 0) + 1, paIndex: (this.addForm.stoneList?.length || 0) + 1,
pmId: this.addForm.paId, pmId: this.addForm.paId,
score: null, score: null,
updateMan: null updateMan: null,
}; };
if (!this.addForm.stoneList) { if (!this.addForm.stoneList) {
@ -480,60 +556,75 @@ export default {
this.$message.success('插入成功'); this.$message.success('插入成功');
}, },
handleAdd() { handleAdd() {
this.title = "新增"; this.title = '新增';
this.addForm = { this.addForm = {
bsBasicClass: { bsBasicClass: {
bcId: "", bcId: '',
}, },
touchingDept: { touchingDept: {
tsId: "", tsId: '',
}, },
projectHead: { projectHead: {
userId: "", userId: '',
}, },
projectSupportMan: { projectSupportMan: {
userId: "", userId: '',
}, },
}; };
this.addDialogVisible = true; this.addDialogVisible = true;
}, },
// //
handleView(row) { handleView(row) {
this.title = "详情"; this.title = '详情';
this.addForm = row; this.addForm = row;
this.addDialogVisible = true; this.addDialogVisible = true;
}, },
// //
handleEdit(row) { handleEdit(row) {
this.addForm = row; this.addForm = row;
this.title = "修改"; this.title = '修改';
this.addDialogVisible = true; this.addDialogVisible = true;
}, },
// //
deleteRow(row) { deleteRow(row) {
this.$confirm("确定将选择数据删除?", { this.$confirm('确定将选择数据删除?', {
confirmButtonText: "确定", confirmButtonText: '确定',
cancelButtonText: "取消", cancelButtonText: '取消',
type: "warning", type: 'warning',
}).then((res) => { }); }).then(res => {
delProcess({ids:row.id}).then(res => {
this.$message.success('删除成功');
this.onLoad(this.page,this.query);
});
});
}, },
// / // /
submitForm() { submitForm() {
console.log(tijiaole) console.log(tijiaole);
this.loading = true; this.loading = true;
this.addDialogVisible = false this.addDialogVisible = false;
this.onLoad(this.page) this.onLoad(this.page);
}, },
// //
checkRow() { checkRow(row) {
this.checkDialog = true; this.checkDialog = true;
this.rowItem = row;
}, },
// //
submitCheck() { submitCheck() {
this.$refs.checkForm.validate((valid) => { this.$refs.checkForm.validate(valid => {
if (valid) { if (valid) {
this.checkDialog = false;
let query = {
id: this.rowItem.id,
approvalStatus: this.checkForm.checkResult == 1 ? 3 : 2,
};
updateProcess(query).then(res => {
this.checkDialog = false;
this.onLoad(this.page);
});
} }
}); });
}, },
@ -541,12 +632,12 @@ export default {
executeRow(row, detail) { executeRow(row, detail) {
this.executeForm = {}; this.executeForm = {};
this.detailForm = row; this.detailForm = row;
this.subTitle = "执行"; this.subTitle = '执行';
this.executeDialog = true; this.executeDialog = true;
}, },
// //
submitExecute() { submitExecute() {
this.$refs.executeForm.validate((valid) => { this.$refs.executeForm.validate(valid => {
if (valid) { if (valid) {
this.executeDialog = false; this.executeDialog = false;
} }
@ -554,27 +645,27 @@ export default {
}, },
// //
auditRow(row, detail) { auditRow(row, detail) {
this.subTitle = "核查"; this.subTitle = '核查';
this.detailForm = row; this.detailForm = row;
this.executeForm = detail; this.executeForm = detail;
this.executeForm.checkResult = ""; this.executeForm.checkResult = '';
// //
this.existingFiles = [ this.existingFiles = [
{ name: "项目计划书.pdf", url: "#" }, { name: '项目计划书.pdf', url: '#' },
{ name: "进度报告.docx", url: "#" } { name: '进度报告.docx', url: '#' },
]; ];
this.executeDialog = true; this.executeDialog = true;
}, },
// //
examineRow(row, detail) { examineRow(row, detail) {
this.subTitle = "核准"; this.subTitle = '核准';
this.detailForm = row; this.detailForm = row;
this.executeForm = detail; this.executeForm = detail;
// //
this.existingFiles = [ this.existingFiles = [
{ name: "项目计划书.pdf", url: "#" }, { name: '项目计划书.pdf', url: '#' },
{ name: "进度报告.docx", url: "#" }, { name: '进度报告.docx', url: '#' },
{ name: "验收单.xlsx", url: "#" } { name: '验收单.xlsx', url: '#' },
]; ];
this.executeDialog = true; this.executeDialog = true;
}, },
@ -592,21 +683,25 @@ export default {
this.$confirm('确定删除该附件?', '提示', { this.$confirm('确定删除该附件?', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning',
}).then(() => { })
this.existingFiles.splice(index, 1); .then(() => {
this.$message.success('删除成功'); this.existingFiles.splice(index, 1);
}).catch(() => { }); this.$message.success('删除成功');
})
.catch(() => {});
}, },
delTable(index) { delTable(index) {
this.$confirm('确定删除该条数据么?', '提示', { this.$confirm('确定删除该条数据么?', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning',
}).then(() => { })
this.addForm.stoneList.splice(index, 1); .then(() => {
this.$message.success('删除成功'); this.addForm.stoneList.splice(index, 1);
}).catch(() => { }); this.$message.success('删除成功');
})
.catch(() => {});
}, },
searchReset() { searchReset() {
this.query = {}; this.query = {};
@ -647,9 +742,9 @@ export default {
.attachment-list { .attachment-list {
margin-top: 10px; margin-top: 10px;
padding: 10px; padding: 10px;
border: 1px solid #EBEEF5; border: 1px solid #ebeef5;
border-radius: 4px; border-radius: 4px;
background-color: #FAFAFA; background-color: #fafafa;
} }
.attachment-list h4 { .attachment-list h4 {
@ -669,7 +764,7 @@ export default {
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
padding: 8px 0; padding: 8px 0;
border-bottom: 1px solid #EBEEF5; border-bottom: 1px solid #ebeef5;
} }
.attachment-list li:last-child { .attachment-list li:last-child {
@ -677,7 +772,7 @@ export default {
} }
.attachment-list a { .attachment-list a {
color: #409EFF; color: #409eff;
text-decoration: none; text-decoration: none;
} }

Loading…
Cancel
Save