<template>
|
<div class="app-container">
|
<el-form :model="filters" :inline="true">
|
<el-form-item label="采购合同号">
|
<el-input
|
v-model="filters.purchaseContractNumber"
|
style="width: 240px"
|
placeholder="请输入"
|
clearable
|
:prefix-icon="Search"
|
@change="getTableData"
|
/>
|
</el-form-item>
|
<el-form-item label="供应商">
|
<el-input
|
v-model="filters.supplierName"
|
style="width: 240px"
|
placeholder="请输入"
|
clearable
|
:prefix-icon="Search"
|
@change="getTableData"
|
/>
|
</el-form-item>
|
<el-form-item label="来票日期">
|
<el-date-picker
|
style="width: 240px"
|
v-model="filters.createdAt"
|
value-format="YYYY-MM-DD"
|
format="YYYY-MM-DD"
|
type="daterange"
|
start-placeholder="开始时间"
|
end-placeholder="结束时间"
|
clearable
|
@change="getTableData"
|
/>
|
</el-form-item>
|
<el-form-item>
|
<el-button type="primary" @click="getTableData">搜索</el-button>
|
<el-button @click="resetFilters"> 重置 </el-button>
|
<el-button @click="handleOut">导出</el-button>
|
</el-form-item>
|
</el-form>
|
<div class="table_list">
|
<PIMTable
|
rowKey="id"
|
:column="columns"
|
:tableLoading="loading"
|
:tableData="dataList"
|
:isSelection="true"
|
height="calc(100vh - 19.5em)"
|
:isShowSummary="true"
|
:summaryMethod="summarizeMainTable"
|
:page="{
|
current: pagination.currentPage,
|
size: pagination.pageSize,
|
total: pagination.total,
|
}"
|
@selection-change="handleSelectionChange"
|
@pagination="changePage"
|
>
|
<template #operation="{ row }">
|
<el-button
|
type="primary"
|
link
|
@click="downLoadFile(row)"
|
>
|
附件
|
</el-button>
|
<el-button
|
type="primary"
|
link
|
@click="openEdit(row)"
|
>
|
编辑
|
</el-button>
|
<el-button
|
type="primary"
|
link
|
@click="handleDelete(row)"
|
>
|
删除
|
</el-button>
|
</template>
|
</PIMTable>
|
</div>
|
<FileListDialog
|
ref="fileListRef"
|
v-model="fileListDialogVisible"
|
title="附件列表"
|
:showUploadButton="true"
|
:showDeleteButton="true"
|
:deleteMethod="handleDeleteFile"
|
:uploadMethod="handleFileUpload"
|
:rulesRegulationsManagementId="currentRowId"
|
/>
|
<EditModal ref="editmodalRef" @success="getTableData"></EditModal>
|
</div>
|
</template>
|
|
<script setup>
|
import { ref, getCurrentInstance } from "vue";
|
import { usePaginationApi } from "@/hooks/usePaginationApi";
|
import {
|
Search,
|
} from "@element-plus/icons-vue";
|
import {
|
delRegistration,
|
productRecordPage,
|
delCommonFile,
|
} from "@/api/procurementManagement/procurementInvoiceLedger.js";
|
import request from "@/utils/request";
|
import { getToken } from "@/utils/auth";
|
import { onMounted } from "vue";
|
import { ElMessageBox } from "element-plus";
|
import EditModal from "./Modal/EditModal.vue";
|
import FileListDialog from '@/components/Dialog/FileListDialog.vue';
|
import useUserStore from "@/store/modules/user.js";
|
const userStore = useUserStore();
|
|
defineOptions({
|
name: "来票台账",
|
});
|
|
const editmodalRef = ref();
|
const fileListRef = ref(null);
|
const fileListDialogVisible = ref(false);
|
const currentRowId = ref(null); // 当前查看附件的行ID
|
|
const { proxy } = getCurrentInstance();
|
const multipleVal = ref([]);
|
const {
|
loading,
|
filters,
|
columns,
|
dataList,
|
pagination,
|
getTableData,
|
resetFilters,
|
onCurrentChange,
|
} = usePaginationApi(
|
productRecordPage,
|
{
|
purchaseContractNumber: undefined, // 采购合同号
|
supplierName: undefined, // 供应商
|
createdAt: [], // 来票日期
|
},
|
[
|
{
|
label: "采购合同号",
|
prop: "purchaseContractNumber",
|
width: 150,
|
},
|
{
|
label: "销售合同号",
|
prop: "salesContractNo",
|
width: 150,
|
},
|
{
|
label: "项目名称",
|
prop: "projectName",
|
width: 240,
|
},
|
{
|
label: "供应商名称",
|
prop: "supplierName",
|
width: 240,
|
},
|
{
|
label: "规格型号",
|
prop: "specificationModel",
|
width: 150,
|
},
|
{
|
label: "发票号",
|
prop: "invoiceNumber",
|
width: 200,
|
},
|
{
|
label: "合同金额(元)",
|
prop: "taxInclusiveTotalPrice",
|
width: 200,
|
formatData: (cell) => {
|
return cell ? parseFloat(cell).toFixed(2) : 0;
|
},
|
},
|
{
|
label: "开票日期",
|
prop: "createdAt",
|
width: 110,
|
},
|
{
|
label: "开票金额",
|
prop: "ticketsAmount",
|
width: 200,
|
formatData: (cell) => {
|
return cell ? parseFloat(cell).toFixed(2) : 0;
|
},
|
},
|
{
|
label: "不含税金额",
|
prop: "unTicketsPrice",
|
width: 200,
|
formatData: (cell) => {
|
return cell ? parseFloat(cell).toFixed(2) : 0;
|
},
|
},
|
{
|
label: "增值税",
|
prop: "invoiceAmount",
|
width: 200,
|
},
|
{
|
label: "录入人",
|
prop: "issUer",
|
width: 200,
|
},
|
{
|
fixed: "right",
|
width: 200,
|
label: "操作",
|
dataType: "slot",
|
slot: "operation",
|
align: "center",
|
},
|
],
|
{},
|
{
|
createdAt: (aim) => ({
|
createdAtStart: aim ? aim[0] : undefined,
|
createdAtEnd: aim ? aim[1] : undefined,
|
}),
|
}
|
);
|
|
// 主表合计方法
|
const summarizeMainTable = (param) => {
|
return proxy.summarizeTable(
|
param,
|
[
|
"taxInclusiveTotalPrice",
|
"ticketsAmount",
|
"unTicketsPrice",
|
"invoiceAmount",
|
],
|
{
|
ticketsNum: { noDecimal: true }, // 不保留小数
|
futureTickets: { noDecimal: true }, // 不保留小数
|
}
|
);
|
};
|
|
const handleSelectionChange = (val) => {
|
multipleVal.value = val;
|
};
|
|
// 导出
|
const handleOut = () => {
|
ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", {
|
confirmButtonText: "确认",
|
cancelButtonText: "取消",
|
type: "warning",
|
})
|
.then(() => {
|
proxy.download("/purchase/registration/export", {}, "来票登记.xlsx");
|
})
|
.catch(() => {
|
proxy.$modal.msg("已取消");
|
});
|
};
|
|
const changePage = ({ page, limit }) => {
|
pagination.currentPage = page;
|
pagination.pageSize = limit;
|
onCurrentChange(page);
|
};
|
|
const downLoadFile = row => {
|
currentRowId.value = row.id;
|
if (fileListRef.value) {
|
fileListRef.value.open(row.commonFiles || []);
|
}
|
};
|
|
// 上传附件(自定义上传方法)
|
const handleFileUpload = async () => {
|
if (!currentRowId.value) {
|
proxy.$modal.msgWarning("缺少登记ID,无法保存附件");
|
return;
|
}
|
|
return new Promise((resolve) => {
|
// 创建一个隐藏的文件输入元素
|
const input = document.createElement('input');
|
input.type = 'file';
|
input.style.display = 'none';
|
input.onchange = async (e) => {
|
const file = e.target.files[0];
|
if (!file) {
|
resolve(null);
|
return;
|
}
|
|
try {
|
// 使用 FormData 上传文件
|
const formData = new FormData();
|
formData.append('file', file);
|
formData.append('type', '4'); // type 参数,用户未指定具体值,先传空字符串
|
formData.append('id', currentRowId.value); // 当前行的 id
|
|
const uploadRes = await request({
|
url: '/file/uploadByCommon',
|
method: 'post',
|
data: formData,
|
headers: {
|
'Content-Type': 'multipart/form-data',
|
Authorization: `Bearer ${getToken()}`
|
}
|
});
|
|
if (uploadRes.code === 200) {
|
proxy.$modal.msgSuccess("附件上传成功");
|
|
// 刷新列表获取最新数据
|
await new Promise((resolveRefresh) => {
|
// 调用 API 获取最新列表数据
|
productRecordPage({
|
...filters,
|
current: pagination.currentPage,
|
size: pagination.pageSize
|
}).then(({ code, data }) => {
|
if (code === 200) {
|
// 更新数据列表
|
dataList.value = data.records;
|
pagination.total = data.total;
|
|
// 从外部数据获取 commonFiles
|
const currentRow = dataList.value.find(row => row.id === currentRowId.value);
|
if (currentRow && fileListRef.value) {
|
// 刷新附件列表,使用从外部获取的最新 commonFiles
|
fileListRef.value.open(currentRow.commonFiles || []);
|
}
|
resolveRefresh();
|
} else {
|
resolveRefresh();
|
}
|
}).catch(() => {
|
resolveRefresh();
|
});
|
});
|
|
resolve({
|
name: uploadRes.data?.originalName || file.name,
|
url: uploadRes.data?.tempPath || uploadRes.data?.url,
|
id: uploadRes.data?.id
|
});
|
} else {
|
proxy.$modal.msgError(uploadRes.msg || "文件上传失败");
|
resolve(null);
|
}
|
} catch (error) {
|
console.error("附件上传失败:", error);
|
proxy.$modal.msgError("附件上传失败");
|
resolve(null);
|
} finally {
|
document.body.removeChild(input);
|
}
|
};
|
|
document.body.appendChild(input);
|
input.click();
|
});
|
};
|
|
// 删除附件
|
const handleDeleteFile = async (file) => {
|
try {
|
await delCommonFile([file.id]);
|
proxy.$modal.msgSuccess("删除成功");
|
|
// 刷新列表获取最新数据
|
await new Promise((resolveRefresh) => {
|
// 调用 API 获取最新列表数据
|
productRecordPage({
|
...filters,
|
current: pagination.currentPage,
|
size: pagination.pageSize
|
}).then(({ code, data }) => {
|
if (code === 200) {
|
// 更新数据列表
|
dataList.value = data.records;
|
pagination.total = data.total;
|
|
// 从外部数据获取 commonFiles
|
const currentRow = dataList.value.find(row => row.id === currentRowId.value);
|
if (currentRow && fileListRef.value) {
|
// 刷新附件列表,使用从外部获取的最新 commonFiles
|
fileListRef.value.open(currentRow.commonFiles || []);
|
}
|
resolveRefresh();
|
} else {
|
resolveRefresh();
|
}
|
}).catch(() => {
|
resolveRefresh();
|
});
|
});
|
|
return true;
|
} catch (error) {
|
proxy.$modal.msgError("删除失败");
|
return false;
|
}
|
};
|
|
const openEdit = (row) => {
|
editmodalRef.value.open(row);
|
};
|
// 删除
|
const handleDelete = (row) => {
|
let ids = [];
|
ids.push(row.id);
|
ElMessageBox.confirm("该开票台账将被删除,是否确认删除", {
|
confirmButtonText: "确认",
|
cancelButtonText: "取消",
|
type: "warning",
|
})
|
.then(() => {
|
loading.value = true;
|
delRegistration(ids).then((res) => {
|
getTableData();
|
});
|
loading.value = false;
|
})
|
.catch(() => {
|
proxy.$modal.msg("已取消");
|
});
|
};
|
|
onMounted(() => {
|
getTableData();
|
});
|
</script>
|
|
<style lang="scss" scoped>
|
.table_list {
|
margin-top: unset;
|
}
|
.tagBox {
|
margin-top: 4px;
|
}
|
</style>
|