| src/api/salesManagement/indicatorStats.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/procurementManagement/paymentLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/salesManagement/receiptPaymentLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/salesManagement/indicatorStats.js
@@ -18,3 +18,21 @@ params: query, }); } // 客户往来列表 export function customewTransactions(query) { return request({ url: "/metricStatistics/customewTransactions", method: "get", params: query, }); } // 客户往来明细 export function customewTransactionsDetails(query) { return request({ url: "/metricStatistics/customewTransactionsDetails", method: "get", params: query, }); } src/views/procurementManagement/paymentLedger/index.vue
@@ -1,64 +1,54 @@ <template> <div class="app-container"> <div class="search_form" style="margin-bottom: 20px;"> <div class="search_form" style="margin-bottom: 20px;"> <div> <span class="search_title">供应商名称:</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="输入供应商名称" @change="handleQuery" clearable :prefix-icon="Search" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px" >搜索</el-button > <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="输入供应商名称" @change="handleQuery" clearable :prefix-icon="Search" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button> </div> <div></div> </div> <el-row :gutter="20"> <el-col :span="14"> <div class="table_list"> <el-table ref="multipleTable" border v-loading="tableLoading" :data="tableData" :header-cell-style="{ background: '#F0F1F5', color: '#333333' }" height="calc(100vh - 18.5em)" :highlight-current-row="true" style="width: 100%" tooltip-effect="dark" @row-click="rowClick" :show-summary="isShowSummary" :summary-method="summarizeMainTable" class="lims-table" > <el-table-column align="center" label="序号" type="index" width="60" /> <el-table-column label="供应商名称" prop="supplierName" /> <el-table-column label="合同金额(元)" prop="contractAmounts" show-overflow-tooltip :formatter="formattedNumber" /> <el-table-column label="付款金额(元)" prop="paymentAmount" show-overflow-tooltip :formatter="formattedNumber" /> <el-table-column label="应付金额(元)" prop="payableAmount" show-overflow-tooltip > <el-table ref="multipleTable" border v-loading="tableLoading" :data="tableData" :header-cell-style="{ background: '#F0F1F5', color: '#333333' }" height="calc(100vh - 18.5em)" :highlight-current-row="true" style="width: 100%" tooltip-effect="dark" @row-click="rowClick" :show-summary="isShowSummary" :summary-method="summarizeMainTable" class="lims-table"> <el-table-column align="center" label="序号" type="index" width="60" /> <el-table-column label="供应商名称" prop="supplierName" /> <el-table-column label="合同金额(元)" prop="contractAmounts" show-overflow-tooltip :formatter="formattedNumber" /> <el-table-column label="付款金额(元)" prop="paymentAmount" show-overflow-tooltip :formatter="formattedNumber" /> <el-table-column label="应付金额(元)" prop="payableAmount" show-overflow-tooltip> <template #default="{ row, column }"> <el-text type="danger"> {{ formattedNumber(row, column, row.payableAmount) }} @@ -66,29 +56,27 @@ </template> </el-table-column> </el-table> <pagination v-show="total > 0" @pagination="paginationSearch" :total="total" :layout="page.layout" :page="page.current" :limit="page.size" /> <pagination v-show="total > 0" @pagination="paginationSearch" :total="total" :layout="page.layout" :page="page.current" :limit="page.size" /> </div> </el-col> <el-col :span="10"> <div class="table_list"> <PIMTable rowKey="id" :column="tableColumnSon" :tableData="originalTableDataSon" :isSelection="false" :isShowPagination="false" :tableLoading="tableLoadingSon" :isShowSummary="isShowSummarySon" :summaryMethod="summarizeMainTable1" height="calc(100vh - 18.5em)" > <PIMTable rowKey="id" :column="tableColumnSon" :tableData="originalTableDataSon" :isSelection="false" :isShowPagination="true" :page="sonPage" :tableLoading="tableLoadingSon" :isShowSummary="isShowSummarySon" :summaryMethod="summarizeMainTable1" height="calc(100vh - 18.5em)" @pagination="sonPaginationSearch"> <template #payableAmountSlot="{ row }"> <el-text type="danger"> {{ parseFloat(row.payableAmount).toFixed(2) }} @@ -102,191 +90,205 @@ </template> <script setup> import { ref, toRefs } from "vue"; import { Search } from "@element-plus/icons-vue"; import { paymentLedgerList, paymentRecordList, } from "@/api/procurementManagement/paymentLedger.js"; import Pagination from "../../../components/PIMTable/Pagination.vue"; import { ref, toRefs } from "vue"; import { Search } from "@element-plus/icons-vue"; import { paymentLedgerList, paymentRecordList, } from "@/api/procurementManagement/paymentLedger.js"; import Pagination from "../../../components/PIMTable/Pagination.vue"; const tableData = ref([]); const tableLoading = ref(false); const data = reactive({ searchForm: { supplierName: "", }, }); const page = reactive({ current: 1, size: 100, }); const sonPage = reactive({ current: 1, size: 100, }); const total = ref(0); const sonTotal = ref(0); const isShowSummary = ref(true); const { searchForm } = toRefs(data); const currentSupplierId = ref(""); const rowClick = (row) => { currentSupplierId.value = row.supplierId; getPaymenRecordtList(row.supplierId); }; // 子模块 const tableColumnSon = ref([ { label: "发生日期", prop: "paymentDate", width: 110, }, { label: "采购合同号", prop: "purchaseContractNumber", width: 150, }, { label: "合同金额(元)", prop: "invoiceAmount", width: 200, formatData: (params) => { return params ? parseFloat(params).toFixed(2) : 0; const tableData = ref([]); const tableLoading = ref(false); const data = reactive({ searchForm: { supplierName: "", }, }, { label: "付款金额(元)", prop: "paymentAmount", width: 200, formatData: (params) => { return params ? parseFloat(params).toFixed(2) : 0; }, }, { label: "应付金额(元)", dataType: "slot", width: 200, prop: "payableAmount", slot: "payableAmountSlot", }, ]); const tableDataSon = ref([]); const originalTableDataSon = ref([]); const tableLoadingSon = ref(false); const isShowSummarySon = ref(true); const detailPageNum = ref(1); const detailPageSize = ref(10); const { proxy } = getCurrentInstance(); // 主表合计方法 const summarizeMainTable = (param) => { return proxy.summarizeTable( param, ["contractAmounts", "paymentAmount", "payableAmount"], { ticketsNum: { noDecimal: true }, // 不保留小数 futureTickets: { noDecimal: true }, // 不保留小数 } ); }; // 子表合计方法 const summarizeMainTable1 = (param) => { let summarizeTable = proxy.summarizeTable( param, ["invoiceAmount", "paymentAmount"], { ticketsNum: { noDecimal: true }, // 不保留小数 futureTickets: { noDecimal: true }, // 不保留小数 } ); if (originalTableDataSon.value.length > 0) { summarizeTable[summarizeTable.length - 1] = originalTableDataSon.value[ originalTableDataSon.value.length - 1 ].payableAmount.toFixed(2); } else { summarizeTable[summarizeTable.length - 1] = 0.0; } return summarizeTable; }; /** 搜索按钮操作 */ const handleQuery = () => { page.current = 1; getList(); }; const paginationSearch = (obj) => { page.current = obj.page; page.size = obj.limit; getList(); }; const getList = () => { tableLoading.value = true; paymentLedgerList({ ...searchForm.value, ...page, }).then((res) => { let result = res.data; tableLoading.value = false; tableData.value = result.records || []; total.value = result.total || 0; if (tableData.value.length > 0) { getPaymenRecordtList(tableData.value[0].supplierId); currentSupplierId.value = tableData.value[0].supplierId; } }); }; const page = reactive({ current: 1, size: 100, }); const sonPage = reactive({ current: 1, size: 10, total: 0, layout: "total, sizes, prev, pager, next, jumper", }); const total = ref(0); const isShowSummary = ref(true); const { searchForm } = toRefs(data); const currentSupplierId = ref(""); const rowClick = row => { currentSupplierId.value = row.supplierId; sonPage.current = 1; getPaymenRecordtList(row.supplierId); }; // 子模块 const tableColumnSon = ref([ { label: "发生日期", prop: "executionDate", width: 110, }, { label: "采购合同号", prop: "purchaseContractNumber", width: 150, }, { label: "合同金额(元)", prop: "contractAmount", width: 200, formatData: params => { return params ? parseFloat(params).toFixed(2) : 0; }, }, { label: "付款金额(元)", prop: "paymentAmount", width: 200, formatData: params => { return params ? parseFloat(params).toFixed(2) : 0; }, }, { label: "应付金额(元)", dataType: "slot", width: 200, prop: "payableAmount", slot: "payableAmountSlot", }, ]); const tableDataSon = ref([]); const originalTableDataSon = ref([]); const tableLoadingSon = ref(false); const isShowSummarySon = ref(true); const { proxy } = getCurrentInstance(); const getPaymenRecordtList = (supplierId) => { tableLoadingSon.value = true; paymentRecordList({supplierId: supplierId}) .then((res) => { tableLoadingSon.value = false; tableDataSon.value = res.data; handlePagination({ page: 1, limit: sonPage.size }); sonTotal.value = res.data.length; }) .catch((e) => { tableLoadingSon.value = false; // 主表合计方法 const summarizeMainTable = param => { return proxy.summarizeTable( param, ["contractAmounts", "paymentAmount", "payableAmount"], { ticketsNum: { noDecimal: true }, // 不保留小数 futureTickets: { noDecimal: true }, // 不保留小数 } ); }; // 子表合计方法 const summarizeMainTable1 = param => { let summarizeTable = proxy.summarizeTable( param, ["contractAmount", "invoiceAmount", "paymentAmount"], { ticketsNum: { noDecimal: true }, // 不保留小数 futureTickets: { noDecimal: true }, // 不保留小数 } ); if (originalTableDataSon.value.length > 0) { summarizeTable[summarizeTable.length - 1] = originalTableDataSon.value[ originalTableDataSon.value.length - 1 ].payableAmount.toFixed(2); } else { summarizeTable[summarizeTable.length - 1] = 0.0; } return summarizeTable; }; /** 搜索按钮操作 */ const handleQuery = () => { page.current = 1; getList(); }; const paginationSearch = obj => { page.current = obj.page; page.size = obj.limit; getList(); }; const getList = () => { tableLoading.value = true; paymentLedgerList({ ...searchForm.value, ...page, }).then(res => { let result = res.data; tableLoading.value = false; tableData.value = result.records || []; total.value = result.total || 0; if (tableData.value.length > 0) { currentSupplierId.value = tableData.value[0].supplierId; sonPage.current = 1; getPaymenRecordtList(tableData.value[0].supplierId); } }); }; const handlePagination = ({ page, limit }) => { sonPage.current = page; sonPage.size = limit; }; const start = (page - 1) * limit; const end = start + limit; const getPaymenRecordtList = supplierId => { tableLoadingSon.value = true; paymentRecordList({ supplierId: supplierId, current: sonPage.current, size: sonPage.size, }) .then(res => { tableLoadingSon.value = false; let result = res.data; if (Array.isArray(result)) { tableDataSon.value = result; sonPage.total = result.length; handlePagination({ page: sonPage.current, limit: sonPage.size }); } else { originalTableDataSon.value = result.records || []; sonPage.total = result.total || 0; } }) .catch(e => { tableLoadingSon.value = false; }); }; const handlePagination = ({ page, limit }) => { console.log(page, limit); sonPage.current = page; sonPage.size = limit; originalTableDataSon.value = tableDataSon.value.slice(start, end); }; const start = (page - 1) * limit; const end = start + limit; const sonPaginationSearch = (pagination) => { // 接收分页器参数 { page, limit } handlePagination(pagination); }; const formattedNumber = (row, column, cellValue) => { if (column.property !== "supplierName") { return parseFloat(cellValue).toFixed(2); } else { return cellValue; } }; getList(); originalTableDataSon.value = tableDataSon.value.slice(start, end); }; const sonPaginationSearch = pagination => { // 接收分页器参数 { page, limit } sonPage.current = pagination.page; sonPage.size = pagination.limit; getPaymenRecordtList(currentSupplierId.value); }; const formattedNumber = (row, column, cellValue) => { if (column.property !== "supplierName") { return parseFloat(cellValue).toFixed(2); } else { return cellValue; } }; getList(); </script> <style scoped lang="scss"> .el-pagination { width: 100%; height: 55px; display: flex; justify-content: flex-end; float: right; flex-direction: row; align-items: center; background: #fff; margin: -20px 0 0 0; padding: 0 20px; } .pagination-container { margin-top: 0; } .el-pagination { width: 100%; height: 55px; display: flex; justify-content: flex-end; float: right; flex-direction: row; align-items: center; background: #fff; margin: -20px 0 0 0; padding: 0 20px; } .pagination-container { margin-top: 0; } </style> src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -1,268 +1,252 @@ <template> <div class="app-container"> <div class="search_form" style="margin-bottom: 20px;"> <div class="search_form" style="margin-bottom: 20px;"> <div> <span class="search_title">客户名称:</span> <el-input v-model="searchForm.searchText" style="width: 240px" placeholder="输入客户名称搜索" @change="handleQuery" clearable prefix-icon="Search" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px" >搜索</el-button > <el-input v-model="searchForm.searchText" style="width: 240px" placeholder="输入客户名称搜索" @change="handleQuery" clearable prefix-icon="Search" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button> </div> </div> <div style="display: flex"> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" :row-key="(row) => row.id" show-summary :summary-method="summarizeMainTable" @row-click="rowClickMethod" height="calc(100vh - 18.5em)" > <el-table-column align="center" label="序号" type="index" width="60" /> <el-table-column label="客户名称" prop="customerName" show-overflow-tooltip width="200" /> <el-table-column label="合同金额(元)" prop="invoiceTotal" show-overflow-tooltip :formatter="formattedNumber" width="200" /> <el-table-column label="回款金额(元)" prop="receiptPaymentAmount" show-overflow-tooltip :formatter="formattedNumber" width="200" /> <el-table-column label="应收金额(元)" prop="unReceiptPaymentAmount" show-overflow-tooltip width="200" > <template #default="{ row, column }"> <el-text type="danger"> {{ formattedNumber(row, column, row.unReceiptPaymentAmount) }} </el-text> </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> <div class="table_list"> <el-table :data="receiptRecord" border :row-key="(row) => row.id" show-summary :summary-method="summarizeMainTable1" height="calc(100vh - 18.5em)" > <el-table-column align="center" label="序号" type="index" width="60" /> <el-table-column label="发生日期" prop="receiptPaymentDate" show-overflow-tooltip width="110" /> <el-table-column label="销售合同号" prop="salesContractNo" show-overflow-tooltip width="200" /> <el-table-column label="合同金额(元)" prop="invoiceTotal" show-overflow-tooltip :formatter="formattedNumber" width="200" /> <el-table-column label="回款金额(元)" prop="receiptPaymentAmount" show-overflow-tooltip :formatter="formattedNumber" width="200" /> <el-table-column label="应收金额(元)" prop="unReceiptPaymentAmount" show-overflow-tooltip width="200" > <template #default="{ row, column }"> <el-text type="danger"> {{ formattedNumber(row, column, row.unReceiptPaymentAmount) }} </el-text> </template> </el-table-column> </el-table> </div> </div> <el-row :gutter="20"> <el-col :span="12"> <div class="table_list" style="width: 100%"> <el-table :data="tableData" border v-loading="tableLoading" :row-key="(row) => row.customerId" show-summary :summary-method="summarizeMainTable" @row-click="rowClickMethod" highlight-current-row height="calc(100vh - 18.5em)"> <el-table-column align="center" label="序号" type="index" width="60" /> <el-table-column label="客户名称" prop="customerName" show-overflow-tooltip width="200" /> <el-table-column label="合同金额(元)" prop="invoiceTotal" show-overflow-tooltip :formatter="formattedNumber" width="200" /> <el-table-column label="回款金额(元)" prop="receiptPaymentAmount" show-overflow-tooltip :formatter="formattedNumber" width="200" /> <el-table-column label="应收金额(元)" prop="unReceiptPaymentAmount" show-overflow-tooltip width="200"> <template #default="{ row, column }"> <el-text type="danger"> {{ formattedNumber(row, column, row.unReceiptPaymentAmount) }} </el-text> </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-col> <el-col :span="12"> <div class="table_list" style="width: 100%"> <el-table :data="receiptRecord" border :row-key="(row) => row.id" show-summary :summary-method="summarizeMainTable1" height="calc(100vh - 18.5em)"> <el-table-column align="center" label="序号" type="index" width="60" /> <el-table-column label="发生日期" prop="executionDate" show-overflow-tooltip width="110" /> <el-table-column label="销售合同号" prop="salesContractNo" show-overflow-tooltip width="200" /> <el-table-column label="合同金额(元)" prop="contractAmount" show-overflow-tooltip :formatter="formattedNumber" width="200" /> <el-table-column label="回款金额(元)" prop="receiptPaymentAmount" show-overflow-tooltip :formatter="formattedNumber" width="200" /> <el-table-column label="应收金额(元)" prop="receiptableAmount" show-overflow-tooltip width="200"> <template #default="{ row, column }"> <el-text type="danger"> {{ formattedNumber(row, column, row.receiptableAmount) }} </el-text> </template> </el-table-column> </el-table> <pagination v-show="recordTotal > 0" :total="recordTotal" layout="total, sizes, prev, pager, next, jumper" :page="recordPage.current" :limit="recordPage.size" @pagination="recordPaginationChange" /> </div> </el-col> </el-row> </div> </template> <script setup> import {onMounted, ref} from "vue"; import { invoiceLedgerSalesAccount } from "../../../api/salesManagement/invoiceLedger.js"; import { customerInteractions } from "../../../api/salesManagement/receiptPayment.js"; import Pagination from "../../../components/PIMTable/Pagination.vue"; const { proxy } = getCurrentInstance(); const tableData = ref([]); const receiptRecord = ref([]); const tableLoading = ref(false); const page = reactive({ current: 1, size: 100, }); const recordPage = reactive({ current: 1, size: 100, }); const total = ref(0); const recordTotal = ref(0); const data = reactive({ searchForm: { searchText: "", invoiceDate: "", }, }); const customerId = ref(""); const { searchForm } = toRefs(data); const originReceiptRecord = ref([]); // 查询列表 /** 搜索按钮操作 */ const handleQuery = () => { page.current = 1; getList(); }; const paginationChange = (obj) => { page.current = obj.page; page.size = obj.limit; getList(); }; const getList = () => { tableLoading.value = true; invoiceLedgerSalesAccount({ ...searchForm.value, ...page }).then((res) => { tableLoading.value = false; tableData.value = res.data.records; total.value = res.data.total; if (tableData.value.length > 0) { recordPage.current = 1; customerId.value = tableData.value[0].id; receiptPaymentList(customerId.value); } import { onMounted, ref, reactive, toRefs, getCurrentInstance } from "vue"; import { customewTransactions, customewTransactionsDetails, } from "@/api/salesManagement/indicatorStats.js"; import Pagination from "../../../components/PIMTable/Pagination.vue"; const { proxy } = getCurrentInstance(); const tableData = ref([]); const receiptRecord = ref([]); const tableLoading = ref(false); const page = reactive({ current: 1, size: 100, }); }; const formattedNumber = (row, column, cellValue) => { return parseFloat(cellValue).toFixed(2); }; // 主表合计方法 const summarizeMainTable = (param) => { return proxy.summarizeTable( param, ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"], { ticketsNum: { noDecimal: true }, // 不保留小数 futureTickets: { noDecimal: true }, // 不保留小数 } ); }; // 子表合计方法 const summarizeMainTable1 = (param) => { var summarizeTable = proxy.summarizeTable( param, ["invoiceAmount", "receiptAmount", "unReceiptAmount"], { ticketsNum: { noDecimal: true }, // 不保留小数 futureTickets: { noDecimal: true }, // 不保留小数 } ); // 取最后一行数据; if (receiptRecord.value?.length > 0) { const index = tableData.value.findIndex( (item) => item.id == customerId.value ); summarizeTable[summarizeTable.length - 1] = tableData.value[index].unReceiptPaymentAmount.toFixed(2); } else { summarizeTable[summarizeTable.length - 1] = 0.0; } return summarizeTable; }; const receiptPaymentList = (id) => { const param = { customerId: id, const recordPage = reactive({ current: 1, size: 100, }); const total = ref(0); const recordTotal = ref(0); const data = reactive({ searchForm: { searchText: "", invoiceDate: "", }, }); const customerId = ref(""); const { searchForm } = toRefs(data); const originReceiptRecord = ref([]); // 查询列表 /** 搜索按钮操作 */ const handleQuery = () => { page.current = 1; getList(); }; console.log("param", param); customerInteractions(param).then((res) => { originReceiptRecord.value = res.data; handlePagination({ page: 1, limit: recordPage.size }); recordTotal.value = res.data.length; const paginationChange = obj => { page.current = obj.page; page.size = obj.limit; getList(); }; const getList = () => { tableLoading.value = true; customewTransactions({ ...searchForm.value, ...page }).then(res => { tableLoading.value = false; tableData.value = res.data.records; total.value = res.data.total; if (tableData.value.length > 0) { recordPage.current = 1; customerId.value = tableData.value[0].customerId; receiptPaymentList(customerId.value); } }); }; const formattedNumber = (row, column, cellValue) => { return cellValue ? parseFloat(cellValue).toFixed(2) : "0.00"; }; // 主表合计方法 const summarizeMainTable = param => { return proxy.summarizeTable( param, ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"], { ticketsNum: { noDecimal: true }, // 不保留小数 futureTickets: { noDecimal: true }, // 不保留小数 } ); }; // 子表合计方法 const summarizeMainTable1 = param => { var summarizeTable = proxy.summarizeTable( param, ["contractAmount", "receiptPaymentAmount", "receiptableAmount"], { ticketsNum: { noDecimal: true }, // 不保留小数 futureTickets: { noDecimal: true }, // 不保留小数 } ); return summarizeTable; }; const receiptPaymentList = id => { const param = { customerId: id, current: recordPage.current, size: recordPage.size, }; customewTransactionsDetails(param).then(res => { if (Array.isArray(res.data)) { originReceiptRecord.value = res.data; recordTotal.value = res.data.length; handlePagination({ page: 1, limit: recordPage.size }); } else { receiptRecord.value = res.data.records; recordTotal.value = res.data.total; } }); }; // 汇款记录列表分页 const recordPaginationChange = pagination => { recordPage.current = pagination.page; recordPage.size = pagination.limit; receiptPaymentList(customerId.value); }; const rowClickMethod = row => { customerId.value = row.customerId; receiptPaymentList(customerId.value); }; const handlePagination = ({ page, limit }) => { recordPage.current = page; recordPage.size = limit; const start = (page - 1) * limit; const end = start + limit; receiptRecord.value = originReceiptRecord.value.slice(start, end); }; onMounted(() => { getList(); }); }; // 汇款记录列表分页 const recordPaginationChange = (pagination) => { handlePagination(pagination); }; const rowClickMethod = (row) => { customerId.value = row.id; receiptPaymentList(customerId.value); }; const handlePagination = ({ page, limit }) => { recordPage.current = page; recordPage.size = limit; const start = (page - 1) * limit; const end = start + limit; receiptRecord.value = originReceiptRecord.value.slice(start, end); }; onMounted(() => { getList(); }); </script> <style scoped lang="scss"> .table_list { width: 50%; } .table_list { width: 50%; } </style>