From bfdfceb60b41a541d9d9087323079bc64c144209 Mon Sep 17 00:00:00 2001 From: chenrui <1187576398@qq.com> Date: 星期四, 29 五月 2025 13:18:18 +0800 Subject: [PATCH] 客户/供应商修改 --- src/views/salesManagement/salesLedger/index.vue | 203 +++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 158 insertions(+), 45 deletions(-) diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue index 7390da6..78779b7 100644 --- a/src/views/salesManagement/salesLedger/index.vue +++ b/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> @@ -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" /> @@ -53,7 +53,7 @@ <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="entryPersonName" 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"> @@ -104,8 +104,8 @@ </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 v-model="form.entryPerson" placeholder="璇烽�夋嫨" clearable @change="changs" disabled> + <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"/> </el-select> </el-form-item> </el-col> @@ -121,6 +121,7 @@ type="date" placeholder="璇烽�夋嫨" clearable + disabled /> </el-form-item> </el-col> @@ -138,7 +139,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" /> @@ -157,16 +158,18 @@ </el-row> <el-row :gutter="30"> <el-col :span="24"> - <el-form-item label="闄勪欢鏉愭枡路锛�" prop="remark"> + <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> @@ -191,17 +194,27 @@ <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="浜у搧澶х被锛�" prop="productCategory"> - <el-select v-model="productForm.productCategory" placeholder="璇烽�夋嫨" clearable> + <!-- <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-select> --> + <el-tree-select + v-model="productForm.productCategory" + placeholder="璇烽�夋嫨" clearable + check-strictly + @change="getModels" + :data="productOptions" + :render-after-expand="false" + style="width: 100%" + /> + </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-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId"> + <el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" clearable @change="getProductModel"> + <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id"/> </el-select> </el-form-item> </el-col> @@ -225,11 +238,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,18 +281,21 @@ </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 useUserStore from '@/store/modules/user' import {userListNoPage} from "@/api/system/user.js"; import { ledgerList, productList, customerList, addOrUpdateSalesLedger, - getSalesLedgerWithProducts, delLedger, addOrUpdateSalesLedgerProduct, delProduct + getSalesLedgerWithProducts, delLedger, addOrUpdateSalesLedgerProduct, delProduct, delLedgerFile } from "@/api/salesManagement/salesLedger.js"; +import {modelList, productTreeList} from "@/api/basicData/product.js"; +const userStore = useUserStore() const { proxy } = getCurrentInstance() const tableData = ref([]) const productData = ref([]) @@ -287,6 +303,8 @@ const productSelectedRows = ref([]) const userList = ref([]) const customerOption = ref([]) +const productOptions = ref([]) +const modelOptions = ref([]) const tableLoading = ref(false) const page = reactive({ current: 1, @@ -294,7 +312,6 @@ }) const total = ref(0) const fileList = ref([]) -const uploadList = ref([]) // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁 const operationType = ref('') @@ -353,6 +370,12 @@ } }) const { productForm, productRules } = toRefs(productFormData) +const upload = reactive({ + // 涓婁紶鐨勫湴鍧� + url: import.meta.env.VITE_APP_BASE_API + "/file/upload", + // 璁剧疆涓婁紶鐨勮姹傚ご閮� + headers: { Authorization: "Bearer " + getToken() }, +}) // 鏌ヨ鍒楄〃 /** 鎼滅储鎸夐挳鎿嶄綔 */ @@ -374,11 +397,65 @@ item.children = [] }) total.value = res.total + }).catch(() => { + tableLoading.value = false }) +} +// 鑾峰彇浜у搧澶х被tree鏁版嵁 +const getProductOptions = () => { + productTreeList().then(res => { + productOptions.value = convertIdToValue(res) + }) +} +// 鑾峰彇tree瀛愭暟鎹� +const getModels =(value) => { + productForm.value.productCategory = findNodeById(productOptions.value, value) + modelList({id: value}).then(res => { + modelOptions.value = res + }) +} +const getProductModel =(value) => { + const index = modelOptions.value.findIndex(item => item.id === value); + if (index !== -1) { + productForm.value.specificationModel = modelOptions.value[index].model; + } else { + productForm.value.specificationModel = null; + } +} +const findNodeById = (nodes, productId) => { + for (let i = 0; i < nodes.length; i++) { + if (nodes[i].value === productId) { + return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣 + } + if (nodes[i].children && nodes[i].children.length > 0) { + const foundNode = findNodeById(nodes[i].children, productId); + if (foundNode) { + return foundNode.label; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐� + } + } + } + return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull +}; +function convertIdToValue(data) { + return data.map(item => { + const { id, children, ...rest } = item; + const newItem = { + ...rest, + value: id // 灏� id 鏀逛负 value + }; + if (children && children.length > 0) { + newItem.children = convertIdToValue(children); + } + + return newItem; + }); } // 琛ㄦ牸閫夋嫨鏁版嵁 const handleSelectionChange = (selection) => { - selectedRows.value = selection + + // 杩囨护鎺夊瓙鏁版嵁 + selectedRows.value = selection.filter(item => item.children !== undefined); + console.log('selection',selectedRows.value) } const productSelected = (selectedRows) => { productSelectedRows.value = selectedRows @@ -389,10 +466,10 @@ 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; + tableData.value[index].children = res; } expandedRowKeys.value.push(row.id) }) @@ -450,33 +527,42 @@ return sums; } // 鎵撳紑寮规 -const openForm = (type, row) => { +const openForm = async (type, row) => { operationType.value = type form.value = {} productData.value = [] - userListNoPage().then(res => { - userList.value = res.data - }) + let userLists = await userListNoPage() + userList.value = userLists.data customerList().then(res => { customerOption.value = res }) + form.value.entryPerson = userStore.id 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 }) } + let userAll = await userStore.getInfo() + userList.value.forEach(element => { + if(userAll.user.nickName === element.nickName && userAll.user.userName === element.userName) { + form.value.entryPerson = userAll.user.userId // 璁剧疆榛樿涓氬姟鍛樹负褰撳墠鐢ㄦ埛 + } + }); + form.value.entryDate = getCurrentDate() // 璁剧疆榛樿褰曞叆鏃ユ湡涓哄綋鍓嶆棩鏈� dialogFormVisible.value = true +} +function changs(val){ + console.log(val); } // 涓婁紶鍓嶆牎妫� function handleBeforeUpload(file) { // 鏍℃鏂囦欢澶у皬 - if (props.fileSize) { - if (file.size > 1024 * 1024) { - proxy.$modal.msgError('涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!') - return false - } + if (file.size > 1024 * 1024 * 10) { + proxy.$modal.msgError('涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!') + return false } proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...") return true @@ -487,15 +573,24 @@ 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) { + if (operationType.value === 'edit') { + let ids = [] + ids.push(file.id) + delLedgerFile(ids).then(res => { + proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛") + }) } } // 鎻愪氦琛ㄥ崟 @@ -508,6 +603,12 @@ proxy.$modal.msgWarning('璇锋坊鍔犱骇鍝佷俊鎭�') return } + let tempFileIds = [] + if (fileList.value.length > 0) { + tempFileIds = fileList.value.map(item => item.tempId) + } + form.value.tempFileIds = tempFileIds + form.value.type = 1 addOrUpdateSalesLedger(form.value).then(res => { proxy.$modal.msgSuccess("鎻愪氦鎴愬姛") closeDia() @@ -530,6 +631,7 @@ productForm.value = {...row} } productFormVisible.value = true + getProductOptions() } // 鎻愪氦浜у搧琛ㄥ崟 const submitProduct = () => { @@ -549,7 +651,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 }) }) @@ -583,14 +685,14 @@ 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 }) }) }).catch(() => { proxy.$modal.msg("宸插彇娑�") }) - + } } // 鍏抽棴浜у搧寮规 @@ -632,15 +734,26 @@ ).then(() => { delLedger(ids).then(res => { proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛") + getList() }) - getList() }).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}`; +} +const mathNum = (val) => { + productForm.value.taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(val, productForm.value.taxRate) } getList() </script> <style scoped lang="scss"> -</style> \ No newline at end of file +</style> -- Gitblit v1.9.3