Compare commits
2 Commits
d9987e18c1
...
dc4e7651db
| Author | SHA1 | Date |
|---|---|---|
|
|
dc4e7651db | 3 months ago |
|
|
08863e0b70 | 3 months ago |
3 changed files with 509 additions and 2887 deletions
@ -0,0 +1,24 @@ |
|||||||
|
import request from '@/axios'; |
||||||
|
|
||||||
|
// 获取列表
|
||||||
|
export const getProcessList = (current, size, params) => { |
||||||
|
return request({ |
||||||
|
url: '/blade-desk/fmProjectApplication/page', |
||||||
|
method: 'get', |
||||||
|
params: { |
||||||
|
...params, |
||||||
|
current, |
||||||
|
size, |
||||||
|
}, |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
// 新增
|
||||||
|
export const addProcess = (data) => { |
||||||
|
console.log(data, 'api的data'); |
||||||
|
return request({ |
||||||
|
url: '/blade-desk/fmProjectApplication/submit', |
||||||
|
method: 'post', |
||||||
|
data |
||||||
|
}); |
||||||
|
} |
||||||
@ -0,0 +1,428 @@ |
|||||||
|
<!-- addDialog.vue --> |
||||||
|
<template> |
||||||
|
<el-dialog append-to-body="false" :title="title" :model-value="visible" width="80%" @close="handleClose"> |
||||||
|
<!-- 单个 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-col :span="8"> |
||||||
|
<el-form-item label="项目名称" prop="projectName"> |
||||||
|
<el-input :disabled="isDetail" v-model="addForm.projectName"></el-input> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="8"> |
||||||
|
<el-form-item label="项目类型" prop="bcId"> |
||||||
|
<el-select :disabled="isDetail" v-model="addForm.bcId"> |
||||||
|
<el-option label="成本效率" :value="'310'"></el-option> |
||||||
|
<el-option label="成本效率1" :value="'311'"></el-option> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="8"> |
||||||
|
<el-form-item label="制单部门" prop="touchingDept"> |
||||||
|
<el-select :disabled="isDetail" v-model="addForm.touchingDept"> |
||||||
|
<el-option label="化学镀镍一班崔胜伟" value="61"></el-option> |
||||||
|
<el-option label="部门二" value="62"></el-option> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
<el-row> |
||||||
|
<el-col :span="24"> |
||||||
|
<el-form-item label="项目背景" prop="projectBackcloth"> |
||||||
|
<el-input :disabled="isDetail" type="textarea" v-model="addForm.projectBackcloth"></el-input> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
<el-row> |
||||||
|
<el-col :span="24"> |
||||||
|
<el-form-item label="项目目标" prop="projectTarget"> |
||||||
|
<el-input :disabled="isDetail" type="textarea" v-model="addForm.projectTarget"></el-input> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
<el-row> |
||||||
|
<el-col :span="24"> |
||||||
|
<el-form-item label="预期效果" prop="desiredResult"> |
||||||
|
<el-input :disabled="isDetail" type="textarea" v-model="addForm.desiredResult"></el-input> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
<el-row> |
||||||
|
<el-col :span="8"> |
||||||
|
<el-form-item label="项目负责人" prop="projectHead"> |
||||||
|
<el-select :disabled="isDetail" v-model="addForm.projectHead"> |
||||||
|
<el-option label="admin" :value="1"></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="memberName"> |
||||||
|
<el-select :disabled="isDetail" v-model="addForm.memberName" multiple placeholder="请选择成员名称"> |
||||||
|
<el-option label="测试" :value="521"></el-option> |
||||||
|
<el-option label="成员二" :value="2"></el-option> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
<el-row> |
||||||
|
<el-col :span="8"> |
||||||
|
<el-form-item label="项目支持人" prop="projectSupportMan"> |
||||||
|
<el-select :disabled="isDetail" v-model="addForm.projectSupportMan"> |
||||||
|
<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"> |
||||||
|
<el-button type="primary" icon="el-icon-plus" @click="handleOpenDialog">插入一行</el-button> |
||||||
|
</div> |
||||||
|
|
||||||
|
<!-- 里程碑表格 --> |
||||||
|
<el-table :data="addForm.stoneList" ref="detailTable" border> |
||||||
|
<el-table-column type="selection"></el-table-column> |
||||||
|
<el-table-column type="index" width="80" label="序号"></el-table-column> |
||||||
|
<el-table-column align="center" :width="isDetail ? '120' : ''" label="里程碑计划"> |
||||||
|
<template #default="scope"> |
||||||
|
<template v-if="!isDetail"> |
||||||
|
<el-form-item label-width="0" :prop="`stoneList[${scope.$index}].milestonePlan`" |
||||||
|
:rules="addRules.milestonePlan"> |
||||||
|
<el-input v-model="scope.row.milestonePlan" placeholder="请输入里程碑计划"></el-input> |
||||||
|
</el-form-item> |
||||||
|
</template> |
||||||
|
<template v-else> |
||||||
|
<span>{{ scope.row.milestonePlan }}</span> |
||||||
|
</template> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column align="center" :width="isDetail ? '120' : ''" label="里程碑负责人" prop="milestoneMan"> |
||||||
|
<template #default="scope"> |
||||||
|
<template v-if="!isDetail"> |
||||||
|
<el-form-item label-width="0" :prop="`stoneList[${scope.$index}].milestoneMan`" |
||||||
|
:rules="addRules.milestoneMan"> |
||||||
|
<el-select v-model="scope.row.milestoneMan" placeholder="请选择里程碑负责人"> |
||||||
|
<el-option label="负责人一" :value="1"></el-option> |
||||||
|
<el-option label="负责人二" :value="2"></el-option> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
</template> |
||||||
|
<template v-else> |
||||||
|
<span>{{ scope.row.milestoneMan }}</span> |
||||||
|
</template> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column align="center" :width="isDetail ? '120' : ''" label="里程碑输出物" prop="outputMaterial"> |
||||||
|
<template #default="scope"> |
||||||
|
<template v-if="!isDetail"> |
||||||
|
<el-form-item label-width="0" :prop="`stoneList[${scope.$index}].outputMaterial`" |
||||||
|
:rules="addRules.outputMaterial"> |
||||||
|
<el-input v-model="scope.row.outputMaterial" placeholder="请输入里程碑输出物"></el-input> |
||||||
|
</el-form-item> |
||||||
|
</template> |
||||||
|
<template v-else> |
||||||
|
<span>{{ scope.row.outputMaterial }}</span> |
||||||
|
</template> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column align="center" :width="isDetail ? '180' : ''" label="里程碑节点" prop="milestoneNode"> |
||||||
|
<template #default="scope"> |
||||||
|
<template v-if="!isDetail"> |
||||||
|
<el-form-item label-width="0" :prop="`stoneList[${scope.$index}].milestoneNode`" |
||||||
|
:rules="addRules.milestoneNode"> |
||||||
|
<el-date-picker v-model="scope.row.milestoneNode" type="datetime" 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> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { addProcess } from '../../api/flowManagement/index' |
||||||
|
export default { |
||||||
|
name: 'AddDialog', |
||||||
|
props: { |
||||||
|
title: { |
||||||
|
type: String, |
||||||
|
required: true |
||||||
|
}, |
||||||
|
visible: { |
||||||
|
type: Boolean, |
||||||
|
required: true, |
||||||
|
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() { |
||||||
|
return { |
||||||
|
formError: '', |
||||||
|
addRules: { |
||||||
|
projectName: [ |
||||||
|
{ required: true, message: '请填写项目名称', trigger: ['blur', 'submit'] } |
||||||
|
], |
||||||
|
bcId: [ |
||||||
|
{ required: true, message: '请选择项目类型', trigger: ['change', 'submit'] } |
||||||
|
], |
||||||
|
touchingDept: [ |
||||||
|
{ required: true, message: '请选择制单部门', trigger: ['change', 'submit'] } |
||||||
|
], |
||||||
|
projectBackcloth: [ |
||||||
|
{ required: true, message: '请填写项目背景', trigger: ['blur', 'submit'] } |
||||||
|
], |
||||||
|
projectTarget: [ |
||||||
|
{ required: true, message: '请填写项目目标', trigger: ['blur', 'submit'] } |
||||||
|
], |
||||||
|
desiredResult: [ |
||||||
|
{ required: true, message: '请填写预期效果', trigger: ['blur', 'submit'] } |
||||||
|
], |
||||||
|
projectHead: [ |
||||||
|
{ required: true, message: '请选择项目负责人', trigger: ['change', 'submit'] } |
||||||
|
], |
||||||
|
memberName: [ |
||||||
|
{ required: true, message: '请选择成员名称', trigger: ['change', 'submit'] } |
||||||
|
], |
||||||
|
projectSupportMan: [ |
||||||
|
{ required: true, message: '请选择项目支持人', trigger: ['change', 'submit'] } |
||||||
|
], |
||||||
|
projectStartTime: [ |
||||||
|
{ required: true, message: '请选择项目开始时间', trigger: ['change', 'submit'] } |
||||||
|
], |
||||||
|
projectDesiredEnd: [ |
||||||
|
{ required: true, message: '请选择项目结束预期时间', trigger: ['change', '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: [ |
||||||
|
{ required: true, message: '请填写里程碑计划', trigger: ['blur', 'submit'] } |
||||||
|
], |
||||||
|
milestoneMan: [ |
||||||
|
{ required: true, message: '请选择里程碑负责人', trigger: ['change', 'submit'] } |
||||||
|
], |
||||||
|
outputMaterial: [ |
||||||
|
{ required: true, message: '请输入里程碑输出物', trigger: ['blur', 'submit'] } |
||||||
|
], |
||||||
|
milestoneNode: [ |
||||||
|
{ required: true, message: '请选择里程碑节点', trigger: ['change', 'submit'] } |
||||||
|
] |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
computed: { |
||||||
|
// 判断是否为详情页 |
||||||
|
isDetail() { |
||||||
|
return this.title === '详情'; |
||||||
|
} |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
handleClose() { |
||||||
|
this.$emit('close ', false); |
||||||
|
this.formError = ''; |
||||||
|
this.$refs.addForm?.resetFields(); |
||||||
|
}, |
||||||
|
// 插入里程碑行 |
||||||
|
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.$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 validData; |
||||||
|
}); |
||||||
|
return submitData; |
||||||
|
}, |
||||||
|
async handleSubmitForm() { |
||||||
|
this.formError = ''; |
||||||
|
this.$refs.addForm.validate((isValid, invalidFields) => { |
||||||
|
if (!isValid) { |
||||||
|
this.formError = '存在未完善的字段,请检查红色提示'; |
||||||
|
this.$nextTick(() => { |
||||||
|
const firstError = document.querySelector('.el-form-item.is-error'); |
||||||
|
if (firstError) { |
||||||
|
firstError.scrollIntoView({ behavior: 'smooth', block: 'center' }); |
||||||
|
} |
||||||
|
}); |
||||||
|
return; |
||||||
|
} |
||||||
|
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> |
||||||
|
|
||||||
|
<style scoped> |
||||||
|
/* 统一错误提示样式(和 addEditDialog 一致) */ |
||||||
|
.error-message { |
||||||
|
font-size: 14px; |
||||||
|
line-height: 1.5; |
||||||
|
} |
||||||
|
|
||||||
|
:deep(.el-form-item__error) { |
||||||
|
font-size: 12px; |
||||||
|
white-space: nowrap; |
||||||
|
z-index: 10; |
||||||
|
background: #fff; |
||||||
|
padding: 2px 4px; |
||||||
|
border: 1px solid #f56c6c; |
||||||
|
border-radius: 4px; |
||||||
|
} |
||||||
|
|
||||||
|
:deep(.el-table .el-form-item) { |
||||||
|
margin-bottom: 0; |
||||||
|
} |
||||||
|
</style> |
||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue