From a9c3543f4b4fa5a092a8dea688aedc2b2adbd576 Mon Sep 17 00:00:00 2001 From: 曹睿 <360930172@qq.com> Date: 星期二, 24 六月 2025 17:34:50 +0800 Subject: [PATCH] feat: 【来票台账】显示附件 --- src/views/procurementManagement/invoiceEntry/indexOld.vue | 725 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 725 insertions(+), 0 deletions(-) diff --git a/src/views/procurementManagement/invoiceEntry/indexOld.vue b/src/views/procurementManagement/invoiceEntry/indexOld.vue new file mode 100644 index 0000000..60d5124 --- /dev/null +++ b/src/views/procurementManagement/invoiceEntry/indexOld.vue @@ -0,0 +1,725 @@ +<template> + <div class="app-container"> + <div class="search_form"> + <div> + <span class="search_title">閲囪喘鍚堝悓鍙凤細</span> + <el-input + v-model="searchForm.purchaseContractNumber" + style="width: 240px" + placeholder="璇疯緭鍏�" + @change="handleQuery" + clearable + prefix-icon="Search" + /> + <el-button + type="primary" + @click="handleQuery" + style="margin-left: 10px" + > + 鎼滅储 + </el-button> + </div> + <div> + <el-button type="primary" @click="handleAdd">鏂板鐧昏</el-button> + <el-button @click="handleOut">瀵煎嚭</el-button> + <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button> + </div> + </div> + <div class="table_list"> + <el-table + :data="tableData" + border + v-loading="tableLoading" + @selection-change="handleSelectionChange" + :expand-row-keys="expandedRowKeys" + :row-key="(row) => row.id" + show-summary + :summary-method="summarizeMainTable" + @expand-change="expandChange" + height="calc(100vh - 18.5em)" + > + <el-table-column align="center" type="selection" width="55" /> + <el-table-column type="expand"> + <template #default="props"> + <el-table + :data="props.row.children" + border + show-summary + :summary-method="summarizeChildrenTable" + > + <el-table-column + align="center" + label="搴忓彿" + type="index" + width="60" + /> + <el-table-column label="浜у搧澶х被" prop="productCategory" /> + <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" /> + <el-table-column label="鍗曚綅" prop="unit" /> + <el-table-column label="鏁伴噺" prop="quantity" /> + <el-table-column label="绋庣巼(%)" prop="taxRate" /> + <el-table-column + label="鍚◣鍗曚环(鍏�)" + prop="taxInclusiveUnitPrice" + :formatter="formattedNumber" + /> + <el-table-column + label="鍚◣鎬讳环(鍏�)" + prop="taxInclusiveTotalPrice" + :formatter="formattedNumber" + /> + <el-table-column + label="涓嶅惈绋庢�讳环(鍏�)" + prop="taxExclusiveTotalPrice" + :formatter="formattedNumber" + /> + <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" /> + <el-table-column + label="鏈鏉ョエ閲戦(鍏�)" + prop="ticketsAmount" + :formatter="formattedNumber" + /> + <el-table-column label="鏈潵绁ㄦ暟" prop="futureTickets" /> + <el-table-column + label="鏈潵绁ㄩ噾棰�(鍏�)" + prop="futureTicketsAmount" + :formatter="formattedNumber" + /> + </el-table> + </template> + </el-table-column> + <el-table-column align="center" label="搴忓彿" type="index" width="60" /> + <el-table-column + label="閲囪喘鍚堝悓鍙�" + prop="purchaseContractNumber" + show-overflow-tooltip + /> + <el-table-column + label="閿�鍞悎鍚屽彿" + prop="salesContractNo" + show-overflow-tooltip + /> + <el-table-column + label="渚涘簲鍟嗗悕绉�" + prop="supplierName" + show-overflow-tooltip + /> + <el-table-column + label="椤圭洰鍚嶇О" + prop="projectName" + show-overflow-tooltip + /> + <el-table-column + label="鍚堝悓閲戦(鍏�)" + prop="contractAmount" + show-overflow-tooltip + :formatter="formattedNumber" + /> + <el-table-column + label="宸插紑绁ㄩ噾棰�(鍏�)" + prop="receiptPaymentAmount" + show-overflow-tooltip + :formatter="formattedNumber" + /> + <el-table-column + label="寰呭紑绁ㄩ噾棰�(鍏�)" + prop="unReceiptPaymentAmount" + show-overflow-tooltip + :formatter="formattedNumber" + /> + <el-table-column + fixed="right" + label="鎿嶄綔" + min-width="60" + align="center" + > + <template #default="scope"> + <el-button + text + type="primary" + size="small" + @click="openForm('edit', scope.row)" + > + 缂栬緫 + </el-button> + </template> + </el-table-column> + </el-table> + <pagination + v-show="total > 0" + :total="total" + layout="total, sizes, prev, pager, next, jumper" + :page="page.current" + :limit="page.size" + @pagination="paginationChange" + /> + </div> + <el-dialog + v-model="dialogFormVisible" + :title="operationType === 'add' ? '鏂板鏉ョエ鐧昏' : '缂栬緫鏉ョエ鐧昏'" + width="80%" + @close="closeDia" + > + <el-form + :model="form" + label-width="140px" + label-position="top" + :rules="rules" + ref="formRef" + > + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerNo"> + <el-input v-model="form.purchaseLedgerNo" disabled /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo"> + <el-input + v-model="form.salesContractNo" + placeholder="鑷姩濉厖" + clearable + disabled + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName"> + <el-input + v-model="form.supplierName" + placeholder="鑷姩濉厖" + clearable + disabled + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName"> + <el-input + v-model="form.projectName" + placeholder="鑷姩濉厖" + clearable + disabled + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber"> + <el-input + v-model="form.invoiceNumber" + placeholder="璇疯緭鍏�" + clearable + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount"> + <el-input + type="number" + :step="0.01" + v-model="form.invoiceAmount" + placeholder="鑷姩濉厖" + clearable + :disabled="true" + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="褰曞叆浜猴細" prop="issUer"> + <el-input + v-model="form.issUer" + placeholder="璇疯緭鍏�" + clearable + disabled + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="issueDate"> + <el-date-picker + style="width: 100%" + v-model="form.issueDate" + type="date" + clearable + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="涓婁紶闄勪欢"> + <FileUpload :showTip="false" accept="*" :autoUpload="true" /> + </el-form-item> + </el-col> + </el-row> + <!-- <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="褰曞叆鏃ユ湡锛�" prop="createTime"> + <el-date-picker + style="width: 100%" + v-model="form.createTime" + type="date" + placeholder="璇烽�夋嫨" + clearable + /> + </el-form-item> + </el-col> + </el-row> --> + <el-row> + <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> </el-form-item> + </el-row> + <el-table + :data="productData" + border + @selection-change="productSelected" + show-summary + style="width: 100%" + :summary-method="summarizeChildrenTable" + > + <el-table-column + align="center" + label="搴忓彿" + type="index" + width="60" + /> + <el-table-column label="浜у搧澶х被" prop="productCategory" /> + <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" /> + <el-table-column label="鍗曚綅" prop="unit" width="70" /> + <el-table-column label="鏁伴噺" prop="quantity" width="70" /> + <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" /> + <el-table-column label="褰曞叆鏃ユ湡" prop="createTime" width="120" /> + <el-table-column + label="鍚◣鍗曚环(鍏�)" + width="150" + prop="taxInclusiveUnitPrice" + :formatter="formattedNumber" + /> + <el-table-column + label="鍚◣鎬讳环(鍏�)" + width="150" + prop="taxInclusiveTotalPrice" + :formatter="formattedNumber" + /> + <el-table-column + label="涓嶅惈绋庢�讳环(鍏�)" + width="150" + prop="taxExclusiveTotalPrice" + :formatter="formattedNumber" + /> + <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" width="170"> + <template #default="scope"> + <el-input-number + v-model="scope.row.ticketsNum" + placeholder="璇烽�夋嫨" + :min="0" + :step="0.1" + clearable + style="width: 100%" + @change="invoiceNumBlur(scope.row)" + /> + </template> + </el-table-column> + <el-table-column + label="鏈鏉ョエ閲戦(鍏�)" + prop="ticketsAmount" + :min="0" + :step="0.1" + :formatter="formattedNumber" + width="170" + > + <template #default="scope"> + <el-input-number + v-model="scope.row.ticketsAmount" + placeholder="璇烽�夋嫨" + :min="0" + :step="0.1" + clearable + style="width: 100%" + @change="invoiceAmountBlur(scope.row)" + /> + </template> + </el-table-column> + <el-table-column + label="鏈潵绁ㄦ暟" + prop="futureTickets" + :formatter=" + (row) => + row.futureTickets == null || row.futureTickets === '' + ? row.quantity + : row.futureTickets + " + > + </el-table-column> + <el-table-column + label="鏈潵绁ㄩ噾棰�(鍏�)" + prop="futureTicketsAmount" + :formatter=" + (row) => + row.futureTicketsAmount !== undefined && + row.futureTicketsAmount !== null && + row.futureTicketsAmount !== '' + ? row.futureTicketsAmount + : row.taxExclusiveTotalPrice + " + > + </el-table-column> + </el-table> + </el-form> + <template #footer> + <div class="dialog-footer"> + <el-button type="primary" @click="submitForm">纭</el-button> + <el-button @click="closeDia">鍙栨秷</el-button> + </div> + </template> + </el-dialog> + </div> +</template> + +<script setup> +import pagination from "@/components/PIMTable/Pagination.vue"; +import { onMounted, ref } from "vue"; +import { ElMessageBox } from "element-plus"; +import { userListNoPage } from "@/api/system/user.js"; +import { productList } from "@/api/procurementManagement/procurementLedger.js"; +import useUserStore from "@/store/modules/user"; +import FileUpload from "@/components/Upload/FileUpload.vue"; + +const userStore = useUserStore(); +const { proxy } = getCurrentInstance(); +const tableData = ref([]); +const productData = ref([]); +const selectedRows = ref([]); +const productSelectedRows = ref([]); +const userList = ref([]); +const purchaseLedgerList = ref([]); +const tableLoading = ref(false); +const page = reactive({ + current: 1, + size: 100, +}); +const total = ref(0); +const fileList = ref([]); +import { + addOrUpdateRegistration, + delRegistration, + gePurchaseListPage, + getInfo, + getProduct, + getPurchaseNoById, + getRegistrationById, +} from "@/api/procurementManagement/invoiceEntry.js"; + +// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁 +const operationType = ref(""); +const dialogFormVisible = ref(false); +const data = reactive({ + searchForm: { + purchaseContractNumber: "", + }, + form: { + issueDate: "", // 寮�绁ㄦ棩鏈� + purchaseLedgerId: "", + purchaseLedgerNo: "", + issUerId: "", // 寮�绁ㄤ汉id + issUer: "", // 寮�绁ㄤ汉濮撳悕 + invoiceNumber: "", // 鍙戠エ鍙� + invoiceAmount: "", // 鍙戠エ閲戦 + createTime: "", // 褰曞叆鏃ユ湡 + }, + rules: { + invoiceNumber: [ + { required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur" }, + { type: "string" }, + ], + invoiceAmount: [ + { required: true, message: "璇疯緭鍏ュ彂绁ㄩ噾棰�", trigger: "blur" }, + ], + }, +}); +const { searchForm, form, rules } = toRefs(data); +// 浜у搧琛ㄥ崟寮规鏁版嵁 +const productFormVisible = ref(false); +const productOperationType = ref(""); +const currentId = ref(""); + +// 鏌ヨ鍒楄〃 +/** 鎼滅储鎸夐挳鎿嶄綔 */ +const handleQuery = () => { + page.current = 1; + getList(); +}; +const paginationChange = (obj) => { + page.current = obj.page; + page.size = obj.limit; + getList(); +}; +const getList = () => { + tableLoading.value = true; + gePurchaseListPage({ ...searchForm.value, ...page }) + .then((res) => { + tableLoading.value = false; + tableData.value = res.records; + tableData.value.map((item) => { + item.children = []; + }); + total.value = res.total; + expandedRowKeys.value = []; + }) + .catch(() => { + tableLoading.value = false; + }); +}; +const formattedNumber = (row, column, cellValue) => { + return parseFloat(cellValue).toFixed(2) ?? 0; +}; +// 琛ㄦ牸閫夋嫨鏁版嵁 +const handleSelectionChange = (selection) => { + selectedRows.value = selection.filter( + (item) => item.purchaseContractNumber !== undefined + ); +}; +const productSelected = (selectedRows) => { + productSelectedRows.value = selectedRows; +}; +const expandedRowKeys = ref([]); +// 灞曞紑琛� +const expandChange = (row, expandedRows) => { + if (expandedRows.length > 0) { + expandedRowKeys.value = []; + try { + productList({ salesLedgerId: row.id, type: 2 }).then((res) => { + const index = tableData.value.findIndex((item) => item.id === row.id); + if (index > -1) { + tableData.value[index].children = res; + } + expandedRowKeys.value.push(row.id); + }); + } catch (error) { + console.log(error); + } + } else { + expandedRowKeys.value = []; + } +}; +// 涓昏〃鍚堣鏂规硶 +const summarizeMainTable = (param) => { + return proxy.summarizeTable( + param, + ["contractAmount", "receiptPaymentAmount", "unReceiptPaymentAmount"], + { + ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� + futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� + } + ); +}; +// 瀛愯〃鍚堣鏂规硶 +const summarizeChildrenTable = (param) => { + return proxy.summarizeTable( + param, + [ + "taxInclusiveUnitPrice", + "taxInclusiveTotalPrice", + "taxExclusiveTotalPrice", + "ticketsNum", + "ticketsAmount", + "futureTickets", + "futureTicketsAmount", + ], + { + ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� + futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� + } + ); +}; + +const handleAdd = () => { + if (selectedRows.value.length !== 1) { + proxy.$modal.msgWarning("璇峰厛閫変腑涓�鏉℃暟鎹�"); + return; + } + openForm("add", selectedRows.value[0]); +}; + +// 鎵撳紑寮规 +const openForm = (type, row) => { + invoiceNumBlur(row); + operationType.value = type; + form.value = {}; + productData.value = []; + fileList.value = []; + form.value.issUerId = userStore.id; + form.value.issUer = userStore.name; + form.value.issueDate = getNowFormatDate(); + userListNoPage().then((res) => { + userList.value = res.data; + }); + // 鏂板鏃朵紶鍏ュ綋鍓嶈id骞舵煡璇㈤噰璐悎鍚屽彿 + if (type === "add" && row && row.id) { + form.value.purchaseLedgerId = row.id; + getPurchaseNoById({ id: row.id }).then((res) => { + let result = res.data; + purchaseLedgerList.value = result; + form.value.purchaseLedgerNo = result.purchaseContractNumber; + form.value.invoiceAmount = result.invoiceAmount; + form.value.invoiceNumber = result.invoiceNumber; + setInfo(result.id); + }); + } else { + getProduct().then((res) => { + purchaseLedgerList.value = res; + }); + } + if (type === "edit") { + currentId.value = row.id; + getRegistrationById({ id: row.id }).then((res) => { + const { code, data } = res; + if (code == 200) { + form.value.invoiceAmount = data.invoiceAmount; + productData.value = data.productData; + if (data.salesLedgerFiles) { + fileList.value = data.salesLedgerFiles; + } else { + fileList.value = []; + } + } + }); + } + dialogFormVisible.value = true; +}; +// 閫夋嫨閲囪喘鍚堝悓鍙疯祴鍊� +const setInfo = (value) => { + getInfo({ id: value }).then((res) => { + let result = res.data; + form.value.salesContractNo = result.salesContractNo; + form.value.projectName = result.projectName; + productData.value = result.productData; + form.value.supplierName = result.supplierName; + }); +}; +// 鎻愪氦琛ㄥ崟 +const submitForm = () => { + proxy.$refs["formRef"].validate((valid) => { + if (valid) { + form.value.productData = proxy.HaveJson(productData.value); + addOrUpdateRegistration(form.value).then((res) => { + proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); + closeDia(); + getList(); + }); + } + }); +}; +// 鍏抽棴寮规 +const closeDia = () => { + proxy.resetForm("formRef"); + dialogFormVisible.value = false; +}; +// 瀵煎嚭 +const handleOut = () => { + ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", + }) + .then(() => { + proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx"); + }) + .catch(() => { + proxy.$modal.msg("宸插彇娑�"); + }); +}; +// 鍒犻櫎 +const handleDelete = () => { + let ids = []; + if (selectedRows.value.length > 0) { + ids = selectedRows.value.map((item) => item.id); + } else { + proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁"); + return; + } + ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", + }) + .then(() => { + delRegistration(ids).then((res) => { + proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + getList(); + }); + }) + .catch(() => { + proxy.$modal.msg("宸插彇娑�"); + }); +}; +//鏈鏉ョエ鏁板け鐒︽搷浣� +const invoiceNumBlur = (row) => { + if (!row.ticketsNum || row.ticketsNum === "") { + row.ticketsNum = 0; + } + if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) { + proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟"); + row.ticketsNum = 0; + return; + } + // 璁$畻鏈鏉ョエ閲戦 + row.ticketsAmount = row.ticketsNum * row.taxInclusiveUnitPrice; + // 璁$畻鏈潵绁ㄦ暟 + row.futureTickets = row.tempFutureTickets - row.ticketsNum; + // 璁$畻鏈潵绁ㄩ噾棰� + row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount; + calculateinvoiceAmount(); +}; +// 鏈鏉ョエ閲戦澶辩劍鎿嶄綔 +const invoiceAmountBlur = (row) => { + if (!row.ticketsAmount) { + row.ticketsAmount = 0; + } + // 璁$畻鏄惁瓒呰繃鏉ョエ鎬婚噾棰� + if (row.ticketsAmount > row.tempFutureTicketsAmount) { + proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鏈潵绁ㄩ噾棰�"); + row.ticketsAmount = 0; + } + // 璁$畻鏈鏉ョエ鏁� + row.ticketsNum = (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2); + // 璁$畻鏈潵绁ㄦ暟 + row.futureTickets = row.tempFutureTickets - row.ticketsNum; + // 璁$畻鏈潵绁ㄩ噾棰� + row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount; + calculateinvoiceAmount(); +}; + +// 鑾峰彇褰撳墠鏃ユ湡鍑芥暟 +function getNowFormatDate() { + let date = new Date(), + year = date.getFullYear(), //鑾峰彇瀹屾暣鐨勫勾浠�(4浣�) + month = date.getMonth() + 1, //鑾峰彇褰撳墠鏈堜唤(0-11,0浠h〃1鏈�) + strDate = date.getDate(); // 鑾峰彇褰撳墠鏃�(1-31) + if (month < 10) month = `0${month}`; // 濡傛灉鏈堜唤鏄釜浣嶆暟锛屽湪鍓嶉潰琛�0 + if (strDate < 10) strDate = `0${strDate}`; // 濡傛灉鏃ユ槸涓綅鏁帮紝鍦ㄥ墠闈㈣ˉ0 + return `${year}-${month}-${strDate}`; +} + +function calculateinvoiceAmount() { + console.log("productData", productData.value); + var invoiceAmountTotal = 0; + productData.value.forEach((item) => { + if (item.ticketsAmount) { + invoiceAmountTotal += item.ticketsAmount; + } + }); + form.value.invoiceAmount = invoiceAmountTotal.toFixed(2); +} + +onMounted(() => { + getList(); +}); +</script> + +<style scoped lang="scss"></style> -- Gitblit v1.9.3