src/api/procurementManagement/paymentEntry.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/procurementManagement/procurementInvoiceLedger.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/procurementManagement/procurementLedger.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/components/PIMTable/PIMTable.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/procurementManagement/invoiceEntry/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/procurementManagement/paymentEntry/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/procurementManagement/procurementInvoiceLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/procurementManagement/procurementLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/salesManagement/invoiceLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/salesManagement/salesLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/procurementManagement/paymentEntry.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,56 @@ // éè´ä»æ¬¾ç»è®°é¡µé¢æ¥å£ import request from '@/utils/request' // å页æ¥è¯¢ export function registrationList(query) { return request({ url: '/purchase/paymentRegistration/list', method: 'get', params: query }) } // æ¥è¯¢è¯¦æ export function registrationInfo(query) { return request({ url: '/purchase/paymentRegistration/' + query, method: 'get', }) } // æ ¹æ®éè´ååå·æ¥è¯¢è¯¦æ export function byPurchaseId(query) { return request({ url: '/purchase/paymentRegistration/byPurchaseId/' + query, method: 'get', }) } // æ¥è¯¢éè´ååå· export function getPurchaseNo() { return request({ url: '/purchase/ledger/getPurchaseNo', method: 'get', }) } // æ°å¢ export function paymentRegistrationAdd(query) { return request({ url: '/purchase/paymentRegistration', method: 'post', data: query }) } // ä¿®æ¹ export function paymentRegistrationEdit(query) { return request({ url: '/purchase/paymentRegistration', method: 'put', data: query }) } // å é¤ export function paymentRegistrationDel(query) { return request({ url: '/purchase/paymentRegistration/del', method: 'delete', data: query }) } src/api/procurementManagement/procurementInvoiceLedger.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,43 @@ // éè´-æ¥ç¥¨å°è´¦æ¥å£ import request from '@/utils/request' // æ¥è¯¢å表 export function invoiceList(query) { return request({ url: '/purchase/invoice/list', method: 'get', params: query }) } // æ¥è¯¢è¯¦æ export function getInvoiceById(query) { return request({ url: '/purchase/invoice/getInvoiceById', method: 'get', params: query }) } // æ°å¢ãç¼è¾ export function addOrUpdateInvoice(query) { return request({ url: '/purchase/invoice/addOrUpdateInvoice', method: 'post', data: query }) } // å é¤ export function delInvoice(query) { return request({ url: '/purchase/invoice/delInvoice', method: 'delete', data: query }) } // å é¤éä»¶ export function delCommonFile(query) { return request({ url: '/commonFile/delCommonFile', method: 'delete', data: query }) } src/api/procurementManagement/procurementLedger.js
@@ -48,4 +48,12 @@ method: 'get', params: query }) } // æ¥è¯¢è¯¦æ export function getOptions(query) { return request({ url: '/system/supplier/getOptions', method: 'get', params: query }) } src/components/PIMTable/PIMTable.vue
@@ -231,7 +231,7 @@ // æä»¶ä¸ä¼ åæ ¡éª const beforeUpload = (rawFile, index) => { currentFiles.value[index] = {} if (rawFile.size > 1024 * 1024 * 10) { if (rawfile.size > 1024 * 1024 * 10 * 10) { ElMessage.error('ä¸ä¼ æä»¶ä¸è¶ è¿10M') return false } src/views/procurementManagement/invoiceEntry/index.vue
@@ -71,7 +71,7 @@ <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-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> src/views/procurementManagement/paymentEntry/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,346 @@ <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> <el-button type="primary" @click="openForm('add')">æ°å¢ä»æ¬¾</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</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-input v-model="form.invoiceNumber" placeholder="èªå¨å¡«å " clearable disabled/> </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-input type="number" :step="0.01" v-model="form.taxRate" placeholder="èªå¨å¡«å " clearable disabled/> </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 {ElMessageBox } from "element-plus"; import {getInfo} from "@/api/login.js"; import useUserStore from "@/store/modules/user.js"; import { byPurchaseId, getPurchaseNo, paymentRegistrationAdd, paymentRegistrationDel, paymentRegistrationEdit, registrationInfo, registrationList } from "@/api/procurementManagement/paymentEntry.js"; const { proxy } = getCurrentInstance() const tableColumn = ref([ { label: 'éè´ååå·', prop: 'purchaseContractNumber', }, { label: 'éå®ååå·', prop: 'salesContractNo', }, { label: 'ä¾åºååç§°', prop: 'supplierName', }, { label: 'å票å·', prop: 'invoiceNumber' }, { label: 'å票éé¢(å )', prop: 'invoiceAmount' }, { label: 'ç¨ç(%)', prop: 'taxRate' }, { label: 'å¾ ä»æ¬¾éé¢(å )', prop: 'unPaymentAmount' }, { dataType: "action", label: "æä½", align: 'center', operation: [ { name: "ç¼è¾", type: "text", clickFun: (row) => { openForm('edit', row); }, }, ], }, ]) const tableData = ref([]) const selectedRows = ref([]) const tableLoading = ref(false) const purchaseLedgerList = ref([]) const userStore = useUserStore() const page = reactive({ current: 1, size: 10, }) const total = ref(0) // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') const dialogFormVisible = ref(false) const data = reactive({ searchForm: { supplierNameOrContractNo: '', }, form: { purchaseLedgerId: '', salesContractNo: '', supplierName: '', invoiceNumber: '', invoiceAmount: '', taxRate: '', currentPaymentAmount: '', paymentMethod: '', registrant: '', registrantId: '', paymentDate: '', }, rules: { purchaseLedgerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], currentPaymentAmount: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], paymentMethod: [{ required: true, message: "è¯·éæ©", trigger: "change" }], } }) 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 }) } // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { selectedRows.value = selection } // æå¼å¼¹æ¡ const openForm = (type, row) => { operationType.value = type form.value = {} // æ¥è¯¢éè´ååå· getPurchaseNo().then(res => { purchaseLedgerList.value = res }) form.value.registrantId = userStore.id form.value.registrant = userStore.name form.value.paymentDate = getCurrentDate(); if (type === 'edit') { registrationInfo(row.id).then(res => { form.value = {...res.data} }) } dialogFormVisible.value = true } // éæ©éè´ååå·èµå¼ const setInfo = (value) => { 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 = '' } } // æäº¤è¡¨å const submitForm = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { if (operationType.value === "edit") { submitEdit() } else { submitAdd() } } }) } // æäº¤æ°å¢ const submitAdd = () => { paymentRegistrationAdd(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeDia() getList() }) } // æäº¤ä¿®æ¹ const submitEdit = () => { paymentRegistrationEdit(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(() => { tableLoading.value = true paymentRegistrationDel(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") getList() }).finally(() => { tableLoading.value = false }) }).catch(() => { 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> <style scoped lang="scss"> </style> src/views/procurementManagement/procurementInvoiceLedger/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,495 @@ <template> <div class="app-container"> <div class="search_form"> <div> <span class="search_title">éè´ååå·ï¼</span> <el-input v-model="searchForm.purchaseContractNo" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable :prefix-icon="Search" /> <span class="search_title" style="margin-left: 10px">ä¾åºåï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable :prefix-icon="Search" /> <span class="search_title" style="margin-left: 10px">æ¥ç¥¨æ¥æï¼</span> <el-date-picker style="width: 240px" v-model="searchForm.issueDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> <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="purchaseContractNo" 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> <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" :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-input v-model="form.invoiceNumber" placeholder="请è¾å ¥" 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="请è¾å ¥" 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="请è¾å ¥" 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> <template #tip> <!-- æä»¶æ ¼å¼æ¯æ docï¼docxï¼xlsï¼xlsxï¼pptï¼pptxï¼pdfï¼txtï¼xmlï¼jpgï¼jpegï¼pngï¼gifï¼bmpï¼rarï¼zipï¼7z--> <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> <script setup> import pagination from '@/components/PIMTable/Pagination.vue' import { ref } from 'vue' import {Search} from "@element-plus/icons-vue"; import {ElMessageBox } from "element-plus"; 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({ searchForm: { purchaseContractNo: '', supplierName: '', issueDate:'' }, form: { purchaseLedgerId: '', salesLedgerId: '', customerId: '', invoiceNumber: '', invoiceAmount: '', taxRate: '', issUerId: '', issUer: '', issueDate: '', customerName:'', fileList:[] }, 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" }], } }) 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 handleQuery = () => { page.current = 1 getList() } const paginationChange = ({ current, limit }) => { page.current = current; page.size = limit; getList() } const getList = () => { tableLoading.value = true invoiceList({...searchForm.value, ...page}).then(res => { tableLoading.value = false tableData.value = res.rows; total.value = res.total; }) } // è¡¨æ ¼éæ©æ°æ® 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'].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 = [] 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) { console.log('handleRemove', file.id) 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 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 } ElMessageBox.confirm( 'éä¸çå 容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { delInvoice(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") getList() }) }).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> src/views/procurementManagement/procurementLedger/index.vue
@@ -82,8 +82,10 @@ </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="ä¾åºååç§°ï¼" prop="supplierName"> <el-input v-model="form.supplierName" placeholder="请è¾å ¥" clearable/> <el-form-item label="ä¾åºååç§°ï¼" prop="supplierId"> <el-select v-model="form.supplierId" placeholder="è¯·éæ©" clearable> <el-option v-for="item in supplierList" :key="item.id" :label="item.supplierName" :value="item.id"/> </el-select> </el-form-item> </el-col> <el-col :span="12"> @@ -288,7 +290,7 @@ delPurchase, getSalesNo, purchaseList, productList, getPurchaseById productList, getPurchaseById, getOptions } from "@/api/procurementManagement/procurementLedger.js"; const { proxy } = getCurrentInstance() const tableData = ref([]) @@ -297,6 +299,7 @@ const productSelectedRows = ref([]) const userList = ref([]) const salesContractList = ref([]) const supplierList = ref([]) const tableLoading = ref(false) const page = reactive({ current: 1, @@ -325,6 +328,7 @@ businessPersonId: '', phoneNumber: '', supplierName: '', supplierId: '', }, rules: { purchaseContractNumber: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], @@ -332,7 +336,7 @@ projectName: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], businessPersonId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], phoneNumber: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], supplierName: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], supplierId: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], } }) const { searchForm, form, rules } = toRefs(data) @@ -483,6 +487,9 @@ getSalesNo().then(res => { salesContractList.value = res }) getOptions().then(res => { supplierList.value = res.data }) form.value.recorderId = userStore.id form.value.entryDate = getCurrentDate(); if (type === 'edit') { @@ -506,7 +513,7 @@ // ä¸ä¼ åæ ¡æ£ function handleBeforeUpload(file) { // æ ¡æ£æä»¶å¤§å° if (file.size > 1024 * 1024) { if (file.size > 1024 * 1024 * 10) { proxy.$modal.msgError('ä¸ä¼ æä»¶å¤§å°ä¸è½è¶ è¿10MB!') return false } src/views/salesManagement/invoiceLedger/index.vue
@@ -2,7 +2,7 @@ <div class="app-container"> <div class="search_form"> <div> <span class="search_title">å¼ç¥¨å°è´¦ï¼</span> <span class="search_title">客æ·åç§°/ååå·ï¼</span> <el-input v-model="searchForm.searchText" style="width: 240px" @@ -11,16 +11,16 @@ clearable :prefix-icon="Search" /> <span class="search_title">å¼ç¥¨æ¥æï¼</span> <span class="search_title" style="margin-left: 10px">å¼ç¥¨æ¥æï¼</span> <el-date-picker style="width: 240px" v-model="form.invoiceDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> style="width: 240px" v-model="form.invoiceDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> @@ -46,7 +46,7 @@ <el-table-column label="ç¨ç" prop="taxRate" show-overflow-tooltip/> <el-table-column label="å¼ç¥¨äºº" prop="invoicePerson" show-overflow-tooltip/> <el-table-column label="å¼ç¥¨æ¥æ" prop="invoiceDate" show-overflow-tooltip/> <el-table-column label="å票" prop="invoiceDate" show-overflow-tooltip> <el-table-column label="å票" prop="invoiceFileName" show-overflow-tooltip> <template #default="scope"> <span v-if="scope.row.invoiceFileName">{{ scope.row.invoiceFileName }}</span> <el-button v-else link type="primary" @click="handleDownload(scope.row)">ä¸ä¼ </el-button> @@ -126,6 +126,8 @@ ref="fileUpload" auto-upload :headers="upload.headers" accept=".pdf" :limit="1" :before-upload="handleBeforeUpload" :on-error="handleUploadError" :on-success="handleUploadSuccess" @@ -161,6 +163,9 @@ ref="fileUpload" auto-upload :headers="upload.headers" accept=".pdf" :limit="1" :on-exceed="handleExceed" :before-upload="handleBeforeUpload" :on-error="handleUploadError" :on-success="handleUploadSuccess" @@ -168,9 +173,8 @@ > <el-button type="primary">ä¸ä¼ </el-button> <template #tip> <!-- æä»¶æ ¼å¼æ¯æ docï¼docxï¼xlsï¼xlsxï¼pptï¼pptxï¼pdfï¼txtï¼xmlï¼jpgï¼jpegï¼pngï¼gifï¼bmpï¼rarï¼zipï¼7z--> <div class="el-upload__tip"> æä»¶æ ¼å¼æ¯æ pdf æä»¶æ ¼å¼ä» æ¯æ pdf </div> </template> </el-upload> @@ -321,10 +325,17 @@ } dialogFormVisible.value = true } // ä¸ä¼ å¤ä¸ªæä»¶å°±è¦ç忥ç const handleExceed = (files) => { proxy.$refs["fileUpload"].clearFiles(); const file = files[0]; file.uid = genFileId(); proxy.$refs["fileUpload"].handleStart(file); }; // ä¸ä¼ åæ ¡æ£ function handleBeforeUpload(file) { // æ ¡æ£æä»¶å¤§å° if (file.size > 1024 * 1024) { if (file.size > 1024 * 1024 * 10) { proxy.$modal.msgError('ä¸ä¼ æä»¶å¤§å°ä¸è½è¶ è¿10MB!') return false } src/views/salesManagement/salesLedger/index.vue
@@ -483,7 +483,7 @@ // ä¸ä¼ åæ ¡æ£ function handleBeforeUpload(file) { // æ ¡æ£æä»¶å¤§å° if (file.size > 1024 * 1024) { if (file.size > 1024 * 1024 * 10) { proxy.$modal.msgError('ä¸ä¼ æä»¶å¤§å°ä¸è½è¶ è¿10MB!') return false }