src/api/procurementManagement/invoiceEntry.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/procurementManagement/procurementLedger.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/salesManagement/invoiceLedger.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/salesManagement/receiptPayment.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/procurementManagement/invoiceEntry/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/procurementManagement/procurementLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/salesManagement/invoiceRegistration/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/salesManagement/receiptPayment/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/procurementManagement/invoiceEntry.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,51 @@ // éè´-æ¥ç¥¨ç»è®°æ¥å£ import request from '@/utils/request' // æ¥è¯¢éè´ååå· export function getProduct(query) { return request({ url: '/purchase/ledger/getProduct', method: 'get', params: query }) } // æ ¹æ®éè´ååå·æ¥è¯¢è¯¦ç»ä¿¡æ¯ export function getInfo(query) { return request({ url: '/purchase/ledger/getInfo', method: 'get', params: query }) } // 主å表æ¥è¯¢ export function gePurchaseList(query) { return request({ url: '/purchase/registration/list', method: 'get', params: query }) } // 主å表æ¥è¯¢ export function getRegistrationById(query) { return request({ url: '/purchase/registration/getRegistrationById', method: 'get', params: query }) } // æ°å¢ç¼è¾æ¥ç¥¨ç»è®° export function addOrUpdateRegistration(query) { return request({ url: '/purchase/registration/addOrUpdateRegistration', method: 'post', data: query }) } // å 餿¥ç¥¨ç»è®° export function delRegistration(query) { return request({ url: '/purchase/registration/delRegistration', method: 'delete', data: query }) } src/api/procurementManagement/procurementLedger.js
@@ -41,7 +41,7 @@ data: query }) } // å é¤ // æ¥è¯¢è¯¦æ export function getPurchaseById(query) { return request({ url: '/purchase/ledger/getPurchaseById', src/api/salesManagement/invoiceLedger.js
@@ -46,3 +46,12 @@ }) } // å¼ç¥¨å°è´¦é¨å乿¥è¯¢ export function invoiceLedgerListNoPage(query) { return request({ url: '/invoiceLedger/list', method: 'get', data: query }) } src/api/salesManagement/receiptPayment.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,38 @@ // å¼ç¥¨ç»è®°é¡µé¢æ¥å£ import request from '@/utils/request' // æ°å¢/ä¿®æ¹ export function receiptPaymentSaveOrUpdate(query) { return request({ url: '/receiptPayment/saveOrUpdate', method: 'post', data: query }) } // å页æ¥è¯¢ export function receiptPaymentListPage(query) { return request({ url: '/receiptPayment/listPage', method: 'get', params: query }) } // 详æ export function receiptPaymentInfo(query) { return request({ url: '/receiptPayment/info', method: 'get', params: query }) } // å é¤ export function receiptPaymentDel(query) { return request({ url: '/receiptPayment/del', method: 'delete', data: query }) } src/views/procurementManagement/invoiceEntry/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,413 @@ <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="openForm('add')">æ°å¢ç»è®°</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" /> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" /> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" /> <el-table-column label="æ¬æ¬¡æ¥ç¥¨æ°" prop="ticketsNum" /> <el-table-column label="æ¬æ¬¡æ¥ç¥¨éé¢(å )" prop="ticketsAmount" /> <el-table-column label="æªæ¥ç¥¨æ°" prop="futureTickets" /> <el-table-column label="æªæ¥ç¥¨éé¢(å )" prop="futureTicketsAmount" /> </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="businessPerson" show-overflow-tooltip/> <el-table-column label="项ç®åç§°" prop="projectName" show-overflow-tooltip/> <el-table-column label="ååéé¢(å )" prop="contractAmount" show-overflow-tooltip/> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button link 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="purchaseLedgerId"> <el-select v-model="form.purchaseLedgerId" placeholder="è¯·éæ©" clearable @change="setInfo"> <el-option v-for="item in purchaseLedgerList" :key="item.id" :label="item.purchaseContractNumber" :value="item.id"/> </el-select> </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="businessPersonId"> <el-select v-model="form.businessPersonId" placeholder="èªå¨å¡«å " clearable disabled> <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"/> </el-select> </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"> <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" /> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" /> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" /> <el-table-column label="æ¬æ¬¡æ¥ç¥¨æ°" prop="ticketsNum"> <template #default="scope"> <el-input :disabled="!scope.row.editFlag" v-model="scope.row.ticketsNum"></el-input> </template> </el-table-column> <el-table-column label="æ¬æ¬¡æ¥ç¥¨éé¢(å )" prop="ticketsAmount"> <template #default="scope"> <el-input :disabled="!scope.row.editFlag" v-model="scope.row.ticketsAmount"></el-input> </template> </el-table-column> <el-table-column label="æªæ¥ç¥¨æ°" prop="futureTickets"> <template #default="scope"> <el-input :disabled="!scope.row.editFlag" v-model="scope.row.futureTickets"></el-input> </template> </el-table-column> <el-table-column label="æªæ¥ç¥¨éé¢(å )" prop="futureTicketsAmount"> <template #default="scope"> <el-input :disabled="!scope.row.editFlag" v-model="scope.row.futureTicketsAmount"></el-input> </template> </el-table-column> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button v-if="!scope.row.editFlag" link type="primary" size="small" @click="openProductEdit(scope.row);">ç¼è¾</el-button> <el-button v-else link type="primary" size="small" @click="openProductEdit(scope.row);">ä¿å</el-button> </template> </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 { ref } from 'vue' import {ElMessageBox } from "element-plus"; import {userListNoPage} from "@/api/system/user.js"; import {productList} from "@/api/procurementManagement/procurementLedger.js"; 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: 10, }) const total = ref(0) const fileList = ref([]) import { addOrUpdateRegistration, delRegistration, gePurchaseList, getInfo, getProduct, getRegistrationById } from "@/api/procurementManagement/invoiceEntry.js"; // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') const dialogFormVisible = ref(false) const data = reactive({ searchForm: { purchaseContractNumber: '', }, form: { purchaseLedgerId: '', }, rules: { purchaseLedgerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], } }) const { searchForm, form, rules } = toRefs(data) // 产å表åå¼¹æ¡æ°æ® const productFormVisible = ref(false) const productOperationType = ref('') const currentId = ref('') // æ¥è¯¢å表 /** æç´¢æé®æä½ */ const handleQuery = () => { page.current = 1 getList() } const paginationChange = ({ current, limit }) => { page.current = current; page.size = limit; getList() } const getList = () => { tableLoading.value = true gePurchaseList({...searchForm.value, ...page}).then(res => { tableLoading.value = false tableData.value = res.rows tableData.value.map(item => { item.children = [] }) total.value = res.total expandedRowKeys.value = [] }).catch(() => { tableLoading.value = false }) } // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { selectedRows.value = selection } const productSelected = (selectedRows) => { productSelectedRows.value = selectedRows } const expandedRowKeys = ref([]) // å±å¼è¡ const expandChange = (row, expandedRows) => { if (expandedRows.length > 0) { expandedRowKeys.value = [] try { productList({salesLedgerId: row.purchaseLedgerId, type: 2}).then(res => { const index = tableData.value.findIndex(item => item.id === row.id); if (index > -1) { tableData.value[index].children = res.rows; } expandedRowKeys.value.push(row.id) }) } catch (error) { console.log(error) } } else { expandedRowKeys.value = [] } } // 主表åè®¡æ¹æ³ const summarizeMainTable = (param) => { const { columns, data } = param; const sums = []; columns.forEach((column, index) => { if (index === 0) { sums[index] = 'å计'; return; } const prop = column.property; if (['contractAmount'].includes(prop)) { const values = data.map(item => Number(item[prop])); if (!values.every(value => isNaN(value))) { sums[index] = values.reduce((acc, val) => (!isNaN(val) ? acc + val : acc), 0); } else { sums[index] = ''; } } else { sums[index] = ''; } }) return sums; }; // å表åè®¡æ¹æ³ const summarizeChildrenTable = (param) => { const { columns, data } = param; const sums = []; columns.forEach((column, index) => { if (index === 0) { sums[index] = 'å计'; return; } const prop = column.property; if (['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice', 'ticketsNum', 'ticketsAmount', 'futureTickets', 'futureTicketsAmount'].includes(prop)) { const values = data.map(item => Number(item[prop])); if (!values.every(value => isNaN(value))) { sums[index] = values.reduce((acc, val) => (!isNaN(val) ? acc + val : acc), 0); } else { sums[index] = ''; } } else { sums[index] = ''; } }); return sums; } // æå¼å¼¹æ¡ const openForm = (type, row) => { operationType.value = type form.value = {} productData.value = [] fileList.value = [] // æ¥è¯¢äººåå表 userListNoPage().then(res => { userList.value = res.data }) // æ¥è¯¢éè´ååå· getProduct().then(res => { purchaseLedgerList.value = res }) if (type === 'edit') { currentId.value = row.id; getRegistrationById({id: row.id}).then(res => { form.value = {...res} productData.value = form.value.productData if(form.value.salesLedgerFiles) { fileList.value = form.value.salesLedgerFiles } else { fileList.value = [] } }) } dialogFormVisible.value = true } // éæ©éè´ååå·èµå¼ const setInfo = (value) => { getInfo({id: value}).then(res => { form.value.salesContractNo = res.salesContractNo form.value.projectName = res.projectName productData.value = res.productData form.value.supplierName = res.supplierName form.value.businessPersonId = res.businessPersonId }) } // æäº¤è¡¨å 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 openProductEdit = (row) => { const index = productData.value.findIndex(item => item.id === row.id); if (index > -1) { productData.value[index].editFlag = !productData.value[index].editFlag } } // å¯¼åº 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("已忶") }) } getList() </script> <style scoped lang="scss"> </style> src/views/procurementManagement/procurementLedger/index.vue
@@ -50,7 +50,7 @@ <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="salesman" show-overflow-tooltip/> <el-table-column label="ä¸å¡å" prop="businessPerson" show-overflow-tooltip/> <el-table-column label="项ç®åç§°" prop="projectName" show-overflow-tooltip/> <el-table-column label="ååéé¢(å )" prop="contractAmount" show-overflow-tooltip/> <el-table-column label="å½å ¥äºº" prop="recorderName" show-overflow-tooltip/> @@ -94,8 +94,22 @@ </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="ä¸å¡åï¼" prop="businessPersonId"> <el-select v-model="form.businessPersonId" placeholder="è¯·éæ©" clearable @change="setPhone"> <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"/> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="çµè¯ï¼" prop="phoneNumber"> <el-input v-model="form.phoneNumber" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å½å ¥äººï¼" prop="recorderId"> <el-select v-model="form.recorderId" placeholder="è¯·éæ©" clearable> <el-select v-model="form.recorderId" placeholder="è¯·éæ©" clearable disabled> <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"/> </el-select> </el-form-item> @@ -103,6 +117,7 @@ <el-col :span="12"> <el-form-item label="å½å ¥æ¥æï¼" prop="entryDate"> <el-date-picker disabled style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD" @@ -289,6 +304,9 @@ }) const total = ref(0) const fileList = ref([]) import useUserStore from "@/store/modules/user" const userStore = useUserStore() // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') @@ -303,14 +321,18 @@ projectName: '', recorderId: '', entryDate: '', productData: [] productData: [], businessPersonId: '', phoneNumber: '', supplierName: '', }, rules: { purchaseContractNumber: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], salesLedgerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], projectName: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], recorderId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], entryDate: [{ required: true, message: "è¯·éæ©", trigger: "change" }], businessPersonId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], phoneNumber: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], supplierName: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], } }) const { searchForm, form, rules } = toRefs(data) @@ -349,6 +371,7 @@ // 设置ä¸ä¼ ç请æ±å¤´é¨ headers: { Authorization: "Bearer " + getToken() }, }) // æ¥è¯¢å表 /** æç´¢æé®æä½ */ @@ -460,6 +483,8 @@ getSalesNo().then(res => { salesContractList.value = res }) form.value.recorderId = userStore.id form.value.entryDate = getCurrentDate(); if (type === 'edit') { currentId.value = row.id; getPurchaseById({id: row.id, type: 2}).then(res => { @@ -473,6 +498,10 @@ }) } dialogFormVisible.value = true } // èµå¼çµè¯ const setPhone = (id) => { form.value.phoneNumber = userList.value.find(u => u.userId === id)?.phonenumber || ''; } // ä¸ä¼ åæ ¡æ£ function handleBeforeUpload(file) { @@ -565,6 +594,7 @@ } const submitProductEdit = () => { productForm.value.salesLedgerId = currentId.value productForm.value.type = 2 addOrUpdateSalesLedgerProduct(productForm.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeProductDia() @@ -657,6 +687,14 @@ proxy.$modal.msg("已忶") }) } // è·åå½åæ¥æå¹¶æ ¼å¼å为 YYYY-MM-DD function getCurrentDate() { const today = new Date(); const year = today.getFullYear(); const month = String(today.getMonth() + 1).padStart(2, '0'); // æä»½ä»0å¼å§ const day = String(today.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } getList() </script> src/views/salesManagement/invoiceRegistration/index.vue
@@ -130,7 +130,8 @@ </el-table-column> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button link type="primary" size="small" @click="openProductEdit('edit', scope.row);">ç¼è¾</el-button> <el-button v-if="!scope.row.editFlag" link type="primary" size="small" @click="openProductEdit(scope.row);">ç¼è¾</el-button> <el-button v-else link type="primary" size="small" @click="openProductEdit(scope.row);">ä¿å</el-button> </template> </el-table-column> </el-table> @@ -316,19 +317,17 @@ productData.value = form.value.productDtoList }) } // currentId.value = row.id; // getSalesLedgerWithProducts({id: row.id}).then(res => { // form.value = {...res} // productData.value = form.value.productData // }) // } dialogFormVisible.value = true } // æäº¤è¡¨å const submitForm = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { form.value.productDtoList = productData; form.value.productDtoList = proxy.HaveJson(productData.value) form.value.productDtoList.forEach(item => { item.id = '' }) delete form.value.productData invoiceRegistrationSaveOrUpdate(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeDia() @@ -343,7 +342,7 @@ dialogFormVisible.value = false } // æå¼äº§åå¼¹æ¡ const openProductEdit = (type, row) => { const openProductEdit = (row) => { const index = productData.value.findIndex(item => item.id === row.id); if (index > -1) { productData.value[index].editFlag = !productData.value[index].editFlag @@ -403,7 +402,6 @@ customerId: res.customerId, } productData.value = form.value.productData.map(item => { item.id = "" item.editFlag = false return item }) src/views/salesManagement/receiptPayment/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,334 @@ <template> <div class="app-container"> <div class="search_form"> <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> </div> <div> <el-button type="primary" @click="openForm('add')">æ°å¢å款</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" :row-key="row => row.id" show-summary :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)"> <el-table-column align="center" type="selection" width="55" /> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="éå®ååå·" prop="salesContractNo" show-overflow-tooltip/> <el-table-column label="客æ·ååå·" prop="customerContractNo" show-overflow-tooltip/> <el-table-column label="客æ·åç§°" prop="customerName" show-overflow-tooltip/> <el-table-column label="å票å·" prop="invoiceNo" show-overflow-tooltip/> <el-table-column label="å票éé¢(å )" prop="invoiceAmount" show-overflow-tooltip/> <el-table-column label="ç¨ç" prop="taxRate" show-overflow-tooltip/> <el-table-column label="æ¬æ¬¡å款éé¢(å )" prop="receiptPaymentAmount" show-overflow-tooltip/> <el-table-column label="忬¾å½¢å¼" prop="receiptPaymentType" show-overflow-tooltip> <template #default="scope"> {{transferValue(scope.row.receiptPaymentType)}} </template> </el-table-column> <el-table-column label="å¾ åæ¬¾éé¢(å )" prop="entryDate" show-overflow-tooltip/> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button link 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="70%" @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="invoiceLedgerId"> <el-select v-model="form.invoiceLedgerId" placeholder="è¯·éæ©" clearable @change="ledgerChange"> <el-option v-for="item in invoiceLedgerList" :key="item.id" :label="item.salesContractNo + '(' + item.invoiceDate + ')' " :value="item.id"/> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="客æ·åç§°ï¼" prop="customerName"> <el-input v-model="form.customerName" placeholder="èªå¨å¡«å " disabled /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å票å·ï¼" prop="invoiceNo"> <el-input v-model="form.invoiceNo" placeholder="èªå¨å¡«å " disabled/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å票éé¢(å )ï¼" prop="invoiceAmount"> <el-input type="number" v-model="form.invoiceAmount" placeholder="èªå¨å¡«å " :step="0.01" disabled/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="ç¨çï¼" prop="taxRate"> <el-input type="number" v-model="form.taxRate" placeholder="èªå¨å¡«å " :step="0.01" disabled/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="æ¬æ¬¡å款éé¢ï¼" prop="receiptPaymentAmount"> <el-input type="number" v-model="form.receiptPaymentAmount" placeholder="请è¾å ¥" :step="0.01" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="忬¾å½¢å¼ï¼" prop="receiptPaymentType"> <el-select v-model="form.receiptPaymentType" placeholder="è¯·éæ©" clearable> <el-option v-for="item in receipt_payment_type" :key="item.value" :label="item.label" :value="item.value"/> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ç»è®°äººï¼" prop="registrant"> <el-input v-model="form.registrant" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="æ¥æ¬¾æ¥æï¼" prop="receiptPaymentDate"> <el-date-picker style="width: 100%" v-model="form.receiptPaymentDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> </el-form-item> </el-col> </el-row> </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 { ref } from 'vue' import {ElMessageBox } from "element-plus"; import { invoiceLedgerListNoPage, invoiceLedgerDetail } from "../../../api/salesManagement/invoiceLedger.js"; import { receiptPaymentSaveOrUpdate, receiptPaymentListPage, receiptPaymentInfo, receiptPaymentDel } from "../../../api/salesManagement/receiptPayment.js"; const { proxy } = getCurrentInstance() const tableData = ref([]) const productData = ref([]) const selectedRows = ref([]) const tableLoading = ref(false) const page = reactive({ current: 1, size: 10, }) const total = ref(0) // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') const dialogFormVisible = ref(false) const data = reactive({ searchForm: { searchText: '', }, form: { invoiceLedgerId: '', customerName: '', invoiceNo: '', invoiceAmount: '', taxRate: '', receiptPaymentAmount: '', receiptPaymentType: '', registrant: '', receiptPaymentDate: '' }, rules: { invoiceLedgerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], customerName: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], invoiceNo: [{ required: true, message: "è¯·éæ©", trigger: "change" }], invoiceAmount: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], taxRate: [{ required: true, message: "è¯·éæ©", trigger: "change" }], receiptPaymentAmount: [{ required: true, message: "è¯·éæ©", trigger: "change" }], receiptPaymentType: [{ required: true, message: "è¯·éæ©", trigger: "change" }], registrant: [{ required: true, message: "è¯·éæ©", trigger: "change" }], receiptPaymentDate: [{ required: true, message: "è¯·éæ©", trigger: "change" }], } }) const { searchForm, form, rules } = toRefs(data) const currentId = ref('') // å¼ç¥¨å°è´¦æ°ç» const invoiceLedgerList = ref([]) const { receipt_payment_type } = proxy.useDict("receipt_payment_type") // æ¥è¯¢å表 /** æç´¢æé®æä½ */ const handleQuery = () => { page.current = 1 getList() } const paginationChange = ({ current, limit }) => { page.current = current; page.size = limit; getList() } const getList = () => { tableLoading.value = true receiptPaymentListPage({...searchForm.value, ...page}).then(res => { tableLoading.value = false tableData.value = res.data.records total.value = res.data.total }).catch(() => { tableLoading.value = false }) } // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { selectedRows.value = selection } // 主表åè®¡æ¹æ³ const summarizeMainTable = (param) => { const { columns, data } = param; const sums = []; columns.forEach((column, index) => { if (index === 0) { sums[index] = 'å计'; return; } const prop = column.property; if (['invoiceAmount','receiptPaymentAmount'].includes(prop)) { const values = data.map(item => Number(item[prop])); if (!values.every(value => isNaN(value))) { sums[index] = values.reduce((acc, val) => (!isNaN(val) ? acc + val : acc), 0); } else { sums[index] = ''; } } else { sums[index] = ''; } }) return sums; }; // æå¼å¼¹æ¡ const openForm = (type, row) => { operationType.value = type form.value = {} productData.value = [] invoiceLedgerListNoPage({}).then(res => { invoiceLedgerList.value = res.data }) if (type === 'edit') { currentId.value = row.id; receiptPaymentInfo({id: row.id}).then(res => { form.value = {...res.data} }) } dialogFormVisible.value = true } // æäº¤è¡¨å const submitForm = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { receiptPaymentSaveOrUpdate(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeDia() getList() }) } }) } // å ³éå¼¹æ¡ const closeDia = () => { proxy.resetForm("formRef") dialogFormVisible.value = false } // å é¤ 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(() => { receiptPaymentDel(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") getList() }) }).catch(() => { proxy.$modal.msg("已忶") }) } // éå®å°è´¦çé const ledgerChange = (val) => { console.log('val', val) if(val){ invoiceLedgerDetail({id: val}).then(res => { form.value.customerName = res.data.customerName, form.value.invoiceNo= res.data.invoiceNo, form.value.invoiceAmount= res.data.invoiceAmount, form.value.taxRate= res.data.taxRate, form.value.salesLedgerId= res.data.salesLedgerId, form.value.customerId= res.data.customerId, form.value.salesContractNo = res.data.salesContractNo }) }else { form.value.customerName = '', form.value.invoiceNo= '', form.value.invoiceAmount= '', form.value.taxRate= '', form.value.salesLedgerId= '', form.value.customerId= '', form.value.salesContractNo= '' } } // æ¶æ¬¾ç±»å«è½¬æ¢ const transferValue = (val) => { const findIndex = receipt_payment_type.value.findIndex(item => item.value === val); if (findIndex > -1) { return receipt_payment_type.value[findIndex].label } } getList() </script> <style scoped lang="scss"> </style>