src/api/procurementManagement/paymentEntry.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/procurementManagement/procurementInvoiceLedger.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/procurementManagement/invoiceEntry/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/procurementManagement/paymentEntry/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/procurementManagement/paymentLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/procurementManagement/procurementInvoiceLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/procurementManagement/thePaymentLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/procurementManagement/paymentEntry.js
@@ -53,4 +53,12 @@ method: 'delete', data: query }) } // è·åå票å·åå票éé¢ export function getTicketNo(query){ return request({ url: "/purchase/registration/getTicketNo", method: "get", params: query }) } src/api/procurementManagement/procurementInvoiceLedger.js
@@ -40,4 +40,12 @@ method: 'delete', data: query }) } // åè¡¨æ ¼æ¥è¯¢ export function productRecordList(query){ return request({ url: '/purchase/registration/productRecordList', method: 'get', params: query }) } src/views/procurementManagement/invoiceEntry/index.vue
@@ -120,13 +120,17 @@ <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" /> <el-table-column label="æ¬æ¬¡æ¥ç¥¨æ°" prop="ticketsNum" width="170"> <template #default="scope"> <el-input-number v-model="scope.row.ticketsNum" :precision="0" :step="1" clearable style="width: 100%" @blur="invoiceNumBlur(scope.row)" /> <el-input-number v-model="scope.row.ticketsNum" placeholder="è¯·éæ©" :precision="0" :step="1" clearable style="width: 100%" @change="invoiceNumBlur(scope.row)" /> </template> </el-table-column> <el-table-column label="æ¬æ¬¡æ¥ç¥¨éé¢(å )" prop="ticketsAmount" :formatter="formattedNumber"></el-table-column> <el-table-column label="æ¬æ¬¡æ¥ç¥¨éé¢(å )" prop="ticketsAmount" :formatter="formattedNumber"> <template #default="scope"> {{ scope.row.ticketsAmount || 0 }} </template> </el-table-column> <el-table-column label="æªæ¥ç¥¨æ°" prop="futureTickets" :formatter="(row) => row.futureTickets == null || row.futureTickets === '' ? row.quantity : row.futureTickets"> : ="(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)"> @@ -188,9 +192,13 @@ purchaseLedgerNo: '', issUerId: '', // å¼ç¥¨äººid issUer: '' ,// å¼ç¥¨äººå§å invoiceNumber:"", // åç¥¨å· invoiceAmount:"", // å票éé¢ }, rules: { purchaseLedgerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], invoiceNumber: [{ required: true, message: '请è¾å ¥å票å·' , trigger: 'blur' },{type:"string"}], invoiceAmount: [{ required: true, message: '请è¾å ¥å票éé¢' , trigger: 'blur'}], } }) const { searchForm, form, rules } = toRefs(data) @@ -279,6 +287,7 @@ // æå¼å¼¹æ¡ const openForm = (type, row) => { invoiceNumBlur(row) operationType.value = type form.value = {} productData.value = [] @@ -396,8 +405,8 @@ } //æ¬æ¬¡å¼ç¥¨å¤±ç¦æä½ const invoiceNumBlur = (row) => { if (!row.ticketsNum) { row.ticketsNum = 0 if (!row.ticketsNum || row.ticketsNum === '') { row.ticketsNum = 0 } if (Number(row.ticketsNum) > Number(row.futureTickets)) { proxy.$modal.msgWarning('æ¬æ¬¡å¼ç¥¨æ°ä¸å¾å¤§äºæªå¼ç¥¨æ°') src/views/procurementManagement/paymentEntry/index.vue
@@ -46,7 +46,9 @@ </el-col> <el-col :span="12"> <el-form-item label="å票å·ï¼" prop="invoiceNumber"> <el-input v-model="form.invoiceNumber" placeholder="èªå¨å¡«å " clearable disabled/> <el-select v-model="form.invoiceNumber" placeholder="è¯·éæ©" clearable :disabled="operationType === 'edit'" @change="setInvoiceAmount"> <el-option v-for="item in invoiceNumberList" :key="item.id" :label="item.invoiceNumber" :value="item.invoiceNumber"/> </el-select> </el-form-item> </el-col> </el-row> @@ -58,7 +60,10 @@ </el-col> <el-col :span="12"> <el-form-item label="ç¨ç(%)ï¼" prop="taxRate"> <el-input type="number" :step="0.01" v-model="form.taxRate" placeholder="èªå¨å¡«å " clearable disabled/> <!-- <el-input type="number" :step="0.01" v-model="form.taxRate" placeholder="èªå¨å¡«å " clearable/> --> <el-select v-model="form.taxRate" placeholder="è¯·éæ©" clearable :disabled="operationType === 'edit'"> <el-option v-for="item in taxRateSelection" :key="item.value" :label="item.label" :value="item.value"/> </el-select> </el-form-item> </el-col> </el-row> @@ -98,6 +103,13 @@ </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="ç»è®°æ¥æï¼" prop="registrationtDate"> <el-input v-model="form.registrationtDate" placeholder="请è¾å ¥" clearable disabled/> </el-form-item> </el-col> </el-row> </el-form> <template #footer> <div class="dialog-footer"> @@ -121,10 +133,18 @@ paymentRegistrationAdd, paymentRegistrationDel, paymentRegistrationEdit, registrationInfo, registrationList registrationList, getTicketNo } from "@/api/procurementManagement/paymentEntry.js"; const { proxy } = getCurrentInstance() const taxRateSelection = [ { value: '0', label: '0%' }, { value: '3', label: '3%' }, { value: '6', label: '6%' }, { value: '9', label: '9%' }, { value: '13', label: '13%' }, { value: '17', label: '17%' }, ] const tableColumn = ref([ { label: 'éè´ååå·', @@ -145,10 +165,6 @@ { label: 'å票éé¢(å )', prop: 'invoiceAmount' }, { label: 'ç¨ç(%)', prop: 'taxRate' }, { label: 'å¾ ä»æ¬¾éé¢(å )', @@ -173,6 +189,7 @@ const selectedRows = ref([]) const tableLoading = ref(false) const purchaseLedgerList = ref([]) const invoiceNumberList = ref([]) const userStore = useUserStore() const page = reactive({ current: 1, @@ -199,11 +216,13 @@ registrant: '', registrantId: '', paymentDate: '', registrationtDate:"", }, rules: { purchaseLedgerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], currentPaymentAmount: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], paymentMethod: [{ required: true, message: "è¯·éæ©", trigger: "change" }], invoiceNumber: [{ required: true, message: "è¯·éæ©éè´ååå·", trigger: "change" }], } }) const { searchForm, form, rules } = toRefs(data) @@ -235,36 +254,52 @@ const openForm = (type, row) => { operationType.value = type form.value = {} invoiceNumberList.value = [] // æ¥è¯¢éè´ååå· getPurchaseNo().then(res => { purchaseLedgerList.value = res }) form.value.registrantId = userStore.id form.value.registrant = userStore.name form.value.registrationtDate = getCurrentDate(); form.value.paymentDate = getCurrentDate(); form.value.registrant = userStore.name if (type === 'edit') { registrationInfo(row.id).then(res => { form.value = {...res.data} if(form.value.registrantId == userStore.id){ form.value.registrant = userStore.name } }) } dialogFormVisible.value = true } // éæ©å票å·ä»¥åç»å票éé¢èµå¼ const setInvoiceAmount = (value) => { if (value) { invoiceNumberList.value.forEach(item => { if (item.invoiceNumber === value) { form.value.invoiceAmount = item.invoiceAmount form.value.ticketRegistrationId = item.id } }) } else { form.value.invoiceAmount = '' } } // éæ©éè´ååå·èµå¼ const setInfo = (value) => { getTicketNo().then((res)=>{ invoiceNumberList.value = res.data }) if (value) { byPurchaseId(value).then(res => { form.value.salesContractNo = res.data.salesContractNo form.value.supplierName = res.data.supplierName form.value.invoiceNumber = res.data.invoiceNumber form.value.invoiceAmount = res.data.invoiceAmount form.value.taxRate = res.data.taxRate form.value.supplierId = res.data.supplierId }) } else { form.value.salesContractNo = '' form.value.supplierName = '' form.value.invoiceNumber = '' form.value.invoiceAmount = '' form.value.taxRate = '' form.value.supplierId = '' } src/views/procurementManagement/paymentLedger/index.vue
@@ -2,111 +2,198 @@ <div class="app-container"> <div class="search_form"> <div> <span class="search_title">ä¾åºåæ¡£æ¡ï¼</span> <span class="search_title">仿¬¾å°è´¦ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="è¾å ¥ä¾åºååç§°æç´¢" @change="handleQuery" clearable :prefix-icon="Search" v-model="searchForm.supplierNameOrContractNo" style="width: 240px" placeholder="è¾å ¥ä¾åºååç§°" @change="handleQuery" clearable :prefix-icon="Search" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> <el-button type="primary" @click="handleQuery" style="margin-left: 10px" >æç´¢</el-button > </div> <div> </div> </div> <div class="table_list"> <PIMTable :column="tableColumn" :tableData="tableData" :page="page" :isShowSummary="true" style="width: 50%" :highlightCurrentRow="true" :tableLoading="tableLoading" @pagination="pagination" :total="total" :row-click="setTableData"></PIMTable> <PIMTable :column="tableColumn1" :tableData="tableData1" :isShowSummary="true" style="width: 50%"></PIMTable> </div> <el-row> <el-col :span="14"> <div class="table_list"> <PIMTable :column="tableColumn" :tableData="tableData" :page="page" :isSelection="false" :handleSelectionChange="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination" :total="total" :rowClick="rowClick" :isShowSummary="isShowSummary" :highlight-current-row="true" ></PIMTable> </div> </el-col> <el-col :span="10"> <div class="table_list"> <PIMTable :column="tableColumnSon" :tableData="tableDataSon" :page="pageSon" :isSelection="false" :tableLoading="tableLoadingSon" @pagination="paginationSon" :total="totalSon" :isShowSummary="isShowSummarySon" ></PIMTable> </div> </el-col> </el-row> </div> </template> <script setup> import { ref } from 'vue' import {Search} from "@element-plus/icons-vue"; import {paymentLedgerList} from "@/api/procurementManagement/paymentLedger.js"; import { ref, toRefs } from "vue"; import { Search } from "@element-plus/icons-vue"; import { paymentLedgerList } from "@/api/procurementManagement/paymentLedger.js"; const tableColumn = ref([ { label: 'ä¾åºååç§°', prop: 'supplierName', label: "ä¾åºååç§°", prop: "supplierName", }, { label: 'æ¥ç¥¨éé¢(å )', prop: 'invoiceAmount' label: "å票éé¢(å )", prop: "invoiceAmount", }, { label: '仿¬¾éé¢(å )', prop: 'paymentAmount' label: "仿¬¾éé¢(å )", prop: "paymentAmount", }, { label: 'åºä»æ¬¾éé¢(å )', prop: 'payableAmount' label: "åºä»éé¢(å )", prop: "payableAmount", }, ]) const tableColumn1 = ref([ { label: 'åçæ¥æ', prop: 'createTime', ]); const tableLoading = ref(false); const data = reactive({ searchForm: { supplierNameOrContractNo: "", }, { label: 'æ¥ç¥¨æ°', prop: 'voteCount' }, { label: '仿¬¾éé¢(å )', prop: 'paymentAmount' }, { label: 'åºä»æ¬¾éé¢(å )', prop: 'payableAmount' }, ]) const tableData = ref([]) const tableData1 = ref([]) const tableLoading = ref(false) }); const page = reactive({ current: 1, size: 10, }) const total = ref(0) }); const total = ref(0); const isShowSummary = ref(true); const tableData = ref([]); const { searchForm } = toRefs(data); // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const data = reactive({ searchForm: { supplierName: '', import {getInfo} from "@/api/login.js"; const rowClick = async (row) => { /* let res = await getInfo(row.id) if (res.code === 200) { proxy.$modal.msgSuccess("è·åæå") if(res.data == "" || res.data == null){ proxy.$modal.msgError("æ²¡ææ°æ®") return } rightShow.value = !rightShow.value form.value = res.data } else { proxy.$modal.msgError(res.msg) } */ tableDataSon.value.push(row); if(tableDataSon.value.length > 10) { tableDataSon.value = [] } } // 忍¡å const tableColumnSon = ref([ { label: "ä¾åºååç§°", prop: "supplierName", }, }) const { searchForm } = toRefs(data) { label: "å票éé¢(å )", prop: "invoiceAmount", }, { label: "仿¬¾éé¢(å )", prop: "paymentAmount", }, { label: "åºä»éé¢(å )", prop: "payableAmount", }, ]); const tableDataSon = ref([]); const tableLoadingSon = ref(false); const pageSon = reactive({ current: 1, size: 10, }); const totalSon = ref(0); const isShowSummarySon = ref(true); // æ¥è¯¢å表 /** æç´¢æé®æä½ */ const handleQuery = () => { page.current = 1 getList() } const setTableData = (data) => { tableData1.value = data.details } page.current = 1; getList(); }; const pagination = ({ current, limit }) => { page.current = current; page.size = limit; getList() } getList(); }; const paginationSon = ({ current, limit }) => { pageSon.current = current; pageSon.size = limit; getList(); }; const getList = () => { tableLoading.value = true paymentLedgerList({...searchForm.value, ...page}).then(res => { tableLoading.value = false tableData.value = res.data total.value = res.total }) } getList() tableLoading.value = false; paymentLedgerList({ ...searchForm.value, ...page }).then((res) => { let result = res.data tableLoading.value = false; tableData.value = result; total.value = result.total; }); }; // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { selectedRows.value = selection; }; getList(); </script> <style scoped lang="scss"> .table_list { display: flex; /* éä¸æè¡æ¶çèæ¯è²*/ /* .el-table__body tr.current-row > td { color: #c0c0c0; background: #F6F7FB !important; } */ .el-row { .el-col-14 { .table_list { padding-right: 0px; } } .el-col-10 { .table_list { padding-left: 0px; } } } </style> src/views/procurementManagement/procurementInvoiceLedger/index.vue
@@ -4,7 +4,7 @@ <div> <span class="search_title">éè´ååå·ï¼</span> <el-input v-model="searchForm.purchaseContractNo" v-model="searchForm.purchaseContractNumber" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" @@ -33,182 +33,44 @@ <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" :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="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="invoiceNumber" 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="issUer" show-overflow-tooltip/> <el-table-column label="å¼ç¥¨æ¥æ" prop="issueDate" show-overflow-tooltip/> <!-- <el-table-column label="å票" prop="fileName" show-overflow-tooltip> <template #default="scope"> <span v-if="scope.row.fileName">{{ scope.row.fileName }}</span> <el-button v-else link type="primary" @click="handleDownload(scope.row)">ä¸ä¼ </el-button> </template> </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="openForm('edit', scope.row);">ç¼è¾</el-button> </template> </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="openForm('check', scope.row);">æ¥ç</el-button> :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" label="åºå·" type="index" 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 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="invoiceNumber" show-overflow-tooltip /> <el-table-column label="ååéé¢(å )" prop="invoiceAmount" show-overflow-tooltip :formatter="formattedNumber" /> <el-table-column label="å¼ç¥¨äºº" prop="issUer" show-overflow-tooltip /> <el-table-column label="å¼ç¥¨æ¥æ" prop="issueDate" show-overflow-tooltip /> </el-table> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> <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="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="invoiceNumber"> <el-input v-model="form.invoiceNumber" placeholder="请è¾å ¥" :disabled="operationType === 'check'" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å票éé¢(å )ï¼" prop="invoiceAmount"> <el-input type="number" :step="0.01" v-model="form.invoiceAmount" placeholder="请è¾å ¥" :disabled="operationType === 'check'" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ç¨çï¼" prop="taxRate"> <el-input type="number" :step="0.01" v-model="form.taxRate" placeholder="请è¾å ¥" :disabled="operationType === 'check'" clearable/> </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 disabled style="width: 100%" v-model="form.issueDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> </el-form-item> </el-col> </el-row> <!-- <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="éä»¶ææï¼" prop="remark"> <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload :headers="upload.headers" accept=".pdf" :limit="1" :data="{ type: 3 }" :before-upload="handleBeforeUpload" :on-error="handleUploadError" :on-success="handleUploadSuccess" :on-remove="handleRemove" > <el-button type="primary">ä¸ä¼ </el-button> <template #tip> <div class="el-upload__tip"> æä»¶æ ¼å¼ä» æ¯æ pdf </div> </template> </el-upload> </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> <el-dialog title="ä¸ä¼ å¼¹çª" width="20%" v-model="uploadModal"> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="éä»¶ææï¼" prop="remark"> <el-upload v-model:file-list="fileList" :action="upload.url1" multiple ref="fileUpload" auto-upload accept=".pdf" :limit="1" :data="{ type: 3,id: currentId }" :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError" :on-success="handleUploadSuccess" :on-remove="handleRemove" > <el-button type="primary">ä¸ä¼ </el-button> <!-- æä»¶æ ¼å¼æ¯æ docï¼docxï¼xlsï¼xlsxï¼pptï¼pptxï¼pdfï¼txtï¼xmlï¼jpgï¼jpegï¼pngï¼gifï¼bmpï¼rarï¼zipï¼7z--> <template #tip> <div class="el-upload__tip"> æä»¶æ ¼å¼æ¯æ pdf </div> </template> </el-upload> </el-form-item> </el-col> </el-row> <template #footer> <div class="dialog-footer"> <el-button @click="commiInvoicetFile" type="primary">确认</el-button> <el-button @click="commiInvoicetFile">åæ¶</el-button> </div> </template> </el-dialog> </div> </template> @@ -217,77 +79,38 @@ import { ref } from 'vue' import {Search} from "@element-plus/icons-vue"; import {ElMessageBox } from "element-plus"; import {productRecordList} from "@/api/procurementManagement/procurementInvoiceLedger.js"; import { delLedgerFile, ledgerListNoPage } from "@/api/salesManagement/salesLedger.js"; import { getToken } from "@/utils/auth" import {getProduct, getInfo} from "@/api/procurementManagement/invoiceEntry.js"; import useUserStore from "@/store/modules/user.js"; import { addOrUpdateInvoice, delCommonFile, delInvoice, getInvoiceById, invoiceList } from "@/api/procurementManagement/procurementInvoiceLedger.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 fileList = ref([]) const ledgerList = ref([]) const purchaseLedgerList = ref([]) const userStore = useUserStore() import { genFileId } from 'element-plus' // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') const dialogFormVisible = ref(false) const data = reactive({ const data = reactive({ searchForm: { purchaseContractNo: '', purchaseContractNumber: '', supplierName: '', issueDate:'' }, form: { issueDate:"",// å¼ç¥¨æ¥æ purchaseLedgerId: '', salesLedgerId: '', customerId: '', invoiceNumber: '', invoiceAmount: '', taxRate: '', issUerId: '', issUer: '', issueDate: '', customerName:'', fileList:[] purchaseLedgerNo: '', issUerId: '', // å¼ç¥¨äººid issUer: '' ,// å¼ç¥¨äººå§å }, // rules: { // purchaseLedgerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], // customerId: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], // invoiceNumber: [{ required: true, message: "è¯·éæ©", trigger: "change" }], // invoiceAmount: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], // taxRate: [{ required: true, message: "è¯·éæ©", trigger: "change" }], // issUer: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], // issueDate: [{ required: true, message: "è¯·éæ©", trigger: "change" }], // customerName: [{ required: true, message: "è¯·éæ©", trigger: "change" }], // } rules: { purchaseLedgerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], } }) const { searchForm, form, rules } = toRefs(data) const currentId = ref('') const upload = reactive({ // ä¸ä¼ çå°å url: import.meta.env.VITE_APP_BASE_API + "/file/upload", url1: import.meta.env.VITE_APP_BASE_API + "/purchase/invoice/upload", // 设置ä¸ä¼ ç请æ±å¤´é¨ headers: { Authorization: "Bearer " + getToken() }, }) const uploadModal = ref(false) const { searchForm } = toRefs(data) // æ¥è¯¢å表 /** æç´¢æé®æä½ */ const handleQuery = () => { @@ -301,199 +124,73 @@ } const getList = () => { tableLoading.value = true invoiceList({...searchForm.value, ...page}).then(res => { invoiceList({ ...searchForm.value, ...page }).then(res => { tableLoading.value = false tableData.value = res.rows; total.value = res.total; tableData.value = res.rows 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); }; // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { selectedRows.value = selection const expandedRowKeys = ref([]) // å±å¼è¡ const expandChange = (row, expandedRows) => { if (expandedRows.length > 0) { expandedRowKeys.value = [] try { productRecordList({ id: row.id }).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) => { const { columns, data } = param; const sums = []; columns.forEach((column, index) => { if (index === 0) { sums[index] = 'å计'; return; } const prop = column.property; if (['invoiceAmount'].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; return proxy.summarizeTable(param, ['invoiceAmount'], { ticketsNum: { noDecimal: true }, // ä¸ä¿çå°æ° futureTickets: { noDecimal: true }, // ä¸ä¿çå°æ° }); }; // ææ¥å¼¹æ¡ const openForm = (type, row) => { operationType.value = type form.value = {} productData.value = [] fileList.value = [] form.value.issUerId = userStore.id form.value.issUer = userStore.name form.value.issueDate = getCurrentDate(); // æ¥è¯¢éå®åå ledgerListNoPage({}).then(res => { ledgerList.value = res.data; }) // æ¥è¯¢éè´ååå· getProduct().then(res => { purchaseLedgerList.value = res }) if (type === 'edit') { currentId.value = row.id; getInvoiceById({id: row.id}).then(res => { form.value = {...res} fileList.value = res.commonFiles; }) } dialogFormVisible.value = true } // ä¸ä¼ åæ ¡æ£ function handleBeforeUpload(file) { // æ ¡æ£æä»¶å¤§å° if (file.size > 1024 * 1024 * 10) { proxy.$modal.msgError('ä¸ä¼ æä»¶å¤§å°ä¸è½è¶ è¿10MB!') return false } proxy.$modal.loading("æ£å¨ä¸ä¼ æä»¶ï¼è¯·ç¨å...") return true } // ä¸ä¼ 失败 function handleUploadError(err) { proxy.$modal.msgError("ä¸ä¼ æä»¶å¤±è´¥") proxy.$modal.closeLoading() } // ä¸ä¼ æååè° function handleUploadSuccess(res, file, uploadFiles) { proxy.$modal.closeLoading() if (res.code === 200) { file.tempId = res.data.tempId proxy.$modal.msgSuccess("ä¸ä¼ æå") } else { proxy.$modal.msgError(res.msg) proxy.$refs.fileUpload.handleRemove(file) } } // ç§»é¤æä»¶ function handleRemove (file) { if (operationType.value === 'edit') { let ids = [] ids.push(file.id) delCommonFile(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") }) } } // æäº¤è¡¨å const submitForm = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { let tempFileIds = [] if (fileList.value.length > 0) { tempFileIds = fileList.value.map(item => item.tempId) } form.value.tempFileIds = tempFileIds form.value.type = 3; addOrUpdateInvoice(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeDia() getList() }) } }) } // å ³éå¼¹æ¡ const closeDia = () => { proxy.resetForm("formRef") dialogFormVisible.value = false } // å表åè®¡æ¹æ³ const summarizeChildrenTable = (param) => { return proxy.summarizeTable(param, ['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice', 'ticketsNum', 'ticketsAmount', 'futureTickets', 'futureTicketsAmount'], { ticketsNum: { noDecimal: true }, // ä¸ä¿çå°æ° futureTickets: { noDecimal: true }, // ä¸ä¿çå°æ° }); }; // å¯¼åº const handleOut = () => { ElMessageBox.confirm( 'éä¸çå 容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { proxy.download("/purchase/invoice/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 'éä¸çå 容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ElMessageBox.confirm( 'éä¸çå 容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { delInvoice(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") getList() }) proxy.download("/purchase/registration/export", {}, 'æ¥ç¥¨ç»è®°.xlsx') }).catch(() => { proxy.$modal.msg("已忶") }) } // éæ©éè´ååå·èµå¼ 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 handleDownload = (val) => { fileList.value = [] uploadModal.value = true currentId.value = val.id } // 确认æä»¶ä¸ä¼ const commiInvoicetFile = () => { uploadModal.value = false getList(); } // è·åå½åæ¥æå¹¶æ ¼å¼å为 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> <style scoped lang="scss"> </style> <style scoped lang="scss"></style> src/views/procurementManagement/thePaymentLedger/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,184 @@ <template> <div class="app-container"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°/ååå·ï¼</span> <el-input v-model="searchForm.supplierNameOrContractNo" 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 class="table_list"> <PIMTable :column="tableColumn" :tableData="tableData" :page="page" :handleSelectionChange="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination" :total="total"></PIMTable> </div> <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢ä»æ¬¾ç»è®°' : 'ç¼è¾ä»æ¬¾ç»è®°'" width="60%" @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" :disabled="operationType === 'edit'"> <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="invoiceNumber"> <el-select v-model="form.invoiceNumber" placeholder="è¯·éæ©" clearable :disabled="operationType === 'edit'" @change="setInvoiceAmount"> <el-option v-for="item in invoiceNumberList" :key="item.id" :label="item.invoiceNumber" :value="item.invoiceNumber"/> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å票éé¢(å )ï¼" prop="invoiceAmount"> <el-input type="number" :step="0.01" v-model="form.invoiceAmount" placeholder="èªå¨å¡«å " clearable disabled/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ç¨ç(%)ï¼" prop="taxRate"> <el-select v-model="form.taxRate" placeholder="è¯·éæ©" clearable :disabled="operationType === 'edit'"> <el-option v-for="item in taxRateSelection" :key="item.value" :label="item.label" :value="item.value"/> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="æ¬æ¬¡ä»æ¬¾éé¢ï¼" prop="currentPaymentAmount"> <el-input type="number" :step="0.01" v-model="form.currentPaymentAmount" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="仿¬¾å½¢å¼ï¼" prop="paymentMethod"> <el-select v-model="form.paymentMethod" placeholder="è¯·éæ©" clearable> <el-option label="çµæ±" value="çµæ±"/> <el-option label="æ¿å " value="æ¿å "/> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="ç»è®°äººï¼" prop="registrant"> <el-input v-model="form.registrant" placeholder="请è¾å ¥" clearable disabled/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="仿¬¾æ¥æï¼" prop="paymentDate"> <el-date-picker disabled style="width: 100%" v-model="form.paymentDate" 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 { ref } from 'vue' import {Search} from "@element-plus/icons-vue"; import { registrationList, } from "@/api/procurementManagement/paymentEntry.js"; const tableColumn = ref([ { label: '仿¬¾æ¥æ', prop: 'paymentDate', }, { label: 'ä¾åºååç§°', prop: 'supplierName', }, { label: '仿¬¾éé¢', prop: 'currentPaymentAmount', }, { label: 'ç»è®°äºº', prop: 'registrant' }, { label: 'ç»è®°æ¥æ', prop: 'registrationtDate' }, ]) const tableData = ref([]) const tableLoading = ref(false) const purchaseLedgerList = ref([]) const invoiceNumberList = ref([]) const page = reactive({ current: 1, size: 10, }) const total = ref(0) // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') const dialogFormVisible = ref(false) const data = reactive({ searchForm: { supplierNameOrContractNo: '', }, }) const { searchForm, form, rules } = toRefs(data) // æ¥è¯¢å表 /** æç´¢æé®æä½ */ const handleQuery = () => { page.current = 1 getList() } const pagination = ({ current, limit }) => { page.current = current; page.size = limit; getList() } const getList = () => { tableLoading.value = true registrationList({...searchForm.value, ...page}).then(res => { tableLoading.value = false tableData.value = res.rows total.value = res.total }) } getList() </script> <style scoped lang="scss"> </style>