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.
 
 
 
 
 

344 lines
8.8 KiB

<template>
<div class="exp-project-detail">
<!-- 顶部操作按钮 -->
<div class="toolbar">
<el-button
v-if="!editing && (status==='草稿' || status==='已驳回')"
@click="handleEdit"
type="primary"
size="small">
编辑
</el-button>
<el-button
v-if="editing"
@click="handleSave"
type="primary"
size="small"
:loading="saving">
保存
</el-button>
<el-button
v-if="editing"
@click="handleCancel"
size="small">
取消
</el-button>
</div>
<!-- 项目详情表单 - label在上,input在下 -->
<el-form
:model="formData"
ref="detailForm"
label-position="top"
v-loading="loading">
<el-row :gutter="20">
<!-- 左侧列 -->
<el-col :span="10">
<el-form-item label="试验名称(Name of the experiment)">
<el-input
v-model="formData.title"
:readonly="!editing"
placeholder="请输入试验名称">
</el-input>
</el-form-item>
<el-form-item label="试验目的(Purpose of the experiment)">
<el-input
v-model="formData.purpose"
:readonly="!editing"
placeholder="请输入试验目的">
</el-input>
</el-form-item>
<el-form-item label="验证方法及判断标准(Experiment Justification)">
<el-input
v-model="formData.justification"
:readonly="!editing"
placeholder="请输入验证方法及判断标准">
</el-input>
</el-form-item>
<el-form-item label="试验产品型号(Products'type)">
<el-input
v-model="formData.productType"
:readonly="!editing"
placeholder="请输入试验产品型号">
</el-input>
</el-form-item>
<el-form-item label="期望完成日期(Desired finish date)">
<el-date-picker
v-model="formData.expectedFinishDate"
:disabled="!editing"
type="date"
format="yyyy/MM/dd"
value-format="yyyy-MM-dd"
placeholder="选择日期"
style="width: 100%">
</el-date-picker>
</el-form-item>
</el-col>
<!-- 右侧大文本框 -->
<el-col :span="14">
<el-form-item label="试验申请数量(Quantity requirement)">
<el-input
v-model="formData.quantityReq"
type="textarea"
:readonly="!editing"
:rows="2"
placeholder="请输入试验申请数量">
</el-input>
</el-form-item>
<el-form-item style="margin-top: 35px" label="工艺、取样、测试要求(PartIII Process,Sampling,and Test Requirement)">
<el-input
v-model="formData.processRequirement"
type="textarea"
:readonly="!editing"
:rows="9"
placeholder="请输入工艺、取样、测试要求">
</el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 底部:试验负责人信息 -->
<el-row :gutter="20">
<el-col :span="10">
<el-form-item label="试验负责人(Project leader)">
<el-input
v-model="formData.projectLeader"
:readonly="!editing"
placeholder="请输入试验负责人">
</el-input>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item label="联系方式(Contact method)">
<el-input
v-model="formData.contactMethod"
:readonly="!editing"
placeholder="请输入联系方式">
</el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script>
import { getExpApplyDetail, saveExpApply } from '@/api/erf/erf'
export default {
name: 'ExpProjectDetail',
props: {
applyNo: {
type: String,
required: true
},
status: {
type: String,
required: true
},
height: {
type: String,
default: '35vh'
}
},
data() {
return {
formData: {
applyNo: '',
buNo: '',
experimentType: '',
projectNo: '',
title: '',
purpose: '',
justification: '',
productType: '',
quantityReq: '',
expectedFinishDate: '',
projectLeader: '',
contactMethod: '',
processRequirement: '',
status: '',
creatorUserId: '',
creatorName: '',
createTime: '',
updateTime: '',
plannerUserId: '',
plannerName: '',
workOrderNo: '',
scheduledDate: ''
},
originalData: {}, // 保存原始数据,用于取消时恢复
loading: false,
editing: false,
saving: false
}
},
watch: {
applyNo: {
immediate: true,
handler(val) {
if (val) {
this.editing = false
this.loadDetail()
}
}
}
},
methods: {
/**
* 加载项目详情
*/
loadDetail() {
this.loading = true
getExpApplyDetail({ applyNo: this.applyNo }).then(({data}) => {
this.loading = false
if (data && data.code === 0) {
this.formData = { ...this.formData, ...data.data }
this.originalData = JSON.parse(JSON.stringify(this.formData))
} else {
this.$message.error(data.msg || '加载详情失败')
}
}).catch(error => {
this.loading = false
this.$message.error('加载详情异常')
})
},
/**
* 进入编辑模式
*/
handleEdit() {
this.editing = true
this.originalData = JSON.parse(JSON.stringify(this.formData))
},
/**
* 保存修改
*/
handleSave() {
// 数据验证
if (!this.formData.title) {
this.$message.warning('请输入试验名称')
return
}
if (!this.formData.expectedFinishDate) {
this.$message.warning('请选择期望完成日期')
return
}
this.saving = true
// 准备保存数据
const saveData = {
applyNo: this.formData.applyNo,
buNo: this.formData.buNo,
experimentType: this.formData.experimentType,
projectNo: this.formData.projectNo,
title: this.formData.title,
purpose: this.formData.purpose,
justification: this.formData.justification,
productType: this.formData.productType,
quantityReq: this.formData.quantityReq,
expectedFinishDate: this.formData.expectedFinishDate,
projectLeader: this.formData.projectLeader,
contactMethod: this.formData.contactMethod,
processRequirement: this.formData.processRequirement
}
saveExpApply(saveData).then(({data}) => {
this.saving = false
if (data && data.code === 0) {
this.$message.success('保存成功')
this.editing = false
this.loadDetail()
// 通知父组件刷新列表
this.$emit('refresh')
} else {
this.$message.error(data.msg || '保存失败')
}
}).catch(error => {
this.saving = false
this.$message.error('保存异常')
})
},
/**
* 取消编辑
*/
handleCancel() {
this.$confirm('取消编辑将放弃所有修改,确定取消?', '操作提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.formData = JSON.parse(JSON.stringify(this.originalData))
this.editing = false
}).catch(() => {
// 用户点击了取消
})
}
}
}
</script>
<style scoped>
.exp-project-detail {
height: 100%;
overflow-y: auto;
overflow-x: hidden;
background-color: #fff;
}
.toolbar {
margin-bottom: 5px;
padding-bottom: 5px;
border-bottom: 1px solid #EBEEF5;
text-align: left;
}
.el-form-item {
margin-bottom: 15px;
}
/* 只读状态的input样式 */
.el-input >>> input[readonly] {
background-color: #F5F7FA;
border-color: #DCDFE6;
color: #606266;
cursor: default;
}
.el-input >>> textarea[readonly] {
background-color: #F5F7FA;
border-color: #DCDFE6;
color: #606266;
cursor: default;
}
/* 禁用状态的日期选择器样式 */
.el-date-editor.is-disabled >>> .el-input__inner {
background-color: #F5F7FA;
border-color: #DCDFE6;
color: #606266;
cursor: default;
}
/* 调整label样式 */
.el-form-item >>> .el-form-item__label {
font-size: 13px;
color: #606266;
font-weight: normal;
padding-bottom: 5px;
}
</style>