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.

241 lines
6.4 KiB

1 month ago
<template>
<div class="h-full">
<div class="modal-header">
<h2 class="modal-title">编辑合同产品信息</h2>
<div class="modal-actions">
<el-button type="primary" @click="handleSubmit">保存</el-button>
<el-button @click="handleClose">关闭</el-button>
</div>
</div>
<div class="grid grid-cols-2 gap-2 h-full">
<!-- 左侧PDF显示区域 -->
<div class="col-span-1 h-full overflow-auto">
<embed :src="pdfUrl" type="application/pdf" width="100%" height="100%" class="pdf-embed" />
</div>
<!-- 右侧编辑表单区域 -->
<div class="h-full overflow-auto">
<el-form
ref="formRef"
:model="formData"
:rules="rules"
label-width="100px"
class="edit-form"
>
<el-form-item label="品牌" prop="brand">
<el-input v-model="formData.brand" placeholder="请输入品牌" />
</el-form-item>
<el-form-item label="型号(版本号)" prop="versionStr">
<el-input v-model="formData.versionStr" placeholder="请输入型号" />
</el-form-item>
<el-form-item label="CPU型号" prop="cpuModel">
<el-input v-model="formData.cpuModel" placeholder="请输入CPU型号" />
</el-form-item>
<el-form-item label="类型" prop="type">
<el-input v-model="formData.type" placeholder="请输入类型" />
</el-form-item>
<el-form-item label="单价" prop="unitPrice">
<el-input-number
v-model="formData.unitPrice"
:precision="0"
:step="1"
:min="0"
placeholder="请输入单价"
/>
</el-form-item>
<el-form-item label="数量" prop="quantity">
<el-input-number
v-model="formData.quantity"
:min="0"
placeholder="请输入数量"
/>
</el-form-item>
<el-form-item label="总价" prop="totalPrice">
<el-input-number
v-model="formData.totalPrice"
:precision="0"
:step="1"
:min="0"
placeholder="总价"
disabled
/>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted, nextTick, watch } from 'vue';
import { ElMessage } from 'element-plus';
import { updateContractualProductInfo } from '@/api/contractReview/ContractualProductInfo';
import { getPdfFile } from '@/api/contractReview/JyjcontractualTaskBatch';
defineOptions({ name: 'ContractualProductInfoEdit' });
// 定义Props
const props = defineProps({
record: {
type: Object,
required: true,
default: () => ({})
}
});
// 定义Emits
const emit = defineEmits(['close', 'success']);
// 表单数据和校验规则
const formRef = ref();
const formData = reactive({
id: '',
taskId: '',
fileName: '',
unitName: '',
brand: '',
versionStr: '',
cpuModel: '',
type: '',
unitPrice: 0,
quantity: 0,
totalPrice: 0
});
// 校验规则
const rules = {
brand: [{ required: true, message: '请输入品牌', trigger: 'blur' }],
};
// PDF文件URL
const pdfUrl = ref<string>('');
const loading = ref(false);
// 监听单价和数量的变化,计算总价
watch(
() => [formData.unitPrice, formData.quantity],
([newUnitPrice, newQuantity]) => {
formData.totalPrice = newUnitPrice * newQuantity;
},
{ immediate: true }
);
// 初始化数据
onMounted(async () => {
if (props.record) {
// 填充表单数据
Object.keys(formData).forEach(key => {
if (props.record[key] !== undefined) {
formData[key] = props.record[key];
}
});
// 尝试加载PDF文件
try {
if (props.record.id) {
const response = await getPdfFile(props.record.taskId);
if (response instanceof Blob) {
pdfUrl.value = URL.createObjectURL(response);
// 文件加载完成后自动适应宽度
nextTick(() => {
setTimeout(() => {
// 如果需要特殊处理PDF显示可以在这里添加
}, 500);
});
} else {
console.error('获取PDF文件失败:返回的不是Blob对象');
}
}
} catch (error) {
console.error('加载PDF文件失败:', error);
}
}
});
// 提交表单
const handleSubmit = async () => {
try {
await formRef.value.validate();
loading.value = true;
// 调用API保存数据
const res = await updateContractualProductInfo(formData);
if (res.code === 200) {
ElMessage.success('保存成功');
emit('success', formData);
handleClose();
} else {
ElMessage.error(res.msg || '保存失败');
}
} catch (error) {
console.error('提交失败', error);
ElMessage.error('表单验证失败,请检查输入');
} finally {
loading.value = false;
}
};
// 关闭页面
const handleClose = () => {
emit('close');
};
</script>
<style scoped>
/* 头部样式 */
.modal-header {
overflow: hidden;
padding: 16px 24px;
background-color: #f5f7fa;
border-bottom: 1px solid #e4e7ed;
}
.modal-title {
float: left;
margin: 0;
font-size: 18px;
color: #303133;
}
.modal-actions {
float: right;
}
.modal-actions .el-button {
margin-left: 12px;
}
/* 确保embed标签占满整个容器 */
.pdf-embed {
display: block;
height: calc(100vh - 70px) !important; /* 减去头部的高度 */
border: none;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
/* 使网格容器填充整个可用空间 */
.grid {
height: calc(100vh - 70px); /* 减去头部的高度 */
overflow: hidden;
}
/* 确保两列都有适当的滚动行为 */
.col-span-1 {
height: 100%;
overflow-y: auto;
}
/* 表单样式 */
.edit-form {
padding: 20px;
}
/* 全局高度 */
.h-full {
height: 100%;
}
</style>