From 78dc79e8222f2f76ca7b9d93866e1dcb64f6dd63 Mon Sep 17 00:00:00 2001 From: chenrui <1187576398@qq.com> Date: 星期一, 26 五月 2025 16:34:04 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev --- src/views/index.vue | 99 ++++++++++++++++++- src/views/procurementManagement/procurementLedger/index.vue | 7 + src/views/system/user/index.vue | 20 ++-- src/api/viewIndex.js | 13 ++ src/views/procurementManagement/paymentEntry/index.vue | 2 src/views/salesManagement/salesLedger/index.vue | 106 +++++++++++++++++++-- src/views/procurementManagement/paymentLedger/index.vue | 1 7 files changed, 216 insertions(+), 32 deletions(-) diff --git a/src/api/viewIndex.js b/src/api/viewIndex.js index 8ac39e4..23bddd8 100644 --- a/src/api/viewIndex.js +++ b/src/api/viewIndex.js @@ -25,21 +25,28 @@ // 瀹㈡埛鍚堝悓閲戦TOP5缁熻 export const getTopFiveList = () => { return request({ - url: 'sales/ledger/getTopFiveList', + url: '/sales/ledger/getTopFiveList', method: 'get' }) } // 鍥炴楗肩姸鍥� export const getAmountMouth = () => { return request({ - url: 'receiptPayment/getAmountMouth', + url: '/receiptPayment/getAmountMouth', method: 'get' }) } -// 鍥炴楗肩姸鍥� +// 浠樻楗肩姸鍥� export const paymentMonthList = () => { return request({ url: '/purchase/paymentRegistration/paymentMonthList', method: 'get' }) +} +// 绾垮舰鍥� +export const getAmountHalfYear = () => { + return request({ + url: '/sales/ledger/getAmountHalfYear', + method: 'get' + }) } \ No newline at end of file diff --git a/src/views/index.vue b/src/views/index.vue index 4f5b35c..1fbed5d 100644 --- a/src/views/index.vue +++ b/src/views/index.vue @@ -112,7 +112,7 @@ :grid="grid" :legend="barLegend" :series="lineSeries" - :tooltip="tooltip" + :tooltip="tooltipLine" :xAxis="xAxis2" :yAxis="yAxis2" style="height: 27vh;"></Echarts> @@ -128,6 +128,7 @@ import * as echarts from 'echarts'; import Echarts from "@/components/Echarts/echarts.vue"; import { + getAmountHalfYear, getAmountMouth, getContractAmount, getInvoiceAmount, @@ -232,6 +233,9 @@ type: 'shadow' } } +const tooltipLine = { + trigger: 'axis', +} const yAxis1 = ref([ { type: 'value', @@ -313,26 +317,22 @@ materialPieSeries1.value[0].data[1].value = payableAmount.value }) } -// 瀹㈡埛 +// 瀹㈡埛top5 const getTopFiveListNum = async () => { const res = await getTopFiveList() - const customerName = [] const totalAmount = [] - res.data.forEach(item => { customerName.push(item.customerName) totalAmount.push(item.totalAmount) }) - -// 鉁� 姝g‘鍝嶅簲寮忚祴鍊硷細鍒涘缓鏂扮殑 xAxis 鍜� series 瀵硅薄 +// 姝g‘鍝嶅簲寮忚祴鍊硷細鍒涘缓鏂扮殑 xAxis 鍜� series 瀵硅薄 xAxis1.value = [ { type: 'category', data: customerName } ] - barSeries.value = [ { type: 'bar', @@ -353,12 +353,97 @@ } ] } +// 绾垮舰鍥� +const getAmountHalfYearNum = async () => { + const res = await getAmountHalfYear() + console.log(res) + const monthName = [] + const receiptAmount = [] + const invoiceAmount = [] + res.data.forEach(item => { + monthName.push(item.month) + receiptAmount.push(item.receiptAmount) + invoiceAmount.push(item.invoiceAmount) + }) +// 姝g‘鍝嶅簲寮忚祴鍊硷細鍒涘缓鏂扮殑 xAxis 鍜� series 瀵硅薄 + xAxis2.value = [ + { + type: 'category', + data: monthName + } + ] + lineSeries.value = [ + { + name: '寮�绁�', + type: 'line', + data: receiptAmount, + smooth: true, + stack: 'Total', + areaStyle: { + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: 'rgba(131, 207, 255, 1)' + }, + { + offset: 1, + color: 'rgba(186, 228, 255, 1)' + } + ]) + }, + // 璁剧疆灏忓渾鐐圭殑棰滆壊 + itemStyle: { + color: '#2D99FF', // 灏忓渾鐐归鑹茶缃负#2D99FF + borderColor: '#2D99FF' // 濡傛灉闇�瑕佺殑璇濓紝鍙互璁剧疆杈规棰滆壊 + }, + emphasis: { + focus: 'series' + }, + lineStyle: { + width: 0 + }, + showSymbol: false, + }, + { + name: '鍥炴', + type: 'line', + data: invoiceAmount, + smooth: true, + stack: 'Total', + lineStyle: { + width: 0 + }, + // 璁剧疆灏忓渾鐐圭殑棰滆壊 + itemStyle: { + color: '#83CFFF', // 灏忓渾鐐归鑹茶缃负#83CFFF + borderColor: '#83CFFF' // 濡傛灉闇�瑕佺殑璇濓紝鍙互璁剧疆杈规棰滆壊 + }, + showSymbol: false, + areaStyle: { + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: 'rgba(54, 153, 255, 1)' + }, + { + offset: 1, + color: 'rgba(89, 169, 254, 1)' + } + ]) + }, + emphasis: { + focus: 'series' + }, + } + ] +} getContractAmountNum() getInvoiceAmountNum() getReceiptAmountNum() getTopFiveListNum() getAmountMouthNum() paymentMonthListNum() +getAmountHalfYearNum() </script> <style scoped> diff --git a/src/views/procurementManagement/paymentEntry/index.vue b/src/views/procurementManagement/paymentEntry/index.vue index 0c2365d..03a7343 100644 --- a/src/views/procurementManagement/paymentEntry/index.vue +++ b/src/views/procurementManagement/paymentEntry/index.vue @@ -22,7 +22,7 @@ <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="閲囪喘鍚堝悓鍙�11111锛�" prop="purchaseLedgerId"> + <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerId"> <el-select v-model="form.purchaseLedgerId" placeholder="璇烽�夋嫨" clearable @change="setInfo" :disabled="operationType === 'edit'"> <el-option v-for="item in purchaseLedgerList" :key="item.id" :label="item.purchaseContractNumber" diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue index 18c0176..f720960 100644 --- a/src/views/procurementManagement/paymentLedger/index.vue +++ b/src/views/procurementManagement/paymentLedger/index.vue @@ -65,7 +65,6 @@ <PIMTable :column="tableColumnSon" :tableData="tableDataSon" - :page="pageSon" :isSelection="false" :tableLoading="tableLoadingSon" :isShowSummary="isShowSummarySon" diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue index f04b8f2..b836cde 100644 --- a/src/views/procurementManagement/procurementLedger/index.vue +++ b/src/views/procurementManagement/procurementLedger/index.vue @@ -378,6 +378,13 @@ page.current = 1 getList() } +// 瀛愯〃鍚堣鏂规硶 +const summarizeChildrenTable = (param) => { + return proxy.summarizeTable(param, ['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice', 'ticketsNum', 'ticketsAmount', 'futureTickets', 'futureTicketsAmount'], { + ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� + futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁� + }); +}; const paginationChange = ({ current, limit }) => { page.current = current; page.size = limit; diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue index 3a0fa46..7a373f2 100644 --- a/src/views/salesManagement/salesLedger/index.vue +++ b/src/views/salesManagement/salesLedger/index.vue @@ -104,7 +104,7 @@ </el-col> <el-col :span="12"> <el-form-item label="褰曞叆浜猴細" prop="entryPerson"> - <el-select v-model="form.entryPerson" placeholder="璇烽�夋嫨" clearable> + <el-select v-model="form.entryPerson" placeholder="璇烽�夋嫨" clearable @change="changs"> <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"/> </el-select> </el-form-item> @@ -121,6 +121,7 @@ type="date" placeholder="璇烽�夋嫨" clearable + disabled /> </el-form-item> </el-col> @@ -193,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> @@ -275,6 +286,7 @@ 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, @@ -283,6 +295,8 @@ addOrUpdateSalesLedger, 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([]) @@ -290,6 +304,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, @@ -386,6 +402,55 @@ 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 @@ -460,13 +525,12 @@ 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 }) @@ -478,7 +542,17 @@ 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) { @@ -554,6 +628,7 @@ productForm.value = {...row} } productFormVisible.value = true + getProductOptions() } // 鎻愪氦浜у搧琛ㄥ崟 const submitProduct = () => { @@ -662,6 +737,17 @@ 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> diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue index 7a5800a..a43d890 100644 --- a/src/views/system/user/index.vue +++ b/src/views/system/user/index.vue @@ -17,8 +17,8 @@ <pane size="84"> <el-col style="padding: 10px"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> - <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName"> - <el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" clearable style="width: 240px" @keyup.enter="handleQuery" /> + <el-form-item label="鐧诲綍璐﹀彿" prop="userName"> + <el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ櫥褰曡处鍙�" clearable style="width: 240px" @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber"> <el-input v-model="queryParams.phonenumber" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" clearable style="width: 240px" @keyup.enter="handleQuery" /> @@ -59,7 +59,7 @@ <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="50" align="center" /> <el-table-column label="鐢ㄦ埛缂栧彿" align="center" key="userId" prop="userId" v-if="columns[0].visible" /> - <el-table-column label="鐢ㄦ埛鍚嶇О" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" /> + <el-table-column label="鐧诲綍璐﹀彿" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" /> <el-table-column label="鐢ㄦ埛鏄电О" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" /> <el-table-column label="閮ㄩ棬" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" /> <el-table-column label="鎵嬫満鍙风爜" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" /> @@ -111,8 +111,8 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="褰掑睘閮ㄩ棬" prop="deptId"> - <el-tree-select v-model="form.deptId" :data="enabledDeptOptions" :props="{ value: 'id', label: 'label', children: 'children' }" value-key="id" placeholder="璇烽�夋嫨褰掑睘閮ㄩ棬" check-strictly /> + <el-form-item label="褰掑睘鍏徃" prop="deptId"> + <el-tree-select v-model="form.deptId" :data="enabledDeptOptions" :props="{ value: 'id', label: 'label', children: 'children' }" value-key="id" placeholder="璇烽�夋嫨褰掑睘鍏徃" check-strictly /> </el-form-item> </el-col> </el-row> @@ -130,8 +130,8 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item v-if="form.userId == undefined" label="鐢ㄦ埛鍚嶇О" prop="userName"> - <el-input v-model="form.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" maxlength="30" /> + <el-form-item v-if="form.userId == undefined" label="鐧诲綍璐﹀彿" prop="userName"> + <el-input v-model="form.userName" placeholder="璇疯緭鍏ョ櫥褰曡处鍙�" maxlength="30" /> </el-form-item> </el-col> <el-col :span="12"> @@ -259,7 +259,7 @@ // 鍒楁樉闅愪俊鎭� const columns = ref([ { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true }, - { key: 1, label: `鐢ㄦ埛鍚嶇О`, visible: true }, + { key: 1, label: `鐧诲綍璐﹀彿`, visible: true }, { key: 2, label: `鐢ㄦ埛鏄电О`, visible: true }, { key: 3, label: `閮ㄩ棬`, visible: true }, { key: 4, label: `鎵嬫満鍙风爜`, visible: true }, @@ -278,9 +278,9 @@ deptId: undefined }, rules: { - userName: [{ required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }, { min: 2, max: 20, message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿", trigger: "blur" }], + userName: [{ required: true, message: "鐧诲綍璐﹀彿涓嶈兘涓虹┖", trigger: "blur" }, { min: 2, max: 20, message: "鐧诲綍璐﹀彿闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿", trigger: "blur" }], nickName: [{ required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" }], - deptId: [{ required: true, message: "褰掑睘閮ㄩ棬涓嶈兘涓虹┖", trigger: "blur" }], + deptId: [{ required: true, message: "鍏徃涓嶈兘涓虹┖", trigger: "change" }], password: [{ required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" }, { min: 5, max: 20, message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿", trigger: "blur" }, { pattern: /^[^<>"'|\\]+$/, message: "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |", trigger: "blur" }], email: [{ type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }], phonenumber: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }] -- Gitblit v1.9.3