.env.development | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
.env.production | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
.env.staging | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
index.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
package.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/procurementManagement/procurementLedger.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/salesManagement/invoiceLedger.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/salesManagement/salesLedger.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/layout/components/Navbar.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/procurementManagement/procurementLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/salesManagement/invoiceLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/salesManagement/invoiceRegistration/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/salesManagement/salesLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
.env.development
@@ -1,8 +1,8 @@ # 页颿 é¢ VITE_APP_TITLE = è¥ä¾ç®¡çç³»ç» VITE_APP_TITLE = MISç³»ç»ï¼ç®¡çä¿¡æ¯ç³»ç»ï¼ # å¼åç¯å¢é ç½® VITE_APP_ENV = 'development' # è¥ä¾ç®¡çç³»ç»/å¼åç¯å¢ # MISç³»ç»ï¼ç®¡çä¿¡æ¯ç³»ç»ï¼/å¼åç¯å¢ VITE_APP_BASE_API = '/dev-api' .env.production
@@ -1,10 +1,10 @@ # 页颿 é¢ VITE_APP_TITLE = è¥ä¾ç®¡çç³»ç» VITE_APP_TITLE = MISç³»ç»ï¼ç®¡çä¿¡æ¯ç³»ç»ï¼ # ç产ç¯å¢é ç½® VITE_APP_ENV = 'production' # è¥ä¾ç®¡çç³»ç»/ç产ç¯å¢ # MISç³»ç»ï¼ç®¡çä¿¡æ¯ç³»ç»ï¼/ç产ç¯å¢ VITE_APP_BASE_API = '/prod-api' # æ¯å¦å¨æå æ¶å¼å¯åç¼©ï¼æ¯æ gzip å brotli .env.staging
@@ -1,10 +1,10 @@ # 页颿 é¢ VITE_APP_TITLE = è¥ä¾ç®¡çç³»ç» VITE_APP_TITLE = MISç³»ç»ï¼ç®¡çä¿¡æ¯ç³»ç»ï¼ # ç产ç¯å¢é ç½® VITE_APP_ENV = 'staging' # è¥ä¾ç®¡çç³»ç»/ç产ç¯å¢ # MISç³»ç»ï¼ç®¡çä¿¡æ¯ç³»ç»ï¼/ç产ç¯å¢ VITE_APP_BASE_API = '/stage-api' # æ¯å¦å¨æå æ¶å¼å¯åç¼©ï¼æ¯æ gzip å brotli index.html
@@ -7,7 +7,7 @@ <meta name="renderer" content="webkit"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <link rel="icon" href="/favicon.ico"> <title>è¥ä¾ç®¡çç³»ç»</title> <title>MISç³»ç»ï¼ç®¡çä¿¡æ¯ç³»ç»ï¼</title> <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]--> <style> html, package.json
@@ -1,7 +1,7 @@ { "name": "ruoyi", "version": "3.8.9", "description": "è¥ä¾ç®¡çç³»ç»", "description": "MISç³»ç»ï¼ç®¡çä¿¡æ¯ç³»ç»ï¼", "author": "è¥ä¾", "license": "MIT", "type": "module", src/api/procurementManagement/procurementLedger.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,51 @@ // éè´å°è´¦é¡µé¢æ¥å£ import request from '@/utils/request' // å页æ¥è¯¢ export function purchaseList(query) { return request({ url: '/purchase/ledger/list', method: 'get', params: query }) } // æ¥è¯¢ååå· export function getSalesNo(query) { return request({ url: '/purchase/ledger/getSalesNo', method: 'get', params: query }) } // åè¡¨æ ¼æ¥è¯¢ export function productList(query) { return request({ url: '/sales/product/list', method: 'get', params: query }) } // æ°å¢ãç¼è¾ export function addOrEditPurchase(query) { return request({ url: '/purchase/ledger/addOrEditPurchase', method: 'post', data: query }) } // å é¤ export function delPurchase(query) { return request({ url: '/purchase/ledger/delPurchase', method: 'delete', data: query }) } // å é¤ export function getPurchaseById(query) { return request({ url: '/purchase/ledger/getPurchaseById', method: 'get', params: query }) } src/api/salesManagement/invoiceLedger.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,48 @@ // å¼ç¥¨å°è´¦é¡µé¢æ¥å£ import request from '@/utils/request' // å页æ¥è¯¢ export function invoiceLedgerList(query) { return request({ url: '/invoiceLedger/page', method: 'get', params: query }) } // æ°å¢ export function invoiceLedgerSaveOrUpdate(query) { return request({ url: '/invoiceLedger/saveOrUpdate', method: 'post', data: query }) } // å¼ç¥¨å°è´¦å é¤ export function invoiceLedgerDel(query) { return request({ url: '/invoiceLedger/del', method: 'delete', data: query }) } // è¯¦æ æ¥è¯¢ export function invoiceLedgerDetail(query) { return request({ url: '/invoiceLedger/info', method: 'get', params: query }) } // éä»¶æäº¤ export function commitFile(query) { return request({ url: '/invoiceLedger/commitFile', method: 'post', data: query }) } src/api/salesManagement/salesLedger.js
@@ -25,7 +25,7 @@ params: query }) } // æ°å¢ãä¿®æ¹æ¶æ¯å°è´¦ // æ°å¢ãä¿®æ¹éå®å°è´¦ export function addOrUpdateSalesLedger(query) { return request({ url: '/sales/ledger/addOrUpdateSalesLedger', @@ -33,7 +33,7 @@ data: query }) } // å 餿¶æ¯å°è´¦ // å é¤éå®å°è´¦ export function delLedger(query) { return request({ url: '/sales/ledger/delLedger', @@ -41,7 +41,7 @@ data: query }) } // æ¥è¯¢æ¶æ¯å°è´¦è¯¦æ // æ¥è¯¢éå®å°è´¦è¯¦æ export function getSalesLedgerWithProducts(query) { return request({ url: '/sales/ledger/getSalesLedgerWithProducts', src/layout/components/Navbar.vue
@@ -6,7 +6,7 @@ </div> <!-- <top-nav v-if="settingsStore.topNav" id="topmenu-container" class="topmenu-container" />--> <div class="center-menu"> <span class="label">ç³»ç»åç§°ç³»ç»åç§°</span> <span class="label">MISç³»ç»ï¼ç®¡çä¿¡æ¯ç³»ç»ï¼</span> </div> <div class="right-menu"> <div class="avatar-container"> src/views/index.vue
@@ -4,7 +4,7 @@ <el-col :sm="24" :lg="12" style="padding-left: 20px"> <h2>è¥ä¾åå°ç®¡çæ¡æ¶</h2> <p> ä¸ç´æ³å䏿¬¾åå°ç®¡çç³»ç»ï¼çäºå¾å¤ä¼ç§ç弿ºé¡¹ç®ä½æ¯åç°æ²¡æåéèªå·±çãäºæ¯å©ç¨ç©ºé²ä¼æ¯æ¶é´å¼å§èªå·±åä¸å¥åå°ç³»ç»ã妿¤æäºè¥ä¾ç®¡çç³»ç»ï¼å¥¹å¯ä»¥ç¨äºææçWebåºç¨ç¨åºï¼å¦ç½ç«ç®¡çåå°ï¼ç½ç«ä¼åä¸å¿ï¼CMSï¼CRMï¼OAççï¼å½ç¶ï¼æ¨ä¹å¯ä»¥å¯¹å¥¹è¿è¡æ·±åº¦å®å¶ï¼ä»¥ååºæ´å¼ºç³»ç»ãææå端åå°ä»£ç å°è£ è¿åååç²¾ç®æä¸æï¼åºéæ¦çä½ãåæ¶æ¯æç§»å¨å®¢æ·ç«¯è®¿é®ãç³»ç»ä¼éç»æ´æ°ä¸äºå®ç¨åè½ã ä¸ç´æ³å䏿¬¾åå°ç®¡çç³»ç»ï¼çäºå¾å¤ä¼ç§ç弿ºé¡¹ç®ä½æ¯åç°æ²¡æåéèªå·±çãäºæ¯å©ç¨ç©ºé²ä¼æ¯æ¶é´å¼å§èªå·±åä¸å¥åå°ç³»ç»ã妿¤æäºMISç³»ç»ï¼ç®¡çä¿¡æ¯ç³»ç»ï¼ï¼å¥¹å¯ä»¥ç¨äºææçWebåºç¨ç¨åºï¼å¦ç½ç«ç®¡çåå°ï¼ç½ç«ä¼åä¸å¿ï¼CMSï¼CRMï¼OAççï¼å½ç¶ï¼æ¨ä¹å¯ä»¥å¯¹å¥¹è¿è¡æ·±åº¦å®å¶ï¼ä»¥ååºæ´å¼ºç³»ç»ãææå端åå°ä»£ç å°è£ è¿åååç²¾ç®æä¸æï¼åºéæ¦çä½ãåæ¶æ¯æç§»å¨å®¢æ·ç«¯è®¿é®ãç³»ç»ä¼éç»æ´æ°ä¸äºå®ç¨åè½ã </p> <p> <b>å½åçæ¬:</b> <span>v{{ version }}</span> src/views/procurementManagement/procurementLedger/index.vue
@@ -2,14 +2,14 @@ <div class="app-container"> <div class="search_form"> <div> <span class="search_title">客æ·åç§°ï¼</span> <span class="search_title">éè´ååå·ï¼</span> <el-input v-model="searchForm.customerName" v-model="searchForm.purchaseContractNumber" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable :prefix-icon="Search" prefix-icon="Search" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> @@ -47,13 +47,13 @@ </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="customerContractNo" show-overflow-tooltip/> <el-table-column label="客æ·åç§°" prop="customerName" 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="projectName" show-overflow-tooltip/> <el-table-column label="ååéé¢(å )" prop="contractAmount" show-overflow-tooltip/> <el-table-column label="å½å ¥äºº" prop="entryPerson" show-overflow-tooltip/> <el-table-column label="å½å ¥äºº" prop="recorderName" show-overflow-tooltip/> <el-table-column label="å½å ¥æ¥æ" prop="entryDate" show-overflow-tooltip/> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> @@ -64,53 +64,42 @@ <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-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="salesContractNo"> <el-input v-model="form.salesContractNo" placeholder="èªå¨çæ" clearable disabled/> <el-form-item label="éè´ååå·ï¼" prop="purchaseContractNumber"> <el-input v-model="form.purchaseContractNumber" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ä¸å¡åï¼" prop="salesman"> <el-select v-model="form.salesman" placeholder="è¯·éæ©" clearable> <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/> <el-form-item label="éå®ååå·ï¼" prop="salesLedgerId"> <el-select v-model="form.salesLedgerId" placeholder="è¯·éæ©" clearable> <el-option v-for="item in salesContractList" :key="item.id" :label="item.salesContractNo" :value="item.id"/> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="客æ·ååå·ï¼" prop="customerContractNo"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable/> <el-form-item label="ä¾åºååç§°ï¼" prop="supplierName"> <el-input v-model="form.supplierName" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="客æ·åç§°ï¼" prop="customerId"> <el-select v-model="form.customerId" placeholder="è¯·éæ©" clearable> <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id"> {{item.customerName + 'ââ' + item.taxpayerIdentificationNumber}} </el-option> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="项ç®åç§°ï¼" prop="projectName"> <el-input v-model="form.projectName" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å½å ¥äººï¼" prop="entryPerson"> <el-select v-model="form.entryPerson" placeholder="è¯·éæ©" clearable> <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/> <el-form-item label="å½å ¥äººï¼" prop="recorderId"> <el-select v-model="form.recorderId" placeholder="è¯·éæ©" clearable> <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 :gutter="30"> <el-col :span="12"> <el-form-item label="å½å ¥æ¥æï¼" prop="entryDate"> <el-date-picker @@ -157,7 +146,7 @@ </el-row> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="éä»¶ææÂ·ï¼" prop="remark"> <el-form-item label="éä»¶ææï¼" prop="remark"> <el-upload v-model:file-list="fileList" :action="upload.url" @@ -277,19 +266,22 @@ import {ElMessageBox } from "element-plus"; import {userListNoPage} from "@/api/system/user.js"; import { ledgerList, productList, customerList, addOrUpdateSalesLedger, getSalesLedgerWithProducts, delLedger, addOrUpdateSalesLedgerProduct, delProduct, delLedgerFile getSalesLedgerWithProducts, addOrUpdateSalesLedgerProduct, delProduct, delLedgerFile } from "@/api/salesManagement/salesLedger.js"; import { addOrEditPurchase, delPurchase, getSalesNo, purchaseList, productList, getPurchaseById } from "@/api/procurementManagement/procurementLedger.js"; const { proxy } = getCurrentInstance() const tableData = ref([]) const productData = ref([]) const selectedRows = ref([]) const productSelectedRows = ref([]) const userList = ref([]) const customerOption = ref([]) const salesContractList = ref([]) const tableLoading = ref(false) const page = reactive({ current: 1, @@ -303,25 +295,21 @@ const dialogFormVisible = ref(false) const data = reactive({ searchForm: { customerName: '', purchaseContractNumber: '', }, form: { salesContractNo: '', salesman: '', customerContractNo: '', customerId: '', purchaseContractNumber: '', salesLedgerId: '', projectName: '', entryPerson: '', recorderId: '', entryDate: '', maintenanceTime: '', productData: [] }, rules: { salesman: [{ required: true, message: "è¯·éæ©", trigger: "change" }], customerContractNo: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], customerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], purchaseContractNumber: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], salesLedgerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], projectName: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], entryPerson: [{ required: true, message: "è¯·éæ©", trigger: "change" }], recorderId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], entryDate: [{ required: true, message: "è¯·éæ©", trigger: "change" }], } }) @@ -375,13 +363,16 @@ } const getList = () => { tableLoading.value = true ledgerList({...searchForm.value, ...page}).then(res => { purchaseList({...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 }) } // è¡¨æ ¼éæ©æ°æ® @@ -397,7 +388,7 @@ if (expandedRows.length > 0) { expandedRowKeys.value = [] try { productList({salesLedgerId: row.id}).then(res => { productList({salesLedgerId: row.id, type: 2}).then(res => { const index = tableData.value.findIndex(item => item.id === row.id); if (index > -1) { tableData.value[index].children = res.rows; @@ -462,18 +453,23 @@ operationType.value = type form.value = {} productData.value = [] fileList.value = [] userListNoPage().then(res => { userList.value = res.data }) customerList().then(res => { customerOption.value = res getSalesNo().then(res => { salesContractList.value = res }) if (type === 'edit') { currentId.value = row.id; getSalesLedgerWithProducts({id: row.id}).then(res => { getPurchaseById({id: row.id, type: 2}).then(res => { form.value = {...res} productData.value = form.value.productData fileList.value = form.value.salesLedgerFiles if(form.value.salesLedgerFiles) { fileList.value = form.value.salesLedgerFiles } else { fileList.value = [] } }) } dialogFormVisible.value = true @@ -506,11 +502,10 @@ } // ç§»é¤æä»¶ function handleRemove (file) { console.log('handleRemove', file) console.log('operationType.value', operationType.value) console.log('handleRemove', file.id) if (operationType.value === 'edit') { let ids = [] ids.push(file.value.id) ids.push(file.id) delLedgerFile(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") }) @@ -531,7 +526,8 @@ tempFileIds = fileList.value.map(item => item.tempId) } form.value.tempFileIds = tempFileIds addOrUpdateSalesLedger(form.value).then(res => { form.value.type = 2 addOrEditPurchase(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeDia() getList() @@ -572,7 +568,7 @@ addOrUpdateSalesLedgerProduct(productForm.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeProductDia() getSalesLedgerWithProducts({id: currentId.value}).then(res => { getPurchaseById({id: currentId.value, type: 2}).then(res => { productData.value = res.productData }) }) @@ -606,7 +602,7 @@ delProduct(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") closeProductDia() getSalesLedgerWithProducts({id: currentId.value}).then(res => { getSalesLedgerWithProducts({id: currentId.value, type: 2}).then(res => { productData.value = res.productData }) }) @@ -631,7 +627,7 @@ type: 'warning', } ).then(() => { proxy.download("/sales/ledger/export", {}, 'éå®å°è´¦.xlsx') proxy.download("/purchase/ledger/export", {}, 'éè´å°è´¦.xlsx') }).catch(() => { proxy.$modal.msg("已忶") }) @@ -653,7 +649,7 @@ type: 'warning', } ).then(() => { delLedger(ids).then(res => { delPurchase(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") getList() }) src/views/salesManagement/invoiceLedger/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,471 @@ <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" /> <span class="search_title">å¼ç¥¨æ¥æï¼</span> <el-date-picker 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> <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="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="invoicePerson" show-overflow-tooltip/> <el-table-column label="å¼ç¥¨æ¥æ" prop="invoiceDate" show-overflow-tooltip/> <el-table-column label="å票" prop="invoiceDate" 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> </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="salesLedgerId"> <el-select v-model="form.salesLedgerId" placeholder="è¯·éæ©" clearable @change="ledgerChange" :disabled="operationType === 'edit'"> <el-option v-for="item in ledgerList" :key="item.id" :label="item.salesContractNo" :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="èªå¨å¡«å " clearable :disabled="operationType === 'edit'"/> </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="请è¾å ¥" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å票éé¢(å )ï¼" prop="invoiceAmount"> <el-input type="number" :step="0.01" v-model="form.invoiceAmount" placeholder="请è¾å ¥" clearable/> </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" :step="0.01" v-model="form.taxRate" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å¼ç¥¨äººï¼" prop="invoicePerson"> <el-input v-model="form.invoicePerson" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å¼ç¥¨æ¥æï¼" prop="invoiceDate"> <el-date-picker style="width: 100%" v-model="form.invoiceDate" 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" :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> </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.url" multiple ref="fileUpload" auto-upload :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="uploadModal = false">åæ¶</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 { getSalesLedgerWithProducts, ledgerListNoPage } from "@/api/salesManagement/salesLedger.js"; import { getToken } from "@/utils/auth" import { invoiceLedgerList, invoiceLedgerDel, invoiceLedgerSaveOrUpdate, invoiceLedgerDetail, commitFile, } from "../../../api/salesManagement/invoiceLedger.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 operationType = ref('') const dialogFormVisible = ref(false) const data = reactive({ searchForm: { searchText: '', invoiceDate:'' }, form: { salesLedgerId: '', customerId: '', invoiceNo: '', invoiceAmount: '', taxRate: '', invoicePerson: '', invoiceDate: '', customerName:'', fileList:[] }, rules: { salesLedgerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], customerId: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], invoiceNo: [{ required: true, message: "è¯·éæ©", trigger: "change" }], invoiceAmount: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], taxRate: [{ required: true, message: "è¯·éæ©", trigger: "change" }], invoicePerson: [{ required: true, message: "è¯·éæ©", trigger: "change" }], invoiceDate: [{ 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 + "/invoiceLedger/uploadFile", // 设置ä¸ä¼ ç请æ±å¤´é¨ headers: { Authorization: "Bearer " + getToken() }, }) const matchFileType = ref(['pdf']) 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 invoiceLedgerList({...searchForm.value, ...page}).then(res => { tableLoading.value = false tableData.value = res.data.records; total.value = res.data.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 = [] // æ¥è¯¢éå®åå ledgerListNoPage({}).then(res => { ledgerList.value = res.data; }) if (type === 'edit') { currentId.value = row.id; invoiceLedgerDetail({id: row.id}).then(res => { form.value = {...res.data} fileList.value = res.data.fileList; }) } dialogFormVisible.value = true } // ä¸ä¼ åæ ¡æ£ function handleBeforeUpload(file) { // æ ¡æ£æä»¶å¤§å° if (file.size > 1024 * 1024) { proxy.$modal.msgError('ä¸ä¼ æä»¶å¤§å°ä¸è½è¶ è¿10MB!') return false } // 夿æä»¶æ ¼å¼æ¯å¦ç¬¦å const fileType = file.name.split('.').pop().toLowerCase(); if(!matchFileType.value.includes(fileType)) { proxy.$modal.msgError('æä»¶æ ¼å¼ä¸å¹é ') 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) { proxy.$refs["fileUpload"].handleRemove(file) fileList.value.push(res.data) proxy.$modal.msgSuccess("ä¸ä¼ æå") } else { proxy.$modal.msgError(res.msg) proxy.$refs.fileUpload.handleRemove(file) } } // ç§»é¤æä»¶ function handleRemove (file) { let index = fileList.value.findIndex(item => item.url === file.url) if(index > -1) { fileList.value.splice(index, 1) } } // æäº¤è¡¨å const submitForm = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { form.value.fileList = fileList.value; invoiceLedgerSaveOrUpdate(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("/invoiceLedger/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(() => { invoiceLedgerDel(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") getList() }) }).catch(() => { proxy.$modal.msg("已忶") }) } // éå®å°è´¦çé const ledgerChange = (val) => { if(val){ getSalesLedgerWithProducts({id: val}).then(res => { form.value = { salesLedgerId: res.id, customerName: res.customerName, customerId: res.customerId, salesContractNo: res.salesContractNo } }) }else { form.value.salesLedgerId = '' form.value.customerName = '' form.value.customerId = '' } } // æå¼éä»¶ä¸ä¼ å¼¹çª const handleDownload = (val) => { fileList.value = [] uploadModal.value = true currentId.value = val.id } // 确认æä»¶ä¸ä¼ const commiInvoicetFile = () => { const object = { fileList: fileList.value, id: currentId.value, } commitFile(object).then(res => { if (res.code === 200) { proxy.$modal.msgSuccess("æäº¤æå") uploadModal.value = false } getList(); currentId.value = '' fileList.value = [] }) } getList() </script> <style scoped lang="scss"> </style> src/views/salesManagement/invoiceRegistration/index.vue
@@ -161,7 +161,6 @@ invoiceRegistrationDel, productList, invoiceRegistrationDetail, invoiceRegistrationExport } from "@/api/salesManagement/invoiceRegistration.js"; const { proxy } = getCurrentInstance() const tableData = ref([]) src/views/salesManagement/salesLedger/index.vue
@@ -9,7 +9,7 @@ placeholder="请è¾å ¥" @change="handleQuery" clearable :prefix-icon="Search" prefix-icon="Search" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> @@ -105,7 +105,7 @@ <el-col :span="12"> <el-form-item label="å½å ¥äººï¼" prop="entryPerson"> <el-select v-model="form.entryPerson" placeholder="è¯·éæ©" clearable> <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/> <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"/> </el-select> </el-form-item> </el-col> @@ -157,7 +157,7 @@ </el-row> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="éä»¶ææÂ·ï¼" prop="remark"> <el-form-item label="éä»¶ææï¼" prop="remark"> <el-upload v-model:file-list="fileList" :action="upload.url" @@ -382,6 +382,8 @@ item.children = [] }) total.value = res.total }).catch(() => { tableLoading.value = false }) } // è¡¨æ ¼éæ©æ°æ® @@ -397,7 +399,7 @@ if (expandedRows.length > 0) { expandedRowKeys.value = [] try { productList({salesLedgerId: row.id}).then(res => { productList({salesLedgerId: row.id, type: 1}).then(res => { const index = tableData.value.findIndex(item => item.id === row.id); if (index > -1) { tableData.value[index].children = res.rows; @@ -470,7 +472,7 @@ }) if (type === 'edit') { currentId.value = row.id; getSalesLedgerWithProducts({id: row.id}).then(res => { getSalesLedgerWithProducts({id: row.id, type: 1}).then(res => { form.value = {...res} productData.value = form.value.productData fileList.value = form.value.salesLedgerFiles @@ -506,8 +508,6 @@ } // ç§»é¤æä»¶ function handleRemove (file) { console.log('handleRemove', file) console.log('operationType.value', operationType.value) if (operationType.value === 'edit') { let ids = [] ids.push(file.id) @@ -531,6 +531,7 @@ tempFileIds = fileList.value.map(item => item.tempId) } form.value.tempFileIds = tempFileIds form.value.type = 1 addOrUpdateSalesLedger(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeDia() @@ -572,7 +573,7 @@ addOrUpdateSalesLedgerProduct(productForm.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeProductDia() getSalesLedgerWithProducts({id: currentId.value}).then(res => { getSalesLedgerWithProducts({id: currentId.value, type: 1}).then(res => { productData.value = res.productData }) }) @@ -606,7 +607,7 @@ delProduct(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") closeProductDia() getSalesLedgerWithProducts({id: currentId.value}).then(res => { getSalesLedgerWithProducts({id: currentId.value, type: 1}).then(res => { productData.value = res.productData }) })