2025-07-25 17:00:14 +08:00

529 lines
17 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div>
<div class="app-container">
<div div style="font-size: 25px; text-align: left; position: relative">
<el-button v-if="view" type="primary" @click="saveData('false')">
{{ "保存" }}
</el-button>
<el-button v-if="view" type="primary" @click="saveData('true')">
{{ "提交" }}
</el-button>
<!-- 附件上传按钮 -->
<el-button type="primary" @click="openUploadDialog">上传附件</el-button>
</div>
</div>
<el-divider></el-divider>
<el-form ref="ContractSalaryForm" :rules="rules" :model="ruleFrom" :label-position="labelPosition" label-width="auto" style="width: 100%" :disabled="!view">
<!-- 基础信息 -->
<div class="form-dataForm">
<el-row>基本信息</el-row>
</div>
<el-row>
<el-col :span="8">
<el-form-item label="报价单号" prop="FBILLNO">
<el-input v-model="ruleFrom.FBILLNO" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="询价名称" prop="FProjectName">
<el-input v-model="ruleFrom.FProjectName" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="询价单号" prop="FSrcBillNo">
<el-input v-model="ruleFrom.FSrcBillNo" readonly />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="供应商编码" prop="FSupplierId">
<el-input maxlength="64" v-model="ruleFrom.FSupplierId" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="供应商名称" prop="FSupplierName">
<el-input maxlength="64" v-model="ruleFrom.FSupplierName" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="临时供应商" prop="FTempSupply">
<el-input maxlength="64" v-model="ruleFrom.FTempSupply" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开标日期" prop="FOpenDate">
<el-date-picker style="width: 100%" v-model="ruleFrom.FOpenDate" type="date" format="yyyy年MM月dd日 HH时mm分ss秒" value-format="yyyy-MM-dd HH:mm:ss" readonly> </el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="报价状态" prop="FPriceStatus">
<el-input v-model="ruleFrom.FPriceStatus" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="报价日期" prop="FQuoteDate">
<el-date-picker style="width: 100%" v-model="ruleFrom.FQuoteDate" type="date" format="yyyy年MM月dd日 HH时mm分ss秒" value-format="yyyy-MM-dd HH:mm:ss" readonly>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="报价截至日期" prop="FExpiryDate">
<el-date-picker style="width: 100%" v-model="ruleFrom.FExpiryDate" type="date" format="yyyy年MM月dd日 HH时mm分ss秒" value-format="yyyy-MM-dd HH:mm:ss" readonly>
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="联系人" prop="FContact">
<el-input v-model="ruleFrom.FContact" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="电话" prop="FPhone">
<el-input v-model="ruleFrom.FPhone" placeholder="请输入电话" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮箱" prop="FMail">
<el-input v-model="ruleFrom.FMail" maxlength="64" placeholder="请输入邮箱" readonly />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="币别" prop="FCurrId">
<el-input v-model="ruleFrom.FCurrId" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="含税" prop="FIsIncludedTax" style="text-align: left">
<el-switch v-model="ruleFrom.FIsIncludedTax" :active-value="'true'" :inactive-value="'false'" active-color="#13ce66" inactive-color="#ff4949" :disabled="true"> </el-switch>
</el-form-item>
</el-col>
</el-row>
<!-- 其他信息 -->
<el-collapse v-model="activeNames">
<el-collapse-item title="其他信息" class="form-title" name="1">
<div class="form-content" v-if="activeNames == '1'">
<el-divider content-position="left"></el-divider>
<el-row>
<el-col :span="8">
<el-form-item label="采购组织" prop="FPurOrgId">
<el-input v-model="ruleFrom.FPurOrgId" readonly />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="询价日期" prop="FDate">
<el-date-picker type="date" format="yyyy年MM月dd日 HH时mm分ss秒" value-format="yyyy-MM-dd HH:mm:ss" v-model="ruleFrom.FDate" style="width: 100%" readonly />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="询价员" prop="FBuyer">
<el-input v-model="ruleFrom.FBuyer" readonly />
</el-form-item>
</el-col>
</el-row>
</div>
</el-collapse-item>
</el-collapse>
</el-form>
<el-tabs type="border-card" style="margin-top: 50px">
<el-tab-pane label="明细信息">
<div>
<el-table :key="tableKey" :data="list" border fit highlight-current-row show-summary max-height="500px" style="width: 100%">
<el-table-column prop="FSEQ" label="序号" align="center" width="50" fixed="left"></el-table-column>
<el-table-column prop="FMaterialId" label="物料代码" min-width="150" fixed="left" align="center"> </el-table-column>
<el-table-column prop="FMaterialName" label="物料名称" min-width="150" align="center"> </el-table-column>
<el-table-column prop="FTempMaterial" label="临时物料名称" min-width="150" align="center"> </el-table-column>
<el-table-column prop="FMaterialModel" label="规格型号" min-width="150" align="center"> </el-table-column>
<el-table-column prop="FUnitID" label="单位" min-width="150" align="center"> </el-table-column>
<el-table-column prop="FQty" label="询价数量" min-width="100" align="center"> </el-table-column>
<el-table-column prop="FPrice" label="不含税单价" min-width="100" align="center">
<template slot-scope="scop">
<el-input type="number" v-model="scop.row.FPrice" v-show="priceInput" @input="updatePrice(scop.row)"></el-input>
<span v-show="!priceInput">{{ scop.row.FPrice }}</span>
</template>
</el-table-column>
<el-table-column prop="FTaxRate" label="税率%" min-width="100" align="center">
<template slot-scope="scop">
<el-input type="number" v-model="scop.row.FTaxRate" v-show="priceInput" @input="updatePrice(scop.row)"></el-input>
<span v-show="!priceInput">{{ scop.row.FTaxRate }}</span>
</template>
</el-table-column>
<el-table-column prop="FTaxPrice" label="含税单价" min-width="110" align="center"> </el-table-column>
<el-table-column prop="FNote" label="备注" align="center" width="240"> </el-table-column>
<el-table-column prop="FPayConditionId" label="付款方式" align="center" width="240"> </el-table-column>
</el-table>
<!-- 附件上传弹窗 -->
<el-dialog title="附件上传" :visible.sync="uploadDialogVisible" width="50%" :before-close="handleClose">
<div>
<!-- 文件上传组件 -->
<el-upload class="upload-demo" action="uploadUrl" :auto-upload="false" :on-change="handleChange" multiple :file-list="fileList" :before-upload="handleBeforeUpload">
<el-button size="small" type="primary">选取文件上传到服务器</el-button>
</el-upload>
<!-- 文件列表展示 -->
<el-table :data="dataList" style="width: 100%; margin-top: 20px">
<el-table-column prop="FID" label="FID"> </el-table-column>
<el-table-column prop="FCREATETIME" label="文件名"> </el-table-column>
<el-table-column prop="FATTACHMENTNAME" label="上传时间"> </el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button type="text" @click="showConfirmDialog(scope.row.FID)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="uploadDialogVisible = false">取消</el-button>
<el-button type="primary" @click="uploadDialogVisible = false">确定</el-button>
</span>
</el-dialog>
</div>
</el-tab-pane>
</el-tabs>
<el-dialog title="确认删除" :visible.sync="confirmDialogVisible" width="30%">
<span>确定要删除这个文件吗</span>
<span slot="footer" class="dialog-footer">
<el-button @click="confirmDialogVisible = false"> </el-button>
<el-button type="primary" @click="confirmDelete"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { queryData, queryDataItem, saveData, uploadUrl } from "@/api/login";
import axios from "axios";
// import { response } from "express";
export default {
name: "master",
components: {},
data() {
return {
//删除弹窗
confirmDialogVisible: false,
currentIndex: null,
uploadDialogVisible: false, // 控制弹窗显示
// 文件上传部分
uploadUrl: "/api/admin/upload",
file: null,
fileList: [],
dataList: [],
labelPosition: "right",
list: [],
data: {
FormId: "kafe2f22a0498441f9109c31cf5586da5",
FieldKeys: "",
FilterString: "FBILLNO like'%BJ23060004'",
OrderString: "",
TopRowCount: "0",
StartRow: "0",
Limit: 100,
},
tableKey: 0,
FBILLNO: undefined,
username: undefined,
password: undefined,
activeNames: "1",
priceInput: false,
view: true,
multipleSelection: [],
listQuery: {
currentPage: 1,
pageSize: 10,
id: undefined,
type: undefined,
},
ruleFrom: {},
saveFrom: {
Creator: "String",
NeedUpDateFields: [],
IsAutoSubmitAndAudit: true,
Model: {
FID: "",
FIsConfirm: true,
FConfirmDate: "",
FQuoteDate: "",
FEntity: [],
},
},
rules: {
FSupplierId: [{ required: true, message: "请输入供应商编码", trigger: ["blur", "change"] }],
FExpiryDate: [{ required: true, message: "请选择报价截至日期", trigger: ["blur", "change"] }],
FOpenDate: [{ required: true, message: "请选择开标日期", trigger: ["blur", "change"] }],
},
};
},
created() {
if (this.$route.query.FBILLNO !== undefined && this.$route.query.username !== undefined && this.$route.query.password !== undefined) {
this.FBILLNO = this.$route.query.FBILLNO;
this.username = this.$route.query.username;
this.password = this.$route.query.password;
this.ruleFromData();
this.listData();
} else {
this.handleWarning("请重新登录");
if (this.$route.query.FBILLNO !== undefined) {
this.$router.push({
path: "/?FBILLNO=" + this.$route.query.FBILLNO,
});
} else {
this.handleWarning("请重新打开链接");
this.$router.push({
path: "/",
});
}
}
},
methods: {
updatePrice(row) {
row.FTaxPrice = (Number(row.FPrice || 0) * (1 + Number(row.FTaxRate || 0) / 100)).toFixed(2);
},
saveData(IsAutoAdjustField) {
let query = {
FID: this.ruleFrom.FID,
IsAutoAdjustField: IsAutoAdjustField,
FEntity: [],
};
if (IsAutoAdjustField === "true") {
query.FQuoteDate = this.ruleFrom.FQuoteDate;
}
if (this.list && this.list.length > 0) {
this.list.forEach((item) => {
query.FEntity.push({
FEntryID: item.FEntryID,
FQty: item.FQty,
FPrice: item.FPrice,
FTaxRate: item.FTaxRate,
FTaxPrice: item.FTaxPrice,
});
});
}
saveData(query).then((res) => {
if (res.data.Result.ResponseStatus.IsSuccess) {
this.handleSuccess(IsAutoAdjustField === "true" ? "提交成功" : "保存成功");
this.listData();
this.ruleFromData();
} else {
this.handleWarning(IsAutoAdjustField === "true" ? "提交失败" : "保存失败");
}
});
},
ruleFromData() {
let query = {
FBILLNO: this.FBILLNO,
username: this.username,
password: this.password,
};
queryData(query).then((res) => {
if (!res.data) {
this.handleWarning("获取数据失败5秒后跳转至重新登录");
setTimeout(() => {
this.$router.push({
path: "/?FBILLNO=" + this.$route.query.FBILLNO,
});
}, 5000);
} else {
this.ruleFrom = res.data[0];
this.view = res.data[0].Status;
this.priceInput = res.data[0].Status;
}
});
},
listData() {
let query = {
FBILLNO: this.FBILLNO,
username: this.username,
password: this.password,
};
queryDataItem(query).then((res) => {
this.list = res.data;
});
},
handleWarning(response) {
this.$message({
message: response.message || response,
type: "warning",
duration: 2000,
});
},
handleSuccess(response) {
this.$message({
message: response.message || response,
type: "success",
duration: 2000,
});
},
handleChange(file, fileList) {
const isLt1M = file.size / 1024 / 1024 < 20; // 检查文件大小是否小于 1MB
if (!isLt1M) {
this.$message.error("上传文件大小不能超过 20MB");
return isLt1M;
}
console.log(file, fileList);
// 创建 FormData 对象
const formData = new FormData();
formData.append("file", file.raw); // 添加文件
formData.append("FBILLNO1", this.FBILLNO); // 添加额外参数
// 使用 axios 发送请求
axios
.post(this.uploadUrl, formData, {
headers: {
"Content-Type": "multipart/form-data", // 设置请求头
},
})
.then((response) => {
if (response.data && response.data.status === 1) {
this.$message.success("文件上传成功");
this.fetchFiles();
} else {
const errorMessage = response.data && response.data.message ? response.data.message : "未知错误";
this.$message.error(`文件上传失败: ${errorMessage}`);
}
})
.catch((error) => {
this.$message.error(`文件上传失败: ${error.message}`);
});
},
//限制文件不能大于1M
handleBeforeUpload(file) {
const isLt1M = file.size / 1024 / 1024 < 20; // 检查文件大小是否小于 1MB
// if (!isLt1M) {
// this.$message.error('上传文件大小不能超过 1MB');
// }
return isLt1M; // 如果文件大小超过 1MB返回 false 阻止上传
},
//删除操作
showConfirmDialog(fid) {
this.currentIndex = fid;
this.confirmDialogVisible = true;
},
confirmDelete() {
let query = {
FBILLNO: this.FBILLNO,
username: this.username,
password: this.password,
FID: this.currentIndex,
};
if (this.currentIndex !== null) {
console.log(this.currentIndex);
axios
.post("/api/admin/delteFile", query)
.then((response) => {
if (response.data && response.data.status === 1) {
this.$message.success("删除文件成功");
this.fetchFiles();
} else {
const errorMessage = response.data && response.data.message ? response.data.message : "未知错误";
this.$message.error(`删除文件失败: ${errorMessage}`);
}
})
.catch((error) => {
this.$message.error(`文件删除失败: ${error.message}`);
});
}
this.confirmDialogVisible = false;
},
//打开窗体
openUploadDialog() {
this.fetchFiles();
this.uploadDialogVisible = true;
},
//向窗体中填充数据
fetchFiles() {
let query = {
FBILLNO: this.FBILLNO,
username: this.username,
password: this.password,
};
// 模拟从服务器获取数据
axios
.post("/api/admin/CreateFile", query)
.then((response) => {
// 假设响应的数据格式与之前相同,需要映射为 fileList 的格式
// this.fileList = response.data.map(item => ({
// FID: item.id,
// name: item.fileName,
// CreateDate: item.uploadTime
// }));
this.dataList = response.data.data;
// console.log(this.dataList);
// debugger
})
.catch((error) => {
console.error("获取数据失败,联系开发人员", error);
});
},
},
};
</script>
<style scoped>
/* 设置表单的居中 */
.dataForm-style {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
/* 设置基础信息标题的样式 */
.form-dataForm {
width: 100%;
height: 47px;
text-align: left;
line-height: 47px;
font-size: 17px;
font-weight: 600;
margin: 15px 0;
border-bottom: 1px solid #e6ebf5;
}
/* 去掉折叠上边框线 */
::v-deep .el-collapse {
border-top: 0;
}
/* 修改折叠标题样式 */
::v-deep .form-title .el-collapse-item__header {
font-size: 17px;
font-weight: 600;
}
/* 修改折叠标题样式 */
::v-deep .form-title .el-collapse-item__content {
border-bottom: 0;
}
/* 修改折叠标题箭头样式 */
::v-deep .form-title .el-collapse-item__header .el-collapse-item__arrow {
margin: 0 0 0 5px;
}
::v-deep .el-divider--horizontal {
margin: 10px 0;
}
/* 去掉数字输入框上下加减按钮 */
::v-deep input::-webkit-outer-spin-button,
::v-deep input::-webkit-inner-spin-button {
-webkit-appearance: none;
}
</style>