This commit is contained in:
2025-08-21 16:54:14 +08:00
4 changed files with 104 additions and 73 deletions

View File

@ -1,56 +1,52 @@
<template> <template>
<el-dialog v-model="dialogVisible" title="附件列表" width="45%"> <el-dialog v-model="dialogVisible" title="附件列表" width="45%">
<el-table :data="fileList" style="width: 100%"> <el-table :data="fileList" style="width: 100%">
<el-table-column prop="fileName" label="文件名" /> <el-table-column prop="fileName" label="文件名" />
<el-table-column prop="type" label="操作"> <el-table-column prop="type" label="操作">
<template #default="scope"> <template #default="scope">
<el-button link type="success" @click="viewFile(scope.row)" icon="View">查看文件</el-button> <el-button link type="success" @click="viewFile(scope.row)" icon="View">查看文件</el-button>
<el-button link type="primary" @click="downloadFile(scope.row)" icon="download">下载文件</el-button> <el-button link type="primary" @click="downloadFile(scope.row)" icon="download">下载文件</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="dialogVisible = false">
关闭
</el-button>
</div>
</template> </template>
</el-dialog> </el-table-column>
<el-dialog width="80%" v-model="viewFileVisible" title="查看文件" append-to-body> </el-table>
<iframe :src="fileUrl" frameborder="0" width="100%" height="800"></iframe> <template #footer>
<template #footer> <div class="dialog-footer">
<div class="dialog-footer"> <el-button type="primary" @click="dialogVisible = false"> 关闭 </el-button>
<el-button @click="viewFileVisible = false" type="primary">关闭</el-button> </div>
</div> </template>
</template> </el-dialog>
</el-dialog> <el-dialog width="80%" v-model="viewFileVisible" title="查看文件" append-to-body>
<iframe :src="fileUrl" frameborder="0" width="100%" height="800"></iframe>
<template #footer>
<div class="dialog-footer">
<el-button @click="viewFileVisible = false" type="primary">关闭</el-button>
</div>
</template>
</el-dialog>
</template> </template>
<script setup> <script setup>
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const dialogVisible = defineModel(); const dialogVisible = defineModel();
const props = defineProps(['fileList']) const props = defineProps(['fileList']);
const viewFileVisible = ref(false) const viewFileVisible = ref(false);
const fileUrl = ref('') const fileUrl = ref('');
const downloadFile = async (data) => { const downloadFile = async (data) => {
// 这里可以添加下载文件的逻辑 // 这里可以添加下载文件的逻辑
await proxy?.download(data.fileUrl, {}, data.fileName); await proxy?.downloadFile(data.fileUrl, data.fileName);
proxy?.$message({ // proxy?.$message({
message: '下载成功', // message: '下载成功',
type: 'success' // type: 'success'
}); // });
}; };
const viewFile = (data) => { const viewFile = (data) => {
// 这里可以添加查看文件的逻辑 // 这里可以添加查看文件的逻辑
fileUrl.value = data.fileUrl; fileUrl.value = data.fileUrl;
viewFileVisible.value = true; viewFileVisible.value = true;
}
const adjustIframe = () => {
const iframe = document.querySelector('iframe');
if (iframe) {
iframe.style.height = `${iframe.contentWindow.document.body.scrollHeight}px`;
}
}; };
</script> const adjustIframe = () => {
const iframe = document.querySelector('iframe');
if (iframe) {
iframe.style.height = `${iframe.contentWindow.document.body.scrollHeight}px`;
}
};
</script>

View File

@ -5,9 +5,9 @@
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="项目ID" prop="projectId"> <!-- <el-form-item label="项目ID" prop="projectId">
<el-input v-model="queryParams.projectId" placeholder="请输入项目ID" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.projectId" placeholder="请输入项目ID" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item> -->
<el-form-item label="合同编号" prop="contractCode"> <el-form-item label="合同编号" prop="contractCode">
<el-input v-model="queryParams.contractCode" placeholder="请输入合同编号" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.contractCode" placeholder="请输入合同编号" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
@ -18,9 +18,9 @@
<el-form-item label="合同金额" prop="amount"> <el-form-item label="合同金额" prop="amount">
<el-input v-model="queryParams.amount" placeholder="请输入合同金额" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.amount" placeholder="请输入合同金额" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="招标Id" prop="tenderId"> <!-- <el-form-item label="招标Id" prop="tenderId">
<el-input v-model="queryParams.tenderId" placeholder="请输入招标Id" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.tenderId" placeholder="请输入招标Id" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item> -->
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
@ -57,7 +57,7 @@
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="主键ID" align="center" prop="id" v-if="true" /> --> <!-- <el-table-column label="主键ID" align="center" prop="id" v-if="true" /> -->
<el-table-column type="index" width="50" label="序号" /> <el-table-column type="index" width="50" label="序号" />
<el-table-column label="项目ID" align="center" prop="projectId" /> <!-- <el-table-column label="项目ID" align="center" prop="projectId" /> -->
<el-table-column label="合同编号" align="center" prop="contractCode" /> <el-table-column label="合同编号" align="center" prop="contractCode" />
<el-table-column label="合同类型" align="center" prop="contractType" /> <el-table-column label="合同类型" align="center" prop="contractType" />
<el-table-column label="合同类型" align="center" prop="contractType"> <el-table-column label="合同类型" align="center" prop="contractType">
@ -68,7 +68,7 @@
<el-table-column label="供应商" align="center" prop="contractSupplier" /> <el-table-column label="供应商" align="center" prop="contractSupplier" />
<el-table-column label="分包内容" align="center" prop="contractedContent" /> <el-table-column label="分包内容" align="center" prop="contractedContent" />
<el-table-column label="合同金额" align="center" prop="amount" /> <el-table-column label="合同金额" align="center" prop="amount" />
<el-table-column label="招标Id" align="center" prop="tenderId" /> <!-- <el-table-column label="招标Id" align="center" prop="tenderId" /> -->
<el-table-column label="备注" align="center" prop="remark" /> <el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
@ -93,9 +93,9 @@
<!-- 添加或修改支出合同对话框 --> <!-- 添加或修改支出合同对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="expensesContractFormRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="expensesContractFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="项目ID" prop="projectId"> <!-- <el-form-item label="项目ID" prop="projectId">
<el-input v-model="form.projectId" placeholder="请输入项目ID" /> <el-input v-model="form.projectId" placeholder="请输入项目ID" />
</el-form-item> </el-form-item> -->
<el-form-item label="合同编号" prop="contractCode"> <el-form-item label="合同编号" prop="contractCode">
<el-input v-model="form.contractCode" placeholder="请输入合同编号" /> <el-input v-model="form.contractCode" placeholder="请输入合同编号" />
</el-form-item> </el-form-item>
@ -131,6 +131,7 @@
import { listExpensesContract, getExpensesContract, delExpensesContract, addExpensesContract, updateExpensesContract, getFileList } from '@/api/ctr/expensesContract'; import { listExpensesContract, getExpensesContract, delExpensesContract, addExpensesContract, updateExpensesContract, getFileList } from '@/api/ctr/expensesContract';
import { ExpensesContractVO, ExpensesContractQuery, ExpensesContractForm } from '@/api/ctr/expensesContract/types'; import { ExpensesContractVO, ExpensesContractQuery, ExpensesContractForm } from '@/api/ctr/expensesContract/types';
import FileList from '@/components/FileList/index.vue'; import FileList from '@/components/FileList/index.vue';
import useUserStore from '@/store/modules/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { expenses_contract_type, income_contract_type } = toRefs( const { expenses_contract_type, income_contract_type } = toRefs(
@ -146,9 +147,10 @@ const multiple = ref(true);
const total = ref(0); const total = ref(0);
const fileListVisible = ref(false); // 控制附件列表对话框的显示 const fileListVisible = ref(false); // 控制附件列表对话框的显示
const fileList = ref<Array<any>>([]); // 文件列表 const fileList = ref<Array<any>>([]); // 文件列表
const userStore = useUserStore();
const queryFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>();
const expensesContractFormRef = ref<ElFormInstance>(); const expensesContractFormRef = ref<ElFormInstance>();
const currentProject = computed(() => userStore.selectedProject);
const dialog = reactive<DialogOption>({ const dialog = reactive<DialogOption>({
visible: false, visible: false,
@ -171,7 +173,7 @@ const data = reactive<PageData<ExpensesContractForm, ExpensesContractQuery>>({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
projectId: undefined, projectId: currentProject.value?.id,
contractCode: undefined, contractCode: undefined,
contractType: undefined, contractType: undefined,
contractSupplier: undefined, contractSupplier: undefined,
@ -292,7 +294,21 @@ const handleShowFileList = async (row: ExpensesContractVO) => {
}); });
} }
onMounted(() => { onMounted(() => {
getList(); getList();
}); });
// 监听项目id刷新数据
const listeningProject = watch(
() => currentProject.value?.id,
(nid, oid) => {
queryParams.value.projectId = nid;
form.value.projectId = nid;
getList();
}
);
onUnmounted(() => {
listeningProject();
});
</script> </script>

View File

@ -5,9 +5,9 @@
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="项目ID" prop="projectId"> <!-- <el-form-item label="项目ID" prop="projectId">
<el-input v-model="queryParams.projectId" placeholder="请输入项目ID" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.projectId" placeholder="请输入项目ID" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item> -->
<el-form-item label="合同编号" prop="contractCode"> <el-form-item label="合同编号" prop="contractCode">
<el-input v-model="queryParams.contractCode" placeholder="请输入合同编号" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.contractCode" placeholder="请输入合同编号" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
@ -54,7 +54,7 @@
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="主键ID" align="center" prop="id" v-if="true" /> --> <!-- <el-table-column label="主键ID" align="center" prop="id" v-if="true" /> -->
<el-table-column type="index" width="50" label="序号" /> <el-table-column type="index" width="50" label="序号" />
<el-table-column label="项目ID" align="center" prop="projectId" /> <!-- <el-table-column label="项目ID" align="center" prop="projectId" /> -->
<el-table-column label="合同编号" align="center" prop="contractCode" /> <el-table-column label="合同编号" align="center" prop="contractCode" />
<el-table-column label="合同类型" align="center" prop="contractType"> <el-table-column label="合同类型" align="center" prop="contractType">
<template #default="scope"> <template #default="scope">
@ -122,7 +122,10 @@
import { listIncomeContract, getIncomeContract, delIncomeContract, addIncomeContract, updateIncomeContract, getFileList } from '@/api/ctr/incomeContract'; import { listIncomeContract, getIncomeContract, delIncomeContract, addIncomeContract, updateIncomeContract, getFileList } from '@/api/ctr/incomeContract';
import { IncomeContractVO, IncomeContractQuery, IncomeContractForm } from '@/api/ctr/incomeContract/types'; import { IncomeContractVO, IncomeContractQuery, IncomeContractForm } from '@/api/ctr/incomeContract/types';
import FileList from '@/components/FileList/index.vue'; import FileList from '@/components/FileList/index.vue';
import useUserStore from '@/store/modules/user';
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const userStore = useUserStore();
const currentProject = computed(() => userStore.selectedProject);
const { expenses_contract_type, income_contract_type } = toRefs( const { expenses_contract_type, income_contract_type } = toRefs(
proxy?.useDict('income_contract_type', 'expenses_contract_type') proxy?.useDict('income_contract_type', 'expenses_contract_type')
@ -159,7 +162,7 @@ const data = reactive<PageData<IncomeContractForm, IncomeContractQuery>>({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
projectId: undefined, projectId: currentProject.value?.id,
contractCode: undefined, contractCode: undefined,
contractType: undefined, contractType: undefined,
contractOwner: undefined, contractOwner: undefined,
@ -284,4 +287,17 @@ const handleShowFileList = async (row: IncomeContractVO) => {
onMounted(() => { onMounted(() => {
getList(); getList();
}); });
// 监听项目id刷新数据
const listeningProject = watch(
() => currentProject.value?.id,
(nid, oid) => {
queryParams.value.projectId = nid;
form.value.projectId = nid;
getList();
}
);
onUnmounted(() => {
listeningProject();
});
</script> </script>

View File

@ -66,19 +66,21 @@
</el-form-item> </el-form-item>
<el-form-item label="招标计划" prop="tenderId"> <el-form-item label="招标计划" prop="tenderId">
<!-- <el-input v-model="form.tenderId" placeholder="请输入招标Id" /> --> <!-- <el-input v-model="form.tenderId" placeholder="请输入招标Id" /> -->
<el-input v-model="form.name" placeholder="请选择招标计划" /> <el-input v-model="form.name" placeholder="请选择招标计划" disabled />
<el-button type="primary" @click="handleChoose">选择招标</el-button> <el-button type="primary" @click="handleChoose">选择招标</el-button>
</el-form-item> </el-form-item>
<el-form-item label="供应商" prop="contractSupplier"> <el-form-item label="供应商" prop="contractSupplier">
<el-input v-model="form.contractSupplier" placeholder="请输入供应商" /> <el-input v-model="form.contractSupplier" placeholder="请输入供应商" disabled />
</el-form-item> </el-form-item>
<el-form-item label="分包内容"> <el-form-item label="分包内容">
<editor v-model="form.contractedContent" :min-height="192" /> <!-- <editor v-model="form.contractedContent" :min-height="192" disabled /> -->
<el-input v-model="form.contractedContent" style="width: 300px"
:autosize="{ minRows: 2, maxRows: 4 }" type="textarea" disabled />
</el-form-item> </el-form-item>
<el-form-item label="合同金额" prop="amount"> <el-form-item label="合同金额" prop="amount">
<el-input <el-input
oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')" oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')"
v-model="form.amount" placeholder="请输入合同金额" /> v-model="form.amount" placeholder="请输入合同金额" disabled />
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
@ -97,26 +99,26 @@
</template> </template>
<template v-else-if="active == 2"> <template v-else-if="active == 2">
<h1>{{ contract_type == "income" ? "收入合同" : "支出合同" }}</h1> <h1>{{ contract_type == "income" ? "收入合同" : "支出合同" }}</h1>
<el-form :model="form" :rules="payMentRules" label-width="120" ref="payMentRef"> <el-form :model="form" :rules="payMentRules" label-width="150" ref="payMentRef">
<el-form-item label="支付方式" placeholder="请选择支付方式" prop="payType"> <el-form-item label="支付方式" placeholder="请选择支付方式" prop="payType">
<el-select v-model="form.payType"> <el-select v-model="form.payType">
<el-option :value="1" label="月结算">月结算</el-option> <el-option :value="1" label="月结算">月结算</el-option>
<el-option :value="2" label="形象节点">形象节点</el-option> <el-option :value="2" label="形象节点">形象节点</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="预付款比例" prop="advancePayRatio"> <el-form-item label="预付款比例%" prop="advancePayRatio">
<el-input v-model="form.advancePayRatio" placeholder="请输入预付款比例" <el-input v-model="form.advancePayRatio" placeholder="请输入预付款比例"
oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')" /> oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')" />
</el-form-item> </el-form-item>
<el-form-item label="尾款比例" prop="balancePayRatio"> <el-form-item label="尾款比例%" prop="balancePayRatio">
<el-input v-model="form.balancePayRatio" placeholder="请输入尾款比例" <el-input v-model="form.balancePayRatio" placeholder="请输入尾款比例"
oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')" /> oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')" />
</el-form-item> </el-form-item>
<el-form-item label="质保金比例" prop="assuranceDepositRatio;"> <el-form-item label="质保金比例%" prop="assuranceDepositRatio;">
<el-input v-model="form.assuranceDepositRatio" placeholder="请输入质保金比例" <el-input v-model="form.assuranceDepositRatio" placeholder="请输入质保金比例"
oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')" /> oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')" />
</el-form-item> </el-form-item>
<el-form-item label="付款比例" prop="payRatio"> <el-form-item label="付款比例%" prop="payRatio">
<el-input v-model="form.payRatio" placeholder="请输入付款比例" <el-input v-model="form.payRatio" placeholder="请输入付款比例"
oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')" /> oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')" />
</el-form-item> </el-form-item>
@ -165,6 +167,7 @@ const tempFileList = ref([])
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const userStore = useUserStore(); const userStore = useUserStore();
const planList = ref([]); const planList = ref([]);
const dialogVisible = ref(false);
const { expenses_contract_type, income_contract_type } = toRefs( const { expenses_contract_type, income_contract_type } = toRefs(
proxy?.useDict('income_contract_type', 'expenses_contract_type') proxy?.useDict('income_contract_type', 'expenses_contract_type')
@ -173,7 +176,6 @@ const fileRef = ref(null);
const incomeContractFormRef = ref(null); const incomeContractFormRef = ref(null);
const expensesContractFormRef = ref(null); const expensesContractFormRef = ref(null);
const payMentRef = ref(null); const payMentRef = ref(null);
const dialogVisible = ref(false);
const incomeContractFormRules = { const incomeContractFormRules = {
contractCode: [{ required: true, message: '请输入合同编号', trigger: 'blur' }], contractCode: [{ required: true, message: '请输入合同编号', trigger: 'blur' }],
contractType: [{ required: true, message: '请选择合同类型', trigger: 'change' }], contractType: [{ required: true, message: '请选择合同类型', trigger: 'change' }],
@ -184,9 +186,11 @@ const incomeContractFormRules = {
const expensesContractFormRules = { const expensesContractFormRules = {
contractCode: [{ required: true, message: '请输入合同编号', trigger: 'blur' }], contractCode: [{ required: true, message: '请输入合同编号', trigger: 'blur' }],
contractType: [{ required: true, message: '请选择合同类型', trigger: 'change' }], contractType: [{ required: true, message: '请选择合同类型', trigger: 'change' }],
contractSupplier: [{ required: true, message: '请输入供应商', trigger: 'blur' }], contractSupplier: [{ required: true, message: '请输入供应商', trigger: 'blur' }],
amount: [{ required: true, message: '请输入合同金额', trigger: 'blur' }], amount: [{ required: true, message: '请输入合同金额', trigger: 'blur' }],
tenderId: [{ required: false, message: '请输入招标Id', trigger: 'blur' }], tenderId: [{ required: true, message: '请选择招标计划', trigger: 'blur' }],
remark: [{ required: false, message: '请输入备注', trigger: 'blur' }], remark: [{ required: false, message: '请输入备注', trigger: 'blur' }],
}; };
const payMentRules = { const payMentRules = {
@ -338,7 +342,7 @@ const handleChoose = async () => {
const formData = { const formData = {
projectId: userStore.selectedProject.id, projectId: userStore.selectedProject.id,
dictName: form.value.contractType, dictName: form.value.contractType,
status: 1 status: 1,
} }
const { data } = await getTenderPlan(formData) const { data } = await getTenderPlan(formData)
if (data.length === 0) { if (data.length === 0) {
@ -348,7 +352,6 @@ const handleChoose = async () => {
planList.value = data planList.value = data
dialogVisible.value = true; dialogVisible.value = true;
} }
const handleChooseData = (row) => { const handleChooseData = (row) => {
form.value.tenderId = row.id; form.value.tenderId = row.id;