src/api/basicData/supplierManageFile.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/salesManagement/invoiceRegistration.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/salesManagement/salesLedger.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/components/PIMTable/PIMTable.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/basicData/supplierManage/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/procurementManagement/procurementLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/salesManagement/invoiceRegistration/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/salesManagement/salesLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/basicData/supplierManageFile.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,52 @@ // ä¾åºåæ¡£æ¡é¡µé¢æ¥å£ import request from '@/utils/request' // å页æ¥è¯¢ export function listSupplier(query) { return request({ url: '/system/supplier/listPage', method: 'get', params: query }) } // æ¥è¯¢ä¾åºåä¿¡æ¯è¯¦ç» export function getSupplier(id) { return request({ url: '/system/supplier/' + id, method: 'get' }) } // æ°å¢ä¾åºåä¿¡æ¯ export function addSupplier(data) { return request({ url: '/system/supplier/add', method: 'post', data: data }) } // ä¿®æ¹ä¾åºåä¿¡æ¯ export function updateSupplier(data) { return request({ url: '/system/supplier/update', method: 'post', data: data }) } // 导åºä¾åºåä¿¡æ¯ export function exportSupplier(query) { return request({ url: '/system/supplier/export', method: 'get', params: query, responseType: 'blob' }) } // å é¤ä¾åºåä¿¡æ¯ export function delSupplier(ids) { return request({ url: '/system/supplier/del', method: 'delete', data: ids }) } src/api/salesManagement/invoiceRegistration.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,54 @@ // éå®å°è´¦é¡µé¢æ¥å£ import request from '@/utils/request' // å页æ¥è¯¢ export function invoiceRegistrationList(query) { return request({ url: '/invoiceRegistration/listPage', method: 'get', params: query }) } // å¼ç¥¨ç»è®°æ°å¢ export function invoiceRegistrationSaveOrUpdate(query) { return request({ url: '/invoiceRegistration/saveOrUpdate', method: 'post', data: query }) } // å¼ç¥¨ç»è®°å é¤ export function invoiceRegistrationDel(query) { return request({ url: '/invoiceRegistration/del', method: 'delete', data: query }) } // åè¡¨æ ¼æ¥è¯¢ export function productList(query) { return request({ url: '/invoiceRegistration/productList', method: 'get', params: query }) } // å¼ç¥¨ç»è®°è¯¦æ export function invoiceRegistrationDetail(query) { return request({ url: '/invoiceRegistration/detail', method: 'get', params: query }) } // 导åºå¼ç¥¨ç»è®° export function invoiceRegistrationExport(query) { return request({ url: '/invoiceRegistration/export', method: 'get', params: query, responseType: 'blob' }) } src/api/salesManagement/salesLedger.js
@@ -64,4 +64,30 @@ method: 'delete', data: query }) } } // ä¸ä¼ éä»¶ export function upload(query) { return request({ url: '/file/upload', method: 'post', data: query, responseType: 'blob' }) } // ç¼è¾æ¶å é¤éä»¶ export function delLedgerFile(query) { return request({ url: '/sales/ledger/delLedgerFile', method: 'delete', data: query, }) } // éå®ä¸å页æ¥è¯¢ export function ledgerListNoPage(query) { return request({ url: '/sales/ledger/listNoPage', method: 'get', params: query }) } src/components/PIMTable/PIMTable.vue
@@ -275,10 +275,6 @@ </script> <style scoped lang="scss"> :deep(.cell) { padding: 0 !important; } .cell { white-space: nowrap; overflow: hidden; src/views/basicData/supplierManage/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,333 @@ <template> <div class="app-container"> <div class="search_form"> <div> <span class="search_title">ä¾åºåæ¡£æ¡ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="è¾å ¥ä¾åºååç§°æç´¢" @change="handleQuery" clearable :prefix-icon="Search" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </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"> <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="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="supplierName"> <el-input v-model="form.supplierName" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="纳ç¨äººè¯å«å·ï¼" prop="taxpayerIdentificationNum"> <el-input v-model="form.taxpayerIdentificationNum" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å ¬å¸å°åï¼" prop="companyAddress"> <el-input v-model="form.companyAddress" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å ¬å¸çµè¯ï¼" prop="companyPhone"> <el-input v-model="form.companyPhone" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="弿·è¡ï¼" prop="bankAccountName"> <el-input v-model="form.bankAccountName" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="è´¦å·ï¼" prop="bankAccountNum"> <el-input v-model="form.bankAccountNum" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="è系人ï¼" prop="contactUserName"> <el-input v-model="form.contactUserName" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="èç³»çµè¯ï¼" prop="contactUserPhone"> <el-input v-model="form.contactUserPhone" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="ç»´æ¤äººï¼" prop="maintainUserId"> <el-select v-model="form.maintainUserId" placeholder="è¯·éæ©" clearable> <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.userId"/> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ç»´æ¤æ¶é´ï¼" prop="maintainTime"> <el-date-picker style="width: 100%" v-model="form.maintainTime" 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 { delSupplier} from "@/api/basicData/supplierManageFile.js"; import {ElMessageBox } from "element-plus"; import {userListNoPage} from "@/api/system/user.js"; import {addSupplier,getSupplier,listSupplier,updateSupplier} from "../../../api/basicData/supplierManageFile.js"; const { proxy } = getCurrentInstance() const tableColumn = ref([ { label: 'ä¾åºååç§°', prop: 'supplierName', }, { label: 'å ¬å¸å°å', prop: 'companyAddress' }, { label: 'èç³»æ¹å¼', prop: 'companyPhone' }, { label: '弿·è¡', prop: 'bankAccountName' }, { label: 'è´¦å·', prop: 'bankAccountNum' }, { label: 'è系人', prop: 'contactUserName', }, { label: 'èç³»çµè¯', prop: 'contactUserPhone', }, { label: 'ç»´æ¤äºº', prop: 'maintainUserName', }, { label: 'ç»´æ¤æ¶é´', prop: 'maintainTime', }, { dataType: "action", label: "æä½", align: 'center', operation: [ { name: "ç¼è¾", type: "text", clickFun: (row) => { openForm('edit', row); }, }, ], }, ]) const tableData = ref([]) const selectedRows = ref([]) const userList = ref([]) const tableLoading = ref(false) const page = reactive({ current: 1, size: 10, }) const total = ref(0) // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') const dialogFormVisible = ref(false) const data = reactive({ searchForm: { supplierName: '', }, form: { supplierName: '', taxpayerIdentificationNum: '', companyAddress: '', companyPhone: '', bankAccountName:'', bankAccountNum:'', contactUserName: '', contactUserPhone: '', maintainUserId: '', maintainTime: '', }, rules: { supplierName: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], taxpayerIdentificationNum: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], companyAddress: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], companyPhone: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], bankAccountName: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], bankAccountNum: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], contactUserName: [{ required: false, message: "请è¾å ¥", trigger: "blur" }], contactUserPhone: [{ required: false, message: "请è¾å ¥", trigger: "blur" }], maintainUserId: [{ required: false, message: "è¯·éæ©", trigger: "change" }], maintainTime: [{ required: false, 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 listSupplier({...searchForm.value, ...page}).then(res => { tableLoading.value = false tableData.value = res.data.records total.value = res.total }) } // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { selectedRows.value = selection } // æå¼å¼¹æ¡ const openForm = (type, row) => { operationType.value = type form.value = {} userListNoPage().then(res => { userList.value = res.data }) if (type === 'edit') { getSupplier(row.id).then(res => { form.value = {...res.data} }) } dialogFormVisible.value = true } // æäº¤è¡¨å const submitForm = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { if (operationType.value === "edit") { submitEdit() } else { submitAdd() } } }) } // æäº¤æ°å¢ const submitAdd = () => { addSupplier(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeDia() getList() }) } // æäº¤ä¿®æ¹ const submitEdit = () => { updateSupplier(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("/system/supplier/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(() => { tableLoading.value = true delSupplier(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") getList() }).finally(() => { tableLoading.value = false }) }).catch(() => { proxy.$modal.msg("已忶") }) } getList() </script> <style scoped lang="scss"> </style> src/views/procurementManagement/procurementLedger/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,669 @@ <template> <div class="app-container"> <div class="search_form"> <div> <span class="search_title">客æ·åç§°ï¼</span> <el-input v-model="searchForm.customerName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable :prefix-icon="Search" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button type="primary" @click="openForm('add')">æ°å¢å°è´¦</el-button> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</el-button> </div> </div> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary :summary-method="summarizeMainTable" @expand-change="expandChange" height="calc(100vh - 18.5em)"> <el-table-column align="center" type="selection" width="55" /> <el-table-column type="expand"> <template #default="props"> <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable"> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="产å大类" prop="productCategory" /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" /> <el-table-column label="åä½" prop="unit" /> <el-table-column label="æ°é" prop="quantity" /> <el-table-column label="ç¨ç(%)" prop="taxRate" /> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" /> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" /> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" /> </el-table> </template> </el-table-column> <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="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="entryDate" show-overflow-tooltip/> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button link type="primary" size="small" @click="openForm('edit', scope.row);">ç¼è¾</el-button> </template> </el-table-column> </el-table> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> </div> <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢éå®å°è´¦é¡µé¢' : 'ç¼è¾éå®å°è´¦é¡µé¢'" width="70%" @close="closeDia"> <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="éå®ååå·ï¼" prop="salesContractNo"> <el-input v-model="form.salesContractNo" placeholder="èªå¨çæ" clearable disabled/> </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-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> </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-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-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 style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> </el-form-item> </el-col> </el-row> <el-row> <el-form-item label="产åä¿¡æ¯ï¼" prop="entryDate"> <el-button type="primary" @click="openProductForm('add')">æ·»å </el-button> <el-button plain type="danger" @click="deleteProduct">å é¤</el-button> </el-form-item> </el-row> <el-table :data="productData" border @selection-change="productSelected"> <el-table-column align="center" type="selection" width="55" /> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="产å大类" prop="productCategory" /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" /> <el-table-column label="åä½" prop="unit" /> <el-table-column label="æ°é" prop="quantity" /> <el-table-column label="ç¨ç(%)" prop="taxRate" /> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" /> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" /> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" /> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button link type="primary" size="small" @click="openProductForm('edit', scope.row);">ç¼è¾</el-button> </template> </el-table-column> </el-table> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="夿³¨Â·ï¼" prop="remark"> <el-input v-model="form.remark" placeholder="请è¾å ¥" clearable type="textarea" :rows="2"/> </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> <div class="el-upload__tip"> æä»¶æ ¼å¼æ¯æ docï¼docxï¼xlsï¼xlsxï¼pptï¼pptxï¼pdfï¼txtï¼xmlï¼jpgï¼jpegï¼pngï¼gifï¼bmpï¼rarï¼zipï¼7z </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 v-model="productFormVisible" :title="productOperationType === 'add' ? 'æ°å¢äº§å' : 'ç¼è¾äº§å'" width="40%" @close="closeProductDia"> <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef"> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="产å大类ï¼" prop="productCategory"> <el-select v-model="productForm.productCategory" placeholder="è¯·éæ©" clearable> <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="è§æ ¼åå·ï¼" prop="specificationModel"> <el-select v-model="productForm.specificationModel" placeholder="è¯·éæ©" clearable> <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="åä½ï¼" prop="unit"> <el-input v-model="productForm.unit" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="æ°éï¼" prop="quantity"> <el-input v-model="productForm.quantity" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å«ç¨åä»·(å )ï¼" prop="taxInclusiveUnitPrice"> <el-input v-model="productForm.taxInclusiveUnitPrice" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ç¨ç(%)ï¼" prop="taxRate"> <el-select v-model="productForm.taxRate" placeholder="è¯·éæ©" clearable> <el-option label="1" value="1"/> <el-option label="6" value="6"/> <el-option label="13" value="13"/> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å«ç¨æ»ä»·(å )ï¼" prop="taxInclusiveTotalPrice"> <el-input v-model="productForm.taxInclusiveTotalPrice" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ä¸å«ç¨æ»ä»·(å )ï¼" prop="taxExclusiveTotalPrice"> <el-input v-model="productForm.taxExclusiveTotalPrice" placeholder="请è¾å ¥" clearable/> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å票类åï¼" prop="invoiceType"> <el-select v-model="productForm.invoiceType" placeholder="è¯·éæ©" clearable> <el-option label="墿®ç¥¨" value="墿®ç¥¨"/> <el-option label="å¢ä¸ç¥¨" value="å¢ä¸ç¥¨"/> </el-select> </el-form-item> </el-col> </el-row> </el-form> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitProduct">确认</el-button> <el-button @click="closeProductDia">åæ¶</el-button> </div> </template> </el-dialog> </div> </template> <script setup> import { getToken } from "@/utils/auth" import pagination from '@/components/PIMTable/Pagination.vue' import { ref } from 'vue' import {Search} from "@element-plus/icons-vue"; import {ElMessageBox } from "element-plus"; import {userListNoPage} from "@/api/system/user.js"; import { ledgerList, productList, customerList, addOrUpdateSalesLedger, getSalesLedgerWithProducts, delLedger, addOrUpdateSalesLedgerProduct, delProduct, delLedgerFile } from "@/api/salesManagement/salesLedger.js"; const { proxy } = getCurrentInstance() const tableData = ref([]) const productData = ref([]) const selectedRows = ref([]) const productSelectedRows = ref([]) const userList = ref([]) const customerOption = ref([]) const tableLoading = ref(false) const page = reactive({ current: 1, size: 10, }) const total = ref(0) const fileList = ref([]) // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') const dialogFormVisible = ref(false) const data = reactive({ searchForm: { customerName: '', }, form: { salesContractNo: '', salesman: '', customerContractNo: '', customerId: '', projectName: '', entryPerson: '', entryDate: '', maintenanceTime: '', productData: [] }, rules: { salesman: [{ required: true, message: "è¯·éæ©", trigger: "change" }], customerContractNo: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], customerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], projectName: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], entryPerson: [{ required: true, message: "è¯·éæ©", trigger: "change" }], entryDate: [{ required: true, message: "è¯·éæ©", trigger: "change" }], } }) const { searchForm, form, rules } = toRefs(data) // 产å表åå¼¹æ¡æ°æ® const productFormVisible = ref(false) const productOperationType = ref('') const currentId = ref('') const productFormData = reactive({ productForm: { productCategory: '', specificationModel: '', unit: '', quantity: '', taxInclusiveUnitPrice: '', taxRate: '', taxInclusiveTotalPrice: '', taxExclusiveTotalPrice: '', invoiceType: '', }, productRules: { productCategory: [{ required: true, message: "è¯·éæ©", trigger: "change" }], specificationModel: [{ required: true, message: "è¯·éæ©", trigger: "change" }], unit: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], quantity: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], taxInclusiveUnitPrice: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], taxRate: [{ required: true, message: "è¯·éæ©", trigger: "change" }], taxInclusiveTotalPrice: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], taxExclusiveTotalPrice: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], invoiceType: [{ required: true, message: "è¯·éæ©", trigger: "change" }], } }) const { productForm, productRules } = toRefs(productFormData) const upload = reactive({ // ä¸ä¼ çå°å url: import.meta.env.VITE_APP_BASE_API + "/file/upload", // 设置ä¸ä¼ ç请æ±å¤´é¨ headers: { Authorization: "Bearer " + getToken() }, }) // æ¥è¯¢å表 /** æç´¢æé®æä½ */ const handleQuery = () => { page.current = 1 getList() } const paginationChange = ({ current, limit }) => { page.current = current; page.size = limit; getList() } const getList = () => { tableLoading.value = true ledgerList({...searchForm.value, ...page}).then(res => { tableLoading.value = false tableData.value = res.rows tableData.value.map(item => { item.children = [] }) total.value = res.total }) } // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { selectedRows.value = selection } const productSelected = (selectedRows) => { productSelectedRows.value = selectedRows } const expandedRowKeys = ref([]) // å±å¼è¡ const expandChange = (row, expandedRows) => { if (expandedRows.length > 0) { expandedRowKeys.value = [] try { productList({salesLedgerId: row.id}).then(res => { const index = tableData.value.findIndex(item => item.id === row.id); if (index > -1) { tableData.value[index].children = res.rows; } expandedRowKeys.value.push(row.id) }) } catch (error) { console.log(error) } } else { expandedRowKeys.value = [] } } // 主表åè®¡æ¹æ³ const summarizeMainTable = (param) => { const { columns, data } = param; const sums = []; columns.forEach((column, index) => { if (index === 0) { sums[index] = 'å计'; return; } const prop = column.property; if (['contractAmount'].includes(prop)) { const values = data.map(item => Number(item[prop])); if (!values.every(value => isNaN(value))) { sums[index] = values.reduce((acc, val) => (!isNaN(val) ? acc + val : acc), 0); } else { sums[index] = ''; } } else { sums[index] = ''; } }) return sums; }; // å表åè®¡æ¹æ³ const summarizeChildrenTable = (param) => { const { columns, data } = param; const sums = []; columns.forEach((column, index) => { if (index === 0) { sums[index] = 'å计'; return; } const prop = column.property; if (['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice'].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 = [] userListNoPage().then(res => { userList.value = res.data }) customerList().then(res => { customerOption.value = res }) if (type === 'edit') { currentId.value = row.id; getSalesLedgerWithProducts({id: row.id}).then(res => { form.value = {...res} productData.value = form.value.productData fileList.value = form.value.salesLedgerFiles }) } dialogFormVisible.value = true } // ä¸ä¼ åæ ¡æ£ function handleBeforeUpload(file) { // æ ¡æ£æä»¶å¤§å° if (file.size > 1024 * 1024) { 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) console.log('operationType.value', operationType.value) if (operationType.value === 'edit') { let ids = [] ids.push(file.value.id) delLedgerFile(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") }) } } // æäº¤è¡¨å const submitForm = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { if (productData.value.length > 0) { form.value.productData = proxy.HaveJson(productData.value) } else { proxy.$modal.msgWarning('请添å 产åä¿¡æ¯') return } let tempFileIds = [] if (fileList.value.length > 0) { tempFileIds = fileList.value.map(item => item.tempId) } form.value.tempFileIds = tempFileIds addOrUpdateSalesLedger(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeDia() getList() }) } }) } // å ³éå¼¹æ¡ const closeDia = () => { proxy.resetForm("formRef") dialogFormVisible.value = false } // æå¼äº§åå¼¹æ¡ const openProductForm = (type, row) => { productOperationType.value = type productForm.value = {} proxy.resetForm("productFormRef") if (type === 'edit') { productForm.value = {...row} } productFormVisible.value = true } // æäº¤äº§å表å const submitProduct = () => { proxy.$refs["productFormRef"].validate(valid => { if (valid) { if (operationType.value === "edit") { submitProductEdit() } else { productData.value.push({...productForm.value}) closeProductDia() } } }) } const submitProductEdit = () => { productForm.value.salesLedgerId = currentId.value addOrUpdateSalesLedgerProduct(productForm.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeProductDia() getSalesLedgerWithProducts({id: currentId.value}).then(res => { productData.value = res.productData }) }) } // å é¤äº§å const deleteProduct = () => { if (productSelectedRows.value.length === 0) { proxy.$modal.msgWarning('è¯·éæ©æ°æ®') return } if (operationType.value === 'add') { productSelectedRows.value.forEach(selectedRow => { const index = productData.value.findIndex(product => product.id === selectedRow.id); if (index !== -1) { productData.value.splice(index, 1); } }); } else { let ids = [] if (productSelectedRows.value.length > 0) { ids = productSelectedRows.value.map(item => item.id); } ElMessageBox.confirm( 'éä¸çå 容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { delProduct(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") closeProductDia() getSalesLedgerWithProducts({id: currentId.value}).then(res => { productData.value = res.productData }) }) }).catch(() => { proxy.$modal.msg("已忶") }) } } // å ³é产åå¼¹æ¡ const closeProductDia = () => { proxy.resetForm("productFormRef") productFormVisible.value = false } // å¯¼åº const handleOut = () => { ElMessageBox.confirm( 'éä¸çå 容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { proxy.download("/sales/ledger/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(() => { delLedger(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") getList() }) }).catch(() => { proxy.$modal.msg("已忶") }) } getList() </script> <style scoped lang="scss"> </style> src/views/salesManagement/invoiceRegistration/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,422 @@ <template> <div class="app-container"> <div class="search_form"> <div> <span class="search_title">å¼ç¥¨ç»è®°ï¼</span> <el-input v-model="searchForm.customerName" style="width: 240px" placeholder="请è¾å ¥åç§°æç´¢" @change="handleQuery" clearable :prefix-icon="Search" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button type="primary" @click="openForm('add')">æ°å¢ç»è®°</el-button> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</el-button> </div> </div> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary :summary-method="summarizeMainTable" @expand-change="expandChange" height="calc(100vh - 18.5em)"> <el-table-column align="center" type="selection" width="55" /> <el-table-column type="expand"> <template #default="props"> <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable"> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="产å大类" prop="productCategory" /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" /> <el-table-column label="åä½" prop="unit" /> <el-table-column label="æ°é" prop="quantity" /> <el-table-column label="ç¨ç" prop="taxRate" /> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" /> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" /> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" /> <el-table-column label="æ¬æ¬¡å¼ç¥¨æ°" prop="invoiceNum" /> <el-table-column label="æ¬æ¬¡å¼ç¥¨éé¢(å )" prop="invoiceAmount" /> <el-table-column label="æªå¼ç¥¨æ°(å )" prop="noInvoiceNum" /> <el-table-column label="æªå¼ç¥¨éé¢(å )" prop="noInvoiceAmount" /> </el-table> </template> </el-table-column> <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="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 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="èªå¨å¡«å " disabled></el-input> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="ä¸å¡åï¼" prop="salesman"> <el-input v-model="form.salesman" placeholder="èªå¨å¡«å " disabled/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="项ç®åç§°ï¼" prop="projectName"> <el-input v-model="form.projectName" placeholder="èªå¨å¡«å " disabled/> </el-form-item> </el-col> </el-row> <el-row> <el-form-item label="产åä¿¡æ¯ï¼" prop="entryDate"> </el-form-item> </el-row> <el-table :data="productData" border> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="产å大类" prop="productCategory" /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" /> <el-table-column label="åä½" prop="unit" /> <el-table-column label="æ°é" prop="quantity" /> <el-table-column label="ç¨ç" prop="taxRate" /> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" /> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" /> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" /> <el-table-column label="æ¬æ¬¡å¼ç¥¨æ°" prop="invoiceNum"> <template #default="scope"> <el-input :disabled="!scope.row.editFlag" v-model="scope.row.invoiceNum"></el-input> </template> </el-table-column> <el-table-column label="æ¬æ¬¡å¼ç¥¨éé¢(å )" prop="invoiceAmount" > <template #default="scope"> <el-input :disabled="!scope.row.editFlag" v-model="scope.row.invoiceAmount"></el-input> </template> </el-table-column> <el-table-column label="æªå¼ç¥¨æ°(å )" prop="noInvoiceNum" > <template #default="scope"> <el-input :disabled="!scope.row.editFlag" v-model="scope.row.noInvoiceNum"></el-input> </template> </el-table-column> <el-table-column label="æªå¼ç¥¨éé¢(å )" prop="noInvoiceAmount" > <template #default="scope"> <el-input :disabled="!scope.row.editFlag" v-model="scope.row.noInvoiceAmount"></el-input> </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="openProductEdit('edit', scope.row);">ç¼è¾</el-button> </template> </el-table-column> </el-table> </el-form> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitForm">确认</el-button> <el-button @click="closeDia">åæ¶</el-button> </div> </template> </el-dialog> </div> </template> <script setup> import pagination from '@/components/PIMTable/Pagination.vue' import { ref } from 'vue' import {Search} from "@element-plus/icons-vue"; import {ElMessageBox } from "element-plus"; // import {userListNoPage} from "@/api/system/user.js"; import { ledgerListNoPage, getSalesLedgerWithProducts, } from "@/api/salesManagement/salesLedger.js"; import { invoiceRegistrationList, invoiceRegistrationSaveOrUpdate, invoiceRegistrationDel, productList, invoiceRegistrationDetail, invoiceRegistrationExport } from "@/api/salesManagement/invoiceRegistration.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 ledgerList = ref([]) // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') const dialogFormVisible = ref(false) const data = reactive({ searchForm: { customerName: '', }, form: { salesLedgerId: '', customerName: '', salesman: '', projectName: '', productData: [] }, rules: { salesLedgerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }] } }) const { searchForm, form, rules } = toRefs(data) // 产å表åå¼¹æ¡æ°æ® const productFormData = reactive({ productForm: { productCategory: '', specificationModel: '', unit: '', quantity: '', taxInclusiveUnitPrice: '', taxRate: '', taxInclusiveTotalPrice: '', taxExclusiveTotalPrice: '', invoiceType: '', }, }) const { productForm } = toRefs(productFormData) // æ¥è¯¢å表 /** æç´¢æé®æä½ */ const handleQuery = () => { page.current = 1 getList() } const paginationChange = ({ current, limit }) => { page.current = current; page.size = limit; getList() } const getList = () => { tableLoading.value = true invoiceRegistrationList({...searchForm.value, ...page}).then(res => { tableLoading.value = false tableData.value = res.data.records; tableData.value.map(item => { item.children = [] }) total.value = res.data.total }) } // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { selectedRows.value = selection } const expandedRowKeys = ref([]) // å±å¼è¡ const expandChange = (row, expandedRows) => { if (expandedRows.length > 0) { expandedRowKeys.value = [] try { productList({invoiceRegistrationId: row.id}).then(res => { const index = tableData.value.findIndex(item => item.id === row.id); if (index > -1) { tableData.value[index].children = res.data; } expandedRowKeys.value.push(row.id) }) } catch (error) { console.log(error) } } else { expandedRowKeys.value = [] } } // 主表åè®¡æ¹æ³ const summarizeMainTable = (param) => { const { columns, data } = param; const sums = []; columns.forEach((column, index) => { if (index === 0) { sums[index] = 'å计'; return; } const prop = column.property; if (['contractAmount'].includes(prop)) { const values = data.map(item => Number(item[prop])); if (!values.every(value => isNaN(value))) { sums[index] = values.reduce((acc, val) => (!isNaN(val) ? acc + val : acc), 0); } else { sums[index] = ''; } } else { sums[index] = ''; } }) return sums; }; // å表åè®¡æ¹æ³ const summarizeChildrenTable = (param) => { const { columns, data } = param; const sums = []; columns.forEach((column, index) => { if (index === 0) { sums[index] = 'å计'; return; } const prop = column.property; if (['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice','invoiceNum','invoiceAmount','noInvoiceNum','noInvoiceAmount'].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 = [] // æ¥è¯¢éå®åå ledgerListNoPage({}).then(res => { ledgerList.value = res.data; }) if (type === 'edit') { invoiceRegistrationDetail({id: row.id}).then(res => { form.value = {...res.data} form.value.productDtoList = res.data.productDtoList productData.value = form.value.productDtoList }) } // currentId.value = row.id; // getSalesLedgerWithProducts({id: row.id}).then(res => { // form.value = {...res} // productData.value = form.value.productData // }) // } dialogFormVisible.value = true } // æäº¤è¡¨å const submitForm = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { form.value.productDtoList = productData; invoiceRegistrationSaveOrUpdate(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeDia() getList() }) } }) } // å ³éå¼¹æ¡ const closeDia = () => { proxy.resetForm("formRef") dialogFormVisible.value = false } // æå¼äº§åå¼¹æ¡ const openProductEdit = (type, row) => { const index = productData.value.findIndex(item => item.id === row.id); if (index > -1) { productData.value[index].editFlag = !productData.value[index].editFlag } } // å¯¼åº const handleOut = () => { ElMessageBox.confirm( 'éä¸çå 容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { proxy.download("/invoiceRegistration/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(() => { invoiceRegistrationDel(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, salesman: res.salesman, projectName: res.projectName, productData: res.productData, salesContractNo: res.salesContractNo, customerId: res.customerId, } productData.value = form.value.productData.map(item => { item.id = "" item.editFlag = false return item }) }) }else { proxy.resetForm("formRef") productData.value = [] } } getList() </script> <style scoped lang="scss"> </style> src/views/salesManagement/salesLedger/index.vue
@@ -39,7 +39,7 @@ <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="taxRate" /> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" /> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" /> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" /> @@ -138,7 +138,7 @@ <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="taxRate" /> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" /> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" /> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" /> @@ -159,14 +159,16 @@ <el-col :span="24"> <el-form-item label="éä»¶ææÂ·ï¼" prop="remark"> <el-upload :file-list="fileList" action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15" v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" :headers="proxy.uploadHeader" 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> @@ -225,11 +227,11 @@ </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ç¨çï¼" prop="taxRate"> <el-form-item label="ç¨ç(%)ï¼" prop="taxRate"> <el-select v-model="productForm.taxRate" placeholder="è¯·éæ©" clearable> <el-option label="6%" value="6%"/> <el-option label="13%" value="13%"/> <el-option label="1%" value="1%"/> <el-option label="1" value="1"/> <el-option label="6" value="6"/> <el-option label="13" value="13"/> </el-select> </el-form-item> </el-col> @@ -268,6 +270,7 @@ </template> <script setup> import { getToken } from "@/utils/auth" import pagination from '@/components/PIMTable/Pagination.vue' import { ref } from 'vue' import {Search} from "@element-plus/icons-vue"; @@ -278,7 +281,7 @@ productList, customerList, addOrUpdateSalesLedger, getSalesLedgerWithProducts, delLedger, addOrUpdateSalesLedgerProduct, delProduct getSalesLedgerWithProducts, delLedger, addOrUpdateSalesLedgerProduct, delProduct, delLedgerFile } from "@/api/salesManagement/salesLedger.js"; const { proxy } = getCurrentInstance() const tableData = ref([]) @@ -294,7 +297,6 @@ }) const total = ref(0) const fileList = ref([]) const uploadList = ref([]) // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') @@ -353,6 +355,12 @@ } }) const { productForm, productRules } = toRefs(productFormData) const upload = reactive({ // ä¸ä¼ çå°å url: import.meta.env.VITE_APP_BASE_API + "/file/upload", // 设置ä¸ä¼ ç请æ±å¤´é¨ headers: { Authorization: "Bearer " + getToken() }, }) // æ¥è¯¢å表 /** æç´¢æé®æä½ */ @@ -465,6 +473,7 @@ getSalesLedgerWithProducts({id: row.id}).then(res => { form.value = {...res} productData.value = form.value.productData fileList.value = form.value.salesLedgerFiles }) } dialogFormVisible.value = true @@ -472,11 +481,9 @@ // ä¸ä¼ åæ ¡æ£ function handleBeforeUpload(file) { // æ ¡æ£æä»¶å¤§å° if (props.fileSize) { if (file.size > 1024 * 1024) { proxy.$modal.msgError('ä¸ä¼ æä»¶å¤§å°ä¸è½è¶ è¿10MB!') return false } if (file.size > 1024 * 1024) { proxy.$modal.msgError('ä¸ä¼ æä»¶å¤§å°ä¸è½è¶ è¿10MB!') return false } proxy.$modal.loading("æ£å¨ä¸ä¼ æä»¶ï¼è¯·ç¨å...") return true @@ -487,15 +494,26 @@ proxy.$modal.closeLoading() } // ä¸ä¼ æååè° function handleUploadSuccess(res, file) { function handleUploadSuccess(res, file, uploadFiles) { proxy.$modal.closeLoading() if (res.code === 200) { uploadList.value.push({ name: res.fileName, url: res.fileName }) fileList.value = fileList.value.filter(f => f.url !== undefined).concat(uploadList.value) uploadList.value = [] file.tempId = res.data.tempId proxy.$modal.msgSuccess("ä¸ä¼ æå") } else { proxy.$modal.closeLoading() proxy.$modal.msgError(res.msg) proxy.$refs.fileUpload.handleRemove(file) } } // ç§»é¤æä»¶ function handleRemove (file) { console.log('handleRemove', file) console.log('operationType.value', operationType.value) if (operationType.value === 'edit') { let ids = [] ids.push(file.id) delLedgerFile(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") }) } } // æäº¤è¡¨å @@ -508,6 +526,11 @@ proxy.$modal.msgWarning('请添å 产åä¿¡æ¯') return } let tempFileIds = [] if (fileList.value.length > 0) { tempFileIds = fileList.value.map(item => item.tempId) } form.value.tempFileIds = tempFileIds addOrUpdateSalesLedger(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeDia() @@ -632,8 +655,8 @@ ).then(() => { delLedger(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") getList() }) getList() }).catch(() => { proxy.$modal.msg("已忶") })