From 19c566cd0df5a8e74e7bfe6970e83244643c3e76 Mon Sep 17 00:00:00 2001 From: dj <1042039504@qq.com> Date: Sun, 3 Aug 2025 18:55:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(project-demand):=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E4=B8=BB=E5=AD=90=E9=A1=B9=E7=9B=AE=E5=90=8D=E7=A7=B0=E6=A8=A1?= =?UTF-8?q?=E7=B3=8A=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在项目需求汇总、成本明细、支出明细和共享明细页面添加主子项目名称模糊查询功能 - 新增相关 API 接口和方法以支持模糊查询 - 优化 fvSelect 组件以适配远程搜索功能 --- src/api/project-demand/summary/index.js | 66 +++++++++++++++++- .../expense-management/cost-detail/index.vue | 63 ++++++++++++++--- .../expend-detail/index.vue | 62 ++++++++++++++--- .../expense-management/share-detail/index.vue | 68 +++++++++++++++++-- src/views/project-demand/summary/add.vue | 13 +++- 5 files changed, 246 insertions(+), 26 deletions(-) diff --git a/src/api/project-demand/summary/index.js b/src/api/project-demand/summary/index.js index 9bf07a8..e1753da 100644 --- a/src/api/project-demand/summary/index.js +++ b/src/api/project-demand/summary/index.js @@ -107,10 +107,72 @@ export const approvePlan= (data) => { }; -export const getProjectOption = () => { +export const getProjectOption = (projectName) => { return request({ url: '/workflow/mosr/requirement/master', - method: "get" + method: "get", + params:{ + projectName:projectName + } + }); +}; +export const getMasterProjectNameOption = (masterProjectName) => { + return request({ + url: '/workflow/mosr/payment/master/option', + method: "get", + params:{ + masterProjectName:masterProjectName + } + }); +}; + +export const getSubprojectNameOption = (subProjectName) => { + return request({ + url: '/workflow/mosr/payment/sub/option', + method: "get", + params:{ + subProjectName:subProjectName + } + }); +}; + +export const getExpenseMasterProjectNameOption = (masterProjectName) => { + return request({ + url: '/workflow/mosr/rd/expense/master/option', + method: "get", + params:{ + masterProjectName:masterProjectName + } + }); +}; + +export const getExpenseSubprojectNameOption = (subProjectName) => { + return request({ + url: '/workflow/mosr/rd/expense/sub/option', + method: "get", + params:{ + subProjectName:subProjectName + } + }); +}; + +export const getCostMasterProjectNameOption = (masterProjectName) => { + return request({ + url: '/workflow/mosr/cost/share/master/option', + method: "get", + params:{ + masterProjectName:masterProjectName + } + }); +}; + +export const getCostSubprojectNameOption = (subProjectName) => { + return request({ + url: '/workflow/mosr/cost/share/sub/option', + method: "get", + params:{ + subProjectName:subProjectName + } }); }; diff --git a/src/views/expense-management/cost-detail/index.vue b/src/views/expense-management/cost-detail/index.vue index d0b2ea4..1e2a071 100644 --- a/src/views/expense-management/cost-detail/index.vue +++ b/src/views/expense-management/cost-detail/index.vue @@ -15,6 +15,12 @@ import {reactive, ref} from "vue"; import {useRoute, useRouter} from "vue-router"; import {costTemplateDownload, exportExcel, ledgerTemplateDownload} from "../../../api/project-manage"; import ImportCostExcel from "@/components/ImportCostExcel.vue"; +import fvSelect from "@/fvcomponents/fvSelect/index.vue"; +import { + getExpenseMasterProjectNameOption, getExpenseSubprojectNameOption, + getMasterProjectNameOption, + getSubprojectNameOption +} from "@/api/project-demand/summary/index.js"; const router = useRouter() const route = useRoute() const searchConfig = ref([ @@ -22,24 +28,65 @@ const searchConfig = ref([ { label: '主项目', prop: 'masterProjectName', - component: 'el-input', + component: shallowRef(fvSelect), props: { - placeholder: '请输入主项目查询', + placeholder: '请输入主项目', clearable: true, filterable: true, - checkStrictly: true - } + options: [], + remote: true, + remoteMethod:async (val)=>{ + console.log('val',val) + if(val){ + const res=await getExpenseMasterProjectNameOption(val) + if(res.code==1000){ + let optionObj={} + let optionsMap = new Map(); + res.data.forEach(item=>{ + optionObj={ + value:item.label, + label:item.label + } + optionsMap.set(optionObj.value, optionObj); + }) + // 将 Map 转换为数组 + searchConfig.value.find(item => item.prop == 'masterProjectName').props.options = Array.from(optionsMap.values()) + } + } + } + }, }, { label: '子项目', prop: 'subProjectName', - component: 'el-input', + component: shallowRef(fvSelect), props: { - placeholder: '请输入子项目查询', + placeholder: '请输入子项目', clearable: true, filterable: true, - checkStrictly: true - } + options: [], + remote: true, + remoteMethod:async (val)=>{ + if(val){ + const res=await getExpenseSubprojectNameOption(val) + if(res.code==1000){ + let optionObj={} + let optionsMap = new Map(); + res.data.forEach(item=>{ + if (item.value !== null && item.value !== "") { // 过滤 value 为 null 和 "" 的数据 + optionObj={ + value:item.label, + label:item.label + } + optionsMap.set(optionObj.value, optionObj); + } + }) + // 将 Map 转换为数组 + searchConfig.value.find(item => item.prop == 'subProjectName').props.options = Array.from(optionsMap.values()) + } + } + } + }, }, { label: '会计凭证记载金额(元)', diff --git a/src/views/expense-management/expend-detail/index.vue b/src/views/expense-management/expend-detail/index.vue index ba7e5d2..43aaf67 100644 --- a/src/views/expense-management/expend-detail/index.vue +++ b/src/views/expense-management/expend-detail/index.vue @@ -11,6 +11,11 @@ import fvSelect from '@/fvcomponents/fvSelect/index.vue' import {toThousands} from '@/utils/changePrice.js' import { getSubCompOpt } from '@/api/user/user.js'; +import { + getMasterProjectNameOption, + getRequirementName, + getSubprojectNameOption +} from "@/api/project-demand/summary/index.js"; const router = useRouter() const route = useRoute() const searchConfig = ref( @@ -19,24 +24,65 @@ const searchConfig = ref( { label: '主项目', prop: 'masterProjectName', - component: 'el-input', + component: shallowRef(fvSelect), props: { - placeholder: '请输入主项目查询', + placeholder: '请输入主项目', clearable: true, filterable: true, - checkStrictly: true - } + options: [], + remote: true, + remoteMethod:async (val)=>{ + console.log('val',val) + if(val){ + const res=await getMasterProjectNameOption(val) + if(res.code==1000){ + let optionObj={} + let optionsMap = new Map(); + res.data.forEach(item=>{ + optionObj={ + value:item.label, + label:item.label + } + optionsMap.set(optionObj.value, optionObj); + }) + // 将 Map 转换为数组 + searchConfig.value.find(item => item.prop == 'masterProjectName').props.options = Array.from(optionsMap.values()) + } + } + } + }, }, { label: '子项目', prop: 'subProjectName', - component: 'el-input', + component: shallowRef(fvSelect), props: { - placeholder: '请输入子项目查询', + placeholder: '请输入子项目', clearable: true, filterable: true, - checkStrictly: true - } + options: [], + remote: true, + remoteMethod:async (val)=>{ + if(val){ + const res=await getSubprojectNameOption(val) + if(res.code==1000){ + let optionObj={} + let optionsMap = new Map(); + res.data.forEach(item=>{ + if (item.value !== null && item.value !== "") { // 过滤 value 为 null 和 "" 的数据 + optionObj={ + value:item.label, + label:item.label + } + optionsMap.set(optionObj.value, optionObj); + } + }) + // 将 Map 转换为数组 + searchConfig.value.find(item => item.prop == 'subProjectName').props.options = Array.from(optionsMap.values()) + } + } + } + }, }, { label: '项目类型', diff --git a/src/views/expense-management/share-detail/index.vue b/src/views/expense-management/share-detail/index.vue index 98efea8..688ca8c 100644 --- a/src/views/expense-management/share-detail/index.vue +++ b/src/views/expense-management/share-detail/index.vue @@ -16,19 +16,77 @@ import { getSubCompOpt } from '@/api/user/user.js'; import {reactive, ref} from "vue"; import {shareDetailExport, shareExportExcel} from "@/api/expense-manage"; import {ElMessage} from "element-plus"; +import { + getCostMasterProjectNameOption, getCostSubprojectNameOption, + getMasterProjectNameOption, + getSubprojectNameOption +} from "@/api/project-demand/summary/index.js"; const router = useRouter() const route = useRoute() -const searchConfig = reactive([ +const searchConfig = ref([ + + { + label: '主项目', + prop: 'masterProjectName', + component: shallowRef(fvSelect), + props: { + placeholder: '请输入主项目', + clearable: true, + filterable: true, + options: [], + remote: true, + remoteMethod:async (val)=>{ + console.log('val',val) + if(val){ + const res=await getCostMasterProjectNameOption(val) + if(res.code==1000){ + let optionObj={} + let optionsMap = new Map(); + res.data.forEach(item=>{ + optionObj={ + value:item.label, + label:item.label + } + optionsMap.set(optionObj.value, optionObj); + }) + // 将 Map 转换为数组 + searchConfig.value.find(item => item.prop == 'masterProjectName').props.options = Array.from(optionsMap.values()) + } + } + } + }, + }, { label: '子项目', prop: 'subProjectName', - component: 'el-input', + component: shallowRef(fvSelect), props: { - placeholder: '请输入子项目查询', + placeholder: '请输入子项目', clearable: true, filterable: true, - checkStrictly: true - } + options: [], + remote: true, + remoteMethod:async (val)=>{ + if(val){ + const res=await getCostSubprojectNameOption(val) + if(res.code==1000){ + let optionObj={} + let optionsMap = new Map(); + res.data.forEach(item=>{ + if (item.value !== null && item.value !== "") { // 过滤 value 为 null 和 "" 的数据 + optionObj={ + value:item.label, + label:item.label + } + optionsMap.set(optionObj.value, optionObj); + } + }) + // 将 Map 转换为数组 + searchConfig.value.find(item => item.prop == 'subProjectName').props.options = Array.from(optionsMap.values()) + } + } + } + }, }, // { // label: '支付月份', diff --git a/src/views/project-demand/summary/add.vue b/src/views/project-demand/summary/add.vue index 30f15cb..858f74b 100644 --- a/src/views/project-demand/summary/add.vue +++ b/src/views/project-demand/summary/add.vue @@ -221,7 +221,7 @@ :style="{marginLeft:!formData.isSpecialFund?route.query.id?'-10px':'-10px':route.query.id?'0':'-40px'}"> + @change="changeCollectData" remote filterable :remote-method="filterMasterProject"> { localStorage.setItem('collectData', JSON.stringify(params)) } } + +const filterMasterProject= (val)=>{ + if(val){ + getProjectList(val) + } +} + const handleShowOptionalChargeLeadershipPicker = () => { optionalChargeLeadershipPickerRef.value.showUserPicker() } @@ -584,8 +591,8 @@ const disabledDate = (time) => { return time.getTime() < new Date(formData.value.startTime).getTime(); } -const getProjectList = () => { - getProjectOption().then(res => { +const getProjectList = (val) => { + getProjectOption(val).then(res => { if (res.code === 1000) { if(name.value === 'Summary/edit'){ masterProjectList.value = res.data.filter(item => item.value!=route.query.projectId)