明树Git Lab

Commit 09d31d4e authored by zhanghan's avatar zhanghan

组件修改

parent a16431ee
Pipeline #109176 passed with stage
in 21 seconds
...@@ -3,10 +3,13 @@ ...@@ -3,10 +3,13 @@
<div class="add-project-content" v-loading="loading"> <div class="add-project-content" v-loading="loading">
<routerBack /> <routerBack />
<div class="tabs-content"> <div class="tabs-content">
<div class="project-tab-content"> <div class="project-tab-content-wrapper">
<div class="tab-content"> <div class="tab-content">
<el-form :model="formData" label-width="150" :disabled="isPreview"> <el-form :model="formData" label-width="150" :disabled="isPreview">
<el-collapse v-model="activeCollapse"> <el-collapse
v-model="activeCollapse"
v-collapse-nav="navigationItems"
>
<el-collapse-item title="项目基本信息" name="项目基本信息"> <el-collapse-item title="项目基本信息" name="项目基本信息">
<el-row :gutter="24"> <el-row :gutter="24">
<el-col :span="6"> <el-col :span="6">
...@@ -132,67 +135,87 @@ ...@@ -132,67 +135,87 @@
</el-collapse-item> </el-collapse-item>
<el-collapse-item <el-collapse-item
title="投资额完成情况(万元)" title="投资额完成情况(单位:万元)"
name="投资额完成情况(万元)" name="投资额完成情况(单位:万元)"
><el-row gutter="20"> ><el-row gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="260px" label-width="260px"
label="项目投资总额(决策值)(万元)" label="项目投资总额(决策值)"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.tzzejc" v-model="formData.tzzejc"
placeholder="请输入项目投资总额(决策值)(万元)" placeholder="请输入项目投资总额(决策值)"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="260px" label-width="260px"
label="我方资本金出资额-决策值(万元)" label="我方资本金出资额-决策值"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.wfzbjczejc" v-model="formData.wfzbjczejc"
placeholder="请输入我方资本金出资额-决策值(万元)" placeholder="请输入我方资本金出资额-决策值"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="260px" label-width="260px"
label="投资总额-实际值(万元)" label="投资总额-实际值"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.tzzesj" v-model="formData.tzzesj"
placeholder="请输入投资总额-实际值(万元)" placeholder="请输入投资总额-实际值"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="260px" label-width="260px"
label="我方资本金出资额--实际值(万元)" label="我方资本金出资额--实际值"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.wfzbjczesj" v-model="formData.wfzbjczesj"
placeholder="请输入我方资本金出资额--实际值(万元)" placeholder="请输入我方资本金出资额--实际值"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="260px" label-width="260px"
label="投资总额-计划值(万元)" label="投资总额-计划值"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.tzzejhz" v-model="formData.tzzejhz"
placeholder="请输入投资总额-计划值(万元)" placeholder="请输入投资总额-计划值"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
...@@ -207,14 +230,18 @@ ...@@ -207,14 +230,18 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="260px" label-width="260px"
label="本年完成 投资回收决策目标值(万元)" label="本年完成 投资回收决策目标值"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.bnwc" v-model="formData.bnwc"
type="number" type="number"
placeholder="请输入本年完成 投资回收决策目标值(万元)" placeholder="请输入本年完成 投资回收决策目标值"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
...@@ -222,38 +249,50 @@ ...@@ -222,38 +249,50 @@
label-width="260px" label-width="260px"
label="截止本年累计(决策目标值)" label="截止本年累计(决策目标值)"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.jzbnlj" v-model="formData.jzbnlj"
type="number" type="number"
placeholder="请输入截止本年累计(决策目标值)" placeholder="请输入截止本年累计(决策目标值)"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="260px" label-width="260px"
label="下一年完成数(万元)" label="下一年完成数"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.xynwcs" v-model="formData.xynwcs"
type="number" type="number"
placeholder="请输入下一年完成数(万元)" placeholder="请输入下一年完成数"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="260px" label-width="260px"
label="本年计划(万元)" label="本年计划"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.bnjh" v-model="formData.bnjh"
type="number" type="number"
placeholder="请输入本年计划(万元)" placeholder="请输入本年计划"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
...@@ -261,14 +300,18 @@ ...@@ -261,14 +300,18 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="260px" label-width="260px"
label="本年完成--投资回收实际值(万元)" label="本年完成--投资回收实际值"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.bnwcsjz" v-model="formData.bnwcsjz"
type="number" type="number"
placeholder="请输入本年完成--投资回收实际值(万元)" placeholder="请输入本年完成--投资回收实际值"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
...@@ -276,35 +319,47 @@ ...@@ -276,35 +319,47 @@
label-width="260px" label-width="260px"
label="截止本年累计--投资回收实际值" label="截止本年累计--投资回收实际值"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.jzbnljsjz" v-model="formData.jzbnljsjz"
type="number" type="number"
placeholder="请输入截止本年累计--投资回收实际值" placeholder="请输入截止本年累计--投资回收实际值"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="260px" label-width="260px"
label="累计欠收(万元)" label="累计欠收"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.ljqs" v-model="formData.ljqs"
type="number" type="number"
placeholder="请输入累计欠收(万元)" placeholder="请输入累计欠收"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item lable-width="240px" label="完成率(%)"> <el-form-item label-width="260px" label="完成率">
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.wcl" v-model="formData.wcl"
type="number" type="number"
placeholder="请输入完成率(%)" placeholder="请输入完成率"
/> >
<template #suffix>
<span>%</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
...@@ -425,6 +480,15 @@ ...@@ -425,6 +480,15 @@
</el-collapse> </el-collapse>
</el-form> </el-form>
</div> </div>
<div class="navigation-wrapper">
<CollapseNavigation
:nav-items="navigationItems"
:active-item="activeCollapse"
title="目录导航"
width="auto"
@nav-click="handleNavClick"
/>
</div>
</div> </div>
</div> </div>
<div class="add-project-header"> <div class="add-project-header">
...@@ -462,6 +526,7 @@ import { ...@@ -462,6 +526,7 @@ import {
getCurrentInstance, getCurrentInstance,
h, h,
computed, computed,
nextTick,
} from "vue"; } from "vue";
import { useRouter, useRoute } from "vue-router"; import { useRouter, useRoute } from "vue-router";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
...@@ -469,6 +534,7 @@ import DynamicTable from "@/components/FormDynamicTable/index.vue"; ...@@ -469,6 +534,7 @@ import DynamicTable from "@/components/FormDynamicTable/index.vue";
import FinancialTable from "@/components/FinancialTable.vue"; import FinancialTable from "@/components/FinancialTable.vue";
import InvestmentRecoveryTable from "@/components/InvestmentRecoveryTable.vue"; import InvestmentRecoveryTable from "@/components/InvestmentRecoveryTable.vue";
import routerBack from "@/components/common/routerBack.vue"; import routerBack from "@/components/common/routerBack.vue";
import CollapseNavigation from "@/components/CollapseNavigation/index.vue";
const transferColumns = ref([ const transferColumns = ref([
{ {
prop: "njfcgbl", prop: "njfcgbl",
...@@ -512,6 +578,60 @@ const router = useRouter(); ...@@ -512,6 +578,60 @@ const router = useRouter();
const route = useRoute(); const route = useRoute();
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
// ========== 导航配置(由 v-collapse-nav 指令自动生成) ==========
const navigationItems = ref([]);
// 导航点击处理
const handleNavClick = (item) => {
console.log("Navigation clicked:", item);
// 点击导航时自动展开对应的折叠面板
if (!activeCollapse.value.includes(item.name)) {
activeCollapse.value.push(item.name);
}
// 等待 DOM 更新后滚动
nextTick(() => {
setTimeout(() => {
const targetId = `collapse-${item.name}`;
const targetElement = document.getElementById(targetId);
console.log("Scrolling to element:", {
targetId,
found: !!targetElement,
element: targetElement,
});
if (targetElement) {
// 使用 scrollIntoView 获得更平滑的效果
targetElement.scrollIntoView({
behavior: "smooth",
block: "start",
inline: "nearest",
});
// 可选:添加额外的偏移量调整
setTimeout(() => {
const elementPosition = targetElement.getBoundingClientRect().top;
if (elementPosition < 80) {
// 如果距离顶部太近,向上滚动一点
window.scrollBy({
top: elementPosition - 80,
behavior: "smooth",
});
}
}, 300);
} else {
console.error("Element not found:", targetId);
console.log(
"Available collapse elements:",
document.querySelectorAll('[id^="collapse-"]'),
);
}
}, 300); // 增加延迟确保动画完成
});
};
// 表单数据 // 表单数据
let initTableData = () => { let initTableData = () => {
// 使用 Object.assign 直接替换整个对象,而不是合并 // 使用 Object.assign 直接替换整个对象,而不是合并
...@@ -1262,6 +1382,24 @@ onMounted(() => { ...@@ -1262,6 +1382,24 @@ onMounted(() => {
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
// 布局容器
.project-tab-content-wrapper {
display: flex;
gap: 20px;
position: relative;
}
.tab-content {
flex: 1;
min-width: 0; // 防止flex子项溢出
}
.navigation-wrapper {
flex-shrink: 0;
width: auto;
padding-left: 10px;
}
.DynamicTable-slot { .DynamicTable-slot {
display: flex; display: flex;
div { div {
......
...@@ -3,10 +3,13 @@ ...@@ -3,10 +3,13 @@
<div class="add-project-content" v-loading="loading"> <div class="add-project-content" v-loading="loading">
<routerBack /> <routerBack />
<div class="tabs-content"> <div class="tabs-content">
<div class="project-tab-content"> <div class="project-tab-content-wrapper">
<div class="tab-content"> <div class="tab-content">
<el-form :model="formData" :label-width="80" :disabled="isPreview"> <el-form :model="formData" :label-width="80" :disabled="isPreview">
<el-collapse v-model="activeCollapse"> <el-collapse
v-model="activeCollapse"
v-collapse-nav="navigationItems"
>
<el-collapse-item title="项目信息" name="项目信息"> <el-collapse-item title="项目信息" name="项目信息">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
...@@ -979,6 +982,15 @@ ...@@ -979,6 +982,15 @@
</el-collapse> </el-collapse>
</el-form> </el-form>
</div> </div>
<div class="navigation-wrapper">
<CollapseNavigation
:nav-items="navigationItems"
:active-item="activeCollapse"
title="目录导航"
width="auto"
@nav-click="handleNavClick"
/>
</div>
</div> </div>
</div> </div>
<div class="add-project-header"> <div class="add-project-header">
...@@ -994,11 +1006,12 @@ ...@@ -994,11 +1006,12 @@
</div> </div>
</template> </template>
<script setup> <script setup>
import { reactive, ref, onMounted, getCurrentInstance } from "vue"; import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { useRouter, useRoute } from "vue-router"; import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus"; import { ElMessage, ElMessageBox } from "element-plus";
import FileUploader from "@/components/FileUploader/index.vue"; import FileUploader from "@/components/FileUploader/index.vue";
import routerBack from "@/components/common/routerBack.vue"; import routerBack from "@/components/common/routerBack.vue";
import CollapseNavigation from "@/components/CollapseNavigation/index.vue";
import { useUserStore } from "@/stores/user.js"; import { useUserStore } from "@/stores/user.js";
const userStore = useUserStore(); const userStore = useUserStore();
...@@ -1016,6 +1029,60 @@ const activeCollapse = reactive([ ...@@ -1016,6 +1029,60 @@ const activeCollapse = reactive([
"其他建设目标重大偏差", "其他建设目标重大偏差",
"投资收益", "投资收益",
]); ]);
// ========== 导航配置(由 v-collapse-nav 指令自动生成) ==========
const navigationItems = ref([]);
// 导航点击处理
const handleNavClick = (item) => {
console.log("Navigation clicked:", item);
// 点击导航时自动展开对应的折叠面板
if (!activeCollapse.includes(item.name)) {
activeCollapse.push(item.name);
}
// 等待 DOM 更新后滚动
nextTick(() => {
setTimeout(() => {
const targetId = `collapse-${item.name}`;
const targetElement = document.getElementById(targetId);
console.log("Scrolling to element:", {
targetId,
found: !!targetElement,
element: targetElement,
});
if (targetElement) {
// 使用 scrollIntoView 获得更平滑的效果
targetElement.scrollIntoView({
behavior: "smooth",
block: "start",
inline: "nearest",
});
// 可选:添加额外的偏移量调整
setTimeout(() => {
const elementPosition = targetElement.getBoundingClientRect().top;
if (elementPosition < 80) {
// 如果距离顶部太近,向上滚动一点
window.scrollBy({
top: elementPosition - 80,
behavior: "smooth",
});
}
}, 300);
} else {
console.error("Element not found:", targetId);
console.log(
"Available collapse elements:",
document.querySelectorAll('[id^="collapse-"]'),
);
}
}, 300); // 增加延迟确保动画完成
});
};
let formData = reactive({}); let formData = reactive({});
let loading = ref(false); let loading = ref(false);
...@@ -1572,6 +1639,24 @@ const saveClick = () => { ...@@ -1572,6 +1639,24 @@ const saveClick = () => {
</script> </script>
<style lang="less"> <style lang="less">
// 布局容器
.project-tab-content-wrapper {
display: flex;
gap: 20px;
position: relative;
}
.tab-content {
flex: 1;
min-width: 0; // 防止flex子项溢出
}
.navigation-wrapper {
flex-shrink: 0;
width: auto;
padding-left: 10px;
}
.fileCla { .fileCla {
.el-form-item { .el-form-item {
display: block !important; display: block !important;
......
...@@ -3,10 +3,13 @@ ...@@ -3,10 +3,13 @@
<div class="add-project-content" v-loading="loading"> <div class="add-project-content" v-loading="loading">
<routerBack /> <routerBack />
<div class="tabs-content"> <div class="tabs-content">
<div class="project-tab-content"> <div class="project-tab-content-wrapper">
<div class="tab-content"> <div class="tab-content">
<el-form :model="formData" label-width="150" :disabled="isPreview"> <el-form :model="formData" label-width="150" :disabled="isPreview">
<el-collapse v-model="activeCollapse"> <el-collapse
v-model="activeCollapse"
v-collapse-nav="navigationItems"
>
<el-collapse-item title="项目基本信息" name="项目基本信息"> <el-collapse-item title="项目基本信息" name="项目基本信息">
<el-row :gutter="24"> <el-row :gutter="24">
<el-col :span="6"> <el-col :span="6">
...@@ -132,67 +135,87 @@ ...@@ -132,67 +135,87 @@
</el-collapse-item> </el-collapse-item>
<el-collapse-item <el-collapse-item
title="投资额完成情况(万元)" title="投资额完成情况(单位:万元)"
name="投资额完成情况(万元)" name="投资额完成情况(单位:万元)"
><el-row gutter="20"> ><el-row gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="280px" label-width="280px"
label="项目投资总额(决策值)(万元)" label="项目投资总额(决策值)"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.tzzejc" v-model="formData.tzzejc"
placeholder="请输入项目投资总额(决策值)(万元)" placeholder="请输入项目投资总额(决策值)"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="280px" label-width="280px"
label="我方资本金出资额-决策值(万元)" label="我方资本金出资额-决策值"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.wfzbjczejc" v-model="formData.wfzbjczejc"
placeholder="请输入我方资本金出资额-决策值(万元)" placeholder="请输入我方资本金出资额-决策值"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="280px" label-width="280px"
label="投资总额-实际值(万元)" label="投资总额-实际值"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.tzzesj" v-model="formData.tzzesj"
placeholder="请输入投资总额-实际值(万元)" placeholder="请输入投资总额-实际值"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="280px" label-width="280px"
label="我方资本金出资额--实际值(万元)" label="我方资本金出资额--实际值"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.wfzbjczesj" v-model="formData.wfzbjczesj"
placeholder="请输入我方资本金出资额--实际值(万元)" placeholder="请输入我方资本金出资额--实际值"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="280px" label-width="280px"
label="投资总额-计划值(万元)" label="投资总额-计划值"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.tzzejhz" v-model="formData.tzzejhz"
placeholder="请输入投资总额-计划值(万元)" placeholder="请输入投资总额-计划值"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
...@@ -207,14 +230,18 @@ ...@@ -207,14 +230,18 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="280px" label-width="280px"
label="本年完成 投资回收决策目标值(万元)" label="本年完成 投资回收决策目标值"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.bnwc" v-model="formData.bnwc"
type="number" type="number"
placeholder="请输入本年完成 投资回收决策目标值(万元)" placeholder="请输入本年完成 投资回收决策目标值"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
...@@ -222,38 +249,50 @@ ...@@ -222,38 +249,50 @@
label-width="280px" label-width="280px"
label="截止本年累计(决策目标值)" label="截止本年累计(决策目标值)"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.jzbnlj" v-model="formData.jzbnlj"
type="number" type="number"
placeholder="请输入截止本年累计(决策目标值)" placeholder="请输入截止本年累计(决策目标值)"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="280px" label-width="280px"
label="下一年完成数(万元)" label="下一年完成数"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.xynwcs" v-model="formData.xynwcs"
type="number" type="number"
placeholder="请输入下一年完成数(万元)" placeholder="请输入下一年完成数"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="280px" label-width="280px"
label="本年计划(万元)" label="本年计划"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.bnjh" v-model="formData.bnjh"
type="number" type="number"
placeholder="请输入本年计划(万元)" placeholder="请输入本年计划"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
...@@ -261,14 +300,18 @@ ...@@ -261,14 +300,18 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="280px" label-width="280px"
label="本年完成--投资回收实际值(万元)" label="本年完成--投资回收实际值"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.bnwcsjz" v-model="formData.bnwcsjz"
type="number" type="number"
placeholder="请输入本年完成--投资回收实际值(万元)" placeholder="请输入本年完成--投资回收实际值"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
...@@ -276,35 +319,47 @@ ...@@ -276,35 +319,47 @@
label-width="280px" label-width="280px"
label="截止本年累计--投资回收实际值" label="截止本年累计--投资回收实际值"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.jzbnljsjz" v-model="formData.jzbnljsjz"
type="number" type="number"
placeholder="请输入截止本年累计--投资回收实际值" placeholder="请输入截止本年累计--投资回收实际值"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label-width="280px" label-width="280px"
label="累计欠收(万元)" label="累计欠收"
> >
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.ljqs" v-model="formData.ljqs"
type="number" type="number"
placeholder="请输入累计欠收(万元)" placeholder="请输入累计欠收"
/> >
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label-width="280px" label="完成率(%)"> <el-form-item label-width="280px" label="完成率">
<el-input-number <el-input
precision="2" precision="2"
v-model="formData.wcl" v-model="formData.wcl"
type="number" type="number"
placeholder="请输入完成率(%)" placeholder="请输入完成率"
/> >
<template #suffix>
<span>%</span>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
...@@ -425,6 +480,15 @@ ...@@ -425,6 +480,15 @@
</el-collapse> </el-collapse>
</el-form> </el-form>
</div> </div>
<div class="navigation-wrapper">
<CollapseNavigation
:nav-items="navigationItems"
:active-item="activeCollapse"
title="目录导航"
width="auto"
@nav-click="handleNavClick"
/>
</div>
</div> </div>
</div> </div>
<div class="add-project-header"> <div class="add-project-header">
...@@ -462,6 +526,7 @@ import { ...@@ -462,6 +526,7 @@ import {
getCurrentInstance, getCurrentInstance,
h, h,
computed, computed,
nextTick,
} from "vue"; } from "vue";
import { useRouter, useRoute } from "vue-router"; import { useRouter, useRoute } from "vue-router";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
...@@ -469,6 +534,7 @@ import DynamicTable from "@/components/FormDynamicTable/index.vue"; ...@@ -469,6 +534,7 @@ import DynamicTable from "@/components/FormDynamicTable/index.vue";
import FinancialTable from "@/components/FinancialTable.vue"; import FinancialTable from "@/components/FinancialTable.vue";
import InvestmentRecoveryTable from "@/components/InvestmentRecoveryTable.vue"; import InvestmentRecoveryTable from "@/components/InvestmentRecoveryTable.vue";
import routerBack from "@/components/common/routerBack.vue"; import routerBack from "@/components/common/routerBack.vue";
import CollapseNavigation from "@/components/CollapseNavigation/index.vue";
const transferColumns = ref([ const transferColumns = ref([
{ {
prop: "njfcgbl", prop: "njfcgbl",
...@@ -512,6 +578,60 @@ const router = useRouter(); ...@@ -512,6 +578,60 @@ const router = useRouter();
const route = useRoute(); const route = useRoute();
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
// ========== 导航配置(由 v-collapse-nav 指令自动生成) ==========
const navigationItems = ref([]);
// 导航点击处理
const handleNavClick = (item) => {
console.log("Navigation clicked:", item);
// 点击导航时自动展开对应的折叠面板
if (!activeCollapse.value.includes(item.name)) {
activeCollapse.value.push(item.name);
}
// 等待 DOM 更新后滚动
nextTick(() => {
setTimeout(() => {
const targetId = `collapse-${item.name}`;
const targetElement = document.getElementById(targetId);
console.log("Scrolling to element:", {
targetId,
found: !!targetElement,
element: targetElement,
});
if (targetElement) {
// 使用 scrollIntoView 获得更平滑的效果
targetElement.scrollIntoView({
behavior: "smooth",
block: "start",
inline: "nearest",
});
// 可选:添加额外的偏移量调整
setTimeout(() => {
const elementPosition = targetElement.getBoundingClientRect().top;
if (elementPosition < 80) {
// 如果距离顶部太近,向上滚动一点
window.scrollBy({
top: elementPosition - 80,
behavior: "smooth",
});
}
}, 300);
} else {
console.error("Element not found:", targetId);
console.log(
"Available collapse elements:",
document.querySelectorAll('[id^="collapse-"]'),
);
}
}, 300); // 增加延迟确保动画完成
});
};
// 表单数据 // 表单数据
let initTableData = () => { let initTableData = () => {
// 使用 Object.assign 直接替换整个对象,而不是合并 // 使用 Object.assign 直接替换整个对象,而不是合并
...@@ -1262,6 +1382,24 @@ onMounted(() => { ...@@ -1262,6 +1382,24 @@ onMounted(() => {
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
// 布局容器
.project-tab-content-wrapper {
display: flex;
gap: 20px;
position: relative;
}
.tab-content {
flex: 1;
min-width: 0; // 防止flex子项溢出
}
.navigation-wrapper {
flex-shrink: 0;
width: auto;
padding-left: 10px;
}
.DynamicTable-slot { .DynamicTable-slot {
display: flex; display: flex;
div { div {
......
...@@ -12,7 +12,11 @@ ...@@ -12,7 +12,11 @@
label-width="160px" label-width="160px"
:disabled="isPreview" :disabled="isPreview"
> >
<el-collapse v-model="activeCollapse"> <el-collapse
v-collapse-nav="navigationItems"
v-model="activeCollapse"
>
<!-- 1. 项目基本信息 -->
<el-collapse-item title="项目基本信息" name="项目基本信息"> <el-collapse-item title="项目基本信息" name="项目基本信息">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
...@@ -41,10 +45,7 @@ ...@@ -41,10 +45,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item <el-form-item label="申报单位企业规格">
label-width="180px"
label="申报单位企业规格"
>
<el-select <el-select
v-model="jcFormData.sbdwqygg" v-model="jcFormData.sbdwqygg"
placeholder="请选择" placeholder="请选择"
...@@ -65,12 +66,9 @@ ...@@ -65,12 +66,9 @@
<el-input-number <el-input-number
v-model="jcFormData.xmztz" v-model="jcFormData.xmztz"
:min="0" :min="0"
:max="99999999999.99999999"
controls-position="right" controls-position="right"
> >
<template #suffix> <template #suffix><span>万元</span></template>
<span>万元</span>
</template>
</el-input-number> </el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
...@@ -85,134 +83,16 @@ ...@@ -85,134 +83,16 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="项目区域">
<el-select
v-model="jcFormData.xmqy"
placeholder="请选择"
no-data-text="暂无数据"
clearable
>
<el-option
v-for="item in xmqyList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="境内/外">
<el-select
v-model="jcFormData.jnw"
placeholder="请选择"
no-data-text="暂无数据"
clearable
@change="changeJcJnw"
>
<el-option
v-for="item in jnwList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
label-width="180px"
label="省(境内)/洲际(境外)"
>
<el-select
v-model="jcFormData.sjnzjjw"
placeholder="请选择"
no-data-text="暂无数据"
clearable
@change="changeJcSzj"
>
<el-option
v-for="item in jcSzjList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="地市(境内)/国家(境外)">
<el-select
v-model="jcFormData.dsjngjjw"
placeholder="请选择"
no-data-text="暂无数据"
clearable
@change="changeJcDsgj"
>
<el-option
v-for="item in jcDsgjList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="区县(境内)/国家(境外)">
<el-select
v-model="jcFormData.qxjngjjw"
placeholder="请选择"
no-data-text="暂无数据"
clearable
>
<el-option
v-for="item in jcQxgjList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="币种">
<el-select
v-model="jcFormData.bizhong"
placeholder="请选择"
no-data-text="暂无数据"
clearable
>
<el-option
v-for="item in bzList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="汇率">
<el-input-number
v-model="jcFormData.huilv"
:min="0"
:max="99999999999.99999999"
controls-position="right"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投资模式"> <el-form-item label="投资模式">
<el-input v-model="jcFormData.tzms" /> <el-input v-model="jcFormData.tzms" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="8">
<el-form-item label="对外签约品牌"> <el-form-item label="对外签约品牌">
<el-input v-model="jcFormData.dwqypp" /> <el-input v-model="jcFormData.dwqypp" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="8">
<el-form-item label="是否能建重大或重要投资"> <el-form-item label="是否能建重大或重要投资">
<el-radio-group v-model="jcFormData.sfnjzdhzytz"> <el-radio-group v-model="jcFormData.sfnjzdhzytz">
<el-radio <el-radio
...@@ -232,7 +112,7 @@ ...@@ -232,7 +112,7 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="8">
<el-form-item label="能建是否牵头方"> <el-form-item label="能建是否牵头方">
<el-radio-group v-model="jcFormData.njsfqtf"> <el-radio-group v-model="jcFormData.njsfqtf">
<el-radio <el-radio
...@@ -252,7 +132,18 @@ ...@@ -252,7 +132,18 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="8">
<el-form-item label="能建占股比">
<el-input-number
v-model="jcFormData.njzgb"
:min="0"
controls-position="right"
>
<template #suffix><span>%</span></template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否PPP项目"> <el-form-item label="是否PPP项目">
<el-radio-group v-model="jcFormData.sfpppxm"> <el-radio-group v-model="jcFormData.sfpppxm">
<el-radio <el-radio
...@@ -272,21 +163,6 @@ ...@@ -272,21 +163,6 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8">
<el-form-item label="能建占股比">
<el-input-number
v-model="jcFormData.njzgb"
:min="0"
:max="99999.99"
controls-position="right"
>
<template #suffix>
<span>%</span>
</template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="项目资金来源"> <el-form-item label="项目资金来源">
<el-select <el-select
...@@ -424,66 +300,6 @@ ...@@ -424,66 +300,6 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="运营年限">
<el-input-number
v-model="jcFormData.yynxn"
:min="0"
:max="99999999999.99999999"
controls-position="right"
>
<template #suffix>
<span></span>
</template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目建设期">
<el-input-number
v-model="jcFormData.xmjsqy"
:min="0"
:max="99999999999.99999999"
controls-position="right"
>
<template #suffix>
<span></span>
</template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目合作期">
<el-input-number
v-model="jcFormData.xmhzqn"
:min="0"
:max="99999999999.99999999"
controls-position="right"
>
<template #suffix>
<span></span>
</template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目开工时间(预计)">
<el-date-picker
v-model="jcFormData.xmkgsjyj"
type="date"
placeholder="请选择"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目交工时间(预计)">
<el-date-picker
v-model="jcFormData.xmjgsjyj"
type="date"
placeholder="请选择"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="是否已经立项"> <el-form-item label="是否已经立项">
<el-radio-group v-model="jcFormData.sfyjlx"> <el-radio-group v-model="jcFormData.sfyjlx">
<el-radio <el-radio
...@@ -564,9 +380,7 @@ ...@@ -564,9 +380,7 @@
placeholder="请选择" placeholder="请选择"
no-data-text="暂无数据" no-data-text="暂无数据"
clearable clearable
> ></el-select>
<!-- todo -->
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
...@@ -601,20 +415,14 @@ ...@@ -601,20 +415,14 @@
<el-input-number <el-input-number
v-model="jcFormData.cblrl" v-model="jcFormData.cblrl"
:min="0" :min="0"
:max="99999.99"
controls-position="right" controls-position="right"
> >
<template #suffix> <template #suffix><span>%</span></template>
<span>%</span>
</template>
</el-input-number> </el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item <el-form-item label="未通过主要原因与要求">
label="未通过主要原因与要求"
:label-width="160"
>
<el-input <el-input
v-model="jcFormData.wtgzyyyyyq" v-model="jcFormData.wtgzyyyyyq"
type="textarea" type="textarea"
...@@ -624,6 +432,189 @@ ...@@ -624,6 +432,189 @@
</el-col> </el-col>
</el-row> </el-row>
</el-collapse-item> </el-collapse-item>
<!-- 2. 项目所在地 -->
<el-collapse-item title="项目所在地" name="项目所在地">
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="境内/外">
<el-select
v-model="jcFormData.jnw"
placeholder="请选择"
no-data-text="暂无数据"
clearable
@change="changeJcJnw"
>
<el-option
v-for="item in jnwList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="省(境内)/洲际(境外)">
<el-select
v-model="jcFormData.sjnzjjw"
placeholder="请选择"
no-data-text="暂无数据"
clearable
@change="changeJcSzj"
>
<el-option
v-for="item in jcSzjList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="地市(境内)/国家(境外)">
<el-select
v-model="jcFormData.dsjngjjw"
placeholder="请选择"
no-data-text="暂无数据"
clearable
@change="changeJcDsgj"
>
<el-option
v-for="item in jcDsgjList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="区县(境内)/国家(境外)">
<el-select
v-model="jcFormData.qxjngjjw"
placeholder="请选择"
no-data-text="暂无数据"
clearable
>
<el-option
v-for="item in jcQxgjList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目区域">
<el-select
v-model="jcFormData.xmqy"
placeholder="请选择"
no-data-text="暂无数据"
clearable
>
<el-option
v-for="item in xmqyList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 3. 计量币种 -->
<el-collapse-item title="计量币种" name="计量币种">
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="币种">
<el-select
v-model="jcFormData.bizhong"
placeholder="请选择"
no-data-text="暂无数据"
clearable
>
<el-option
v-for="item in bzList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="汇率">
<el-input-number
v-model="jcFormData.huilv"
:min="0"
controls-position="right"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 4. 实施时间 -->
<el-collapse-item title="实施时间" name="实施时间">
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="运营年限">
<el-input-number
v-model="jcFormData.yynxn"
:min="0"
controls-position="right"
>
<template #suffix><span></span></template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目建设期">
<el-input-number
v-model="jcFormData.xmjsqy"
:min="0"
controls-position="right"
>
<template #suffix><span></span></template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目合作期">
<el-input-number
v-model="jcFormData.xmhzqn"
:min="0"
controls-position="right"
>
<template #suffix><span></span></template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目开工时间(预计)">
<el-date-picker
v-model="jcFormData.xmkgsjyj"
type="date"
placeholder="请选择"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目交工时间(预计)">
<el-date-picker
v-model="jcFormData.xmjgsjyj"
type="date"
placeholder="请选择"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="投资分类" name="投资分类"> <el-collapse-item title="投资分类" name="投资分类">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="8"> <el-col :span="8">
...@@ -2058,11 +2049,21 @@ ...@@ -2058,11 +2049,21 @@
</el-collapse> </el-collapse>
</el-form> </el-form>
</div> </div>
<div class="navigation-wrapper">
<CollapseNavigation
:nav-items="navigationItems"
:active-item="activeCollapse"
@nav-click="handleNavClick"
/>
</div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="财务评价" name="财务评价"> <el-tab-pane label="财务评价" name="财务评价">
<div class="tab-content"> <div class="tab-content">
<el-form :model="jcFormData" :disabled="isPreview"> <el-form :model="jcFormData" :disabled="isPreview">
<el-collapse v-model="activeCollapse"> <el-collapse
v-collapse-nav="navigationItems2"
v-model="cwpjcollapse"
>
<el-collapse-item title="投决计划" name="投决计划"> <el-collapse-item title="投决计划" name="投决计划">
<div class="tab-handle"> <div class="tab-handle">
<el-button <el-button
...@@ -2473,11 +2474,22 @@ ...@@ -2473,11 +2474,22 @@
</el-collapse> </el-collapse>
</el-form> </el-form>
</div> </div>
<div class="navigation-wrapper">
<CollapseNavigation
:nav-items="navigationItems2"
:active-item="cwpjcollapse"
@nav-click="handleNavClick"
/>
</div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="决策批复" name="决策批复"> <el-tab-pane label="决策批复" name="决策批复">
<div class="tabBody"></div>
<div class="tab-content"> <div class="tab-content">
<el-form :model="jcFormData" :disabled="isPreview"> <el-form :model="jcFormData" :disabled="isPreview">
<el-collapse v-model="activeCollapse"> <el-collapse
v-collapse-nav="navigationItems3"
v-model="activeCollapse"
>
<el-collapse-item <el-collapse-item
title="项目投资总额(全口径)" title="项目投资总额(全口径)"
name="项目投资总额(全口径)" name="项目投资总额(全口径)"
...@@ -3222,9 +3234,17 @@ ...@@ -3222,9 +3234,17 @@
</el-collapse> </el-collapse>
</el-form> </el-form>
</div> </div>
<div class="navigation-wrapper">
<CollapseNavigation
:nav-items="navigationItems3"
:active-item="jcpfcollapse"
@nav-click="handleNavClick"
/>
</div>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
<div class="add-project-header"> <div class="add-project-header">
<div class="header-left"></div> <div class="header-left"></div>
<div class="header-right"> <div class="header-right">
...@@ -3235,7 +3255,7 @@ ...@@ -3235,7 +3255,7 @@
v-if=" v-if="
!formData.projectLzType || !formData.projectLzType ||
['1', '5', '7', '9'].includes( ['1', '5', '7', '9'].includes(
formData.projectLzType.toString() formData.projectLzType.toString(),
) )
" "
@click="saveClick('save')" @click="saveClick('save')"
...@@ -3327,6 +3347,8 @@ import { useRouter, useRoute } from "vue-router"; ...@@ -3327,6 +3347,8 @@ import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus"; import { ElMessage, ElMessageBox } from "element-plus";
import { useUserStore } from "@/stores/user.js"; import { useUserStore } from "@/stores/user.js";
import routerBack from "@/components/common/routerBack.vue"; import routerBack from "@/components/common/routerBack.vue";
import CollapseNavigation from "@/components/CollapseNavigation/index.vue";
import _ from "lodash"; import _ from "lodash";
import Decimal from "decimal.js"; import Decimal from "decimal.js";
const router = useRouter(); const router = useRouter();
...@@ -3387,6 +3409,24 @@ const activeCollapse = reactive([ ...@@ -3387,6 +3409,24 @@ const activeCollapse = reactive([
"能建方现金流量表", "能建方现金流量表",
"利润表", "利润表",
]); ]);
const cwpjcollapse = reactive([
"投决计划",
"项目投资资金流量表",
"项目资本金现金流量表",
"能建方现金流量表",
"利润表",
]);
const jcpfcollapse = reactive([
"项目投资总额(全口径)",
"财务评价指标",
"核心边界条件",
"决策主体审核情况",
"投资主体审核情况",
"项目批复信息",
"审批意见",
"其他",
]);
let formData = reactive({}); let formData = reactive({});
let jcFormData = reactive({}); let jcFormData = reactive({});
let loading = ref(false); let loading = ref(false);
...@@ -3438,16 +3478,16 @@ const changeGdxxSums = () => { ...@@ -3438,16 +3478,16 @@ const changeGdxxSums = () => {
}; };
} }
obj[item.gdlx].cgbl = new Decimal( obj[item.gdlx].cgbl = new Decimal(
Number(obj[item.gdlx].cgbl || 0) Number(obj[item.gdlx].cgbl || 0),
).plus(new Decimal(Number(item.cgbl || 0))); ).plus(new Decimal(Number(item.cgbl || 0)));
obj[item.gdlx].cze = new Decimal(Number(obj[item.gdlx].cze || 0)).plus( obj[item.gdlx].cze = new Decimal(Number(obj[item.gdlx].cze || 0)).plus(
new Decimal(Number(item.cze || 0)) new Decimal(Number(item.cze || 0)),
); );
obj[item.gdlx].yjzczb = new Decimal( obj[item.gdlx].yjzczb = new Decimal(
Number(obj[item.gdlx].yjzczb || 0) Number(obj[item.gdlx].yjzczb || 0),
).plus(new Decimal(Number(item.yjzczb || 0))); ).plus(new Decimal(Number(item.yjzczb || 0)));
obj[item.gdlx].ycxmzbj = new Decimal( obj[item.gdlx].ycxmzbj = new Decimal(
Number(obj[item.gdlx].ycxmzbj || 0) Number(obj[item.gdlx].ycxmzbj || 0),
).plus(new Decimal(Number(item.ycxmzbj || 0))); ).plus(new Decimal(Number(item.ycxmzbj || 0)));
} }
} }
...@@ -3460,7 +3500,7 @@ const changeGdxxSums = () => { ...@@ -3460,7 +3500,7 @@ const changeGdxxSums = () => {
const getObjSums = (obj, objkey) => { const getObjSums = (obj, objkey) => {
return Object.entries(obj).reduce( return Object.entries(obj).reduce(
(acc, [key, item]) => acc.plus(new Decimal(item[objkey] || 0)), (acc, [key, item]) => acc.plus(new Decimal(item[objkey] || 0)),
new Decimal(0) new Decimal(0),
); );
}; };
// 支撑材料 // 支撑材料
...@@ -3491,7 +3531,7 @@ const multiDeleteZccl = () => { ...@@ -3491,7 +3531,7 @@ const multiDeleteZccl = () => {
}) })
.then(() => { .then(() => {
zcclData.value = zcclData.value.filter( zcclData.value = zcclData.value.filter(
(item) => !zcclSelectIds.value.includes(item.id) (item) => !zcclSelectIds.value.includes(item.id),
); );
}) })
.catch(() => {}); .catch(() => {});
...@@ -3617,7 +3657,7 @@ const multiDeleteLxpf = () => { ...@@ -3617,7 +3657,7 @@ const multiDeleteLxpf = () => {
}) })
.then(() => { .then(() => {
lxpfwjData.value = lxpfwjData.value.filter( lxpfwjData.value = lxpfwjData.value.filter(
(item) => !lxpfSelectIds.value.includes(item.id) (item) => !lxpfSelectIds.value.includes(item.id),
); );
}) })
.catch(() => {}); .catch(() => {});
...@@ -3658,7 +3698,7 @@ const multiDeleteShcl = () => { ...@@ -3658,7 +3698,7 @@ const multiDeleteShcl = () => {
}) })
.then(() => { .then(() => {
shclData.value = shclData.value.filter( shclData.value = shclData.value.filter(
(item) => !shclSelectIds.value.includes(item.id) (item) => !shclSelectIds.value.includes(item.id),
); );
}) })
.catch(() => {}); .catch(() => {});
...@@ -3696,22 +3736,22 @@ const changeJcGdxxSums = () => { ...@@ -3696,22 +3736,22 @@ const changeJcGdxxSums = () => {
}; };
} }
obj[item.gdlx].mycgbl = new Decimal( obj[item.gdlx].mycgbl = new Decimal(
Number(obj[item.gdlx].mycgbl || 0) Number(obj[item.gdlx].mycgbl || 0),
).plus(new Decimal(Number(item.mycgbl || 0))); ).plus(new Decimal(Number(item.mycgbl || 0)));
obj[item.gdlx].cgbl = new Decimal(Number(obj[item.gdlx].cgbl || 0)).plus( obj[item.gdlx].cgbl = new Decimal(Number(obj[item.gdlx].cgbl || 0)).plus(
new Decimal(Number(item.cgbl || 0)) new Decimal(Number(item.cgbl || 0)),
); );
obj[item.gdlx].lrfpbl = new Decimal( obj[item.gdlx].lrfpbl = new Decimal(
Number(obj[item.gdlx].lrfpbl || 0) Number(obj[item.gdlx].lrfpbl || 0),
).plus(new Decimal(Number(item.lrfpbl || 0))); ).plus(new Decimal(Number(item.lrfpbl || 0)));
obj[item.gdlx].cze = new Decimal(Number(obj[item.gdlx].cze || 0)).plus( obj[item.gdlx].cze = new Decimal(Number(obj[item.gdlx].cze || 0)).plus(
new Decimal(Number(item.cze || 0)) new Decimal(Number(item.cze || 0)),
); );
obj[item.gdlx].yjzczb = new Decimal( obj[item.gdlx].yjzczb = new Decimal(
Number(obj[item.gdlx].yjzczb || 0) Number(obj[item.gdlx].yjzczb || 0),
).plus(new Decimal(Number(item.yjzczb || 0))); ).plus(new Decimal(Number(item.yjzczb || 0)));
obj[item.gdlx].ycxmzbj = new Decimal( obj[item.gdlx].ycxmzbj = new Decimal(
Number(obj[item.gdlx].ycxmzbj || 0) Number(obj[item.gdlx].ycxmzbj || 0),
).plus(new Decimal(Number(item.ycxmzbj || 0))); ).plus(new Decimal(Number(item.ycxmzbj || 0)));
} }
}); });
...@@ -3769,7 +3809,7 @@ const multiDeleteLcbsp = () => { ...@@ -3769,7 +3809,7 @@ const multiDeleteLcbsp = () => {
}) })
.then(() => { .then(() => {
lcbspData.value = lcbspData.value.filter( lcbspData.value = lcbspData.value.filter(
(item) => !lcbspSelectIds.value.includes(item.id) (item) => !lcbspSelectIds.value.includes(item.id),
); );
}) })
.catch(() => {}); .catch(() => {});
...@@ -3802,7 +3842,7 @@ const multiDeleteKycl = () => { ...@@ -3802,7 +3842,7 @@ const multiDeleteKycl = () => {
}) })
.then(() => { .then(() => {
kyclData.value = kyclData.value.filter( kyclData.value = kyclData.value.filter(
(item) => !kyclSelectIds.value.includes(item.id) (item) => !kyclSelectIds.value.includes(item.id),
); );
}) })
.catch(() => {}); .catch(() => {});
...@@ -3835,7 +3875,7 @@ const multiDeleteJjzbcs = () => { ...@@ -3835,7 +3875,7 @@ const multiDeleteJjzbcs = () => {
}) })
.then(() => { .then(() => {
jjzbcsData.value = jjzbcsData.value.filter( jjzbcsData.value = jjzbcsData.value.filter(
(item) => !jjzbcsSelectIds.value.includes(item.id) (item) => !jjzbcsSelectIds.value.includes(item.id),
); );
}) })
.catch(() => {}); .catch(() => {});
...@@ -3868,7 +3908,7 @@ const multiDeleteTpbczccl = () => { ...@@ -3868,7 +3908,7 @@ const multiDeleteTpbczccl = () => {
}) })
.then(() => { .then(() => {
tpbczcclData.value = tpbczcclData.value.filter( tpbczcclData.value = tpbczcclData.value.filter(
(item) => !tpbczcclSelectIds.value.includes(item.id) (item) => !tpbczcclSelectIds.value.includes(item.id),
); );
}) })
.catch(() => {}); .catch(() => {});
...@@ -3901,7 +3941,7 @@ const multiDeleteTpzccl = () => { ...@@ -3901,7 +3941,7 @@ const multiDeleteTpzccl = () => {
}) })
.then(() => { .then(() => {
tpzcclData.value = tpzcclData.value.filter( tpzcclData.value = tpzcclData.value.filter(
(item) => !tpzcclSelectIds.value.includes(item.id) (item) => !tpzcclSelectIds.value.includes(item.id),
); );
}) })
.catch(() => {}); .catch(() => {});
...@@ -3934,7 +3974,7 @@ const multiDeleteShya = () => { ...@@ -3934,7 +3974,7 @@ const multiDeleteShya = () => {
}) })
.then(() => { .then(() => {
shyaData.value = shyaData.value.filter( shyaData.value = shyaData.value.filter(
(item) => !shyaSelectIds.value.includes(item.id) (item) => !shyaSelectIds.value.includes(item.id),
); );
}) })
.catch(() => {}); .catch(() => {});
...@@ -4162,7 +4202,7 @@ const downloadTemplate = async (type) => { ...@@ -4162,7 +4202,7 @@ const downloadTemplate = async (type) => {
headers: { headers: {
Authorization: token.value, Authorization: token.value,
}, },
} },
) )
.then((res) => res.blob()) .then((res) => res.blob())
.then((blob) => { .then((blob) => {
...@@ -4173,14 +4213,14 @@ const downloadTemplate = async (type) => { ...@@ -4173,14 +4213,14 @@ const downloadTemplate = async (type) => {
type === "tjjh" type === "tjjh"
? "投决计划" ? "投决计划"
: type === "xmtzzjll" : type === "xmtzzjll"
? "项目投资资金流量表" ? "项目投资资金流量表"
: type === "xmzbjxjll" : type === "xmzbjxjll"
? "项目资本金现金流量表" ? "项目资本金现金流量表"
: type === "njfxjll" : type === "njfxjll"
? "能建方现金流量表" ? "能建方现金流量表"
: type === "lrb" : type === "lrb"
? "利润表" ? "利润表"
: ""; : "";
link.download = name + "模板.xlsx"; link.download = name + "模板.xlsx";
document.body.appendChild(link); document.body.appendChild(link);
link.click(); link.click();
...@@ -5065,6 +5105,63 @@ const cancelAudit = () => { ...@@ -5065,6 +5105,63 @@ const cancelAudit = () => {
auditFormData.value = {}; auditFormData.value = {};
auditForm.value?.resetFields(); auditForm.value?.resetFields();
}; };
// ========== 导航配置(由 v-collapse-nav 指令自动生成) ==========
const navigationItems = ref([]);
const navigationItems2 = ref([]);
const navigationItems3 = ref([]);
// 导航点击处理
const handleNavClick = (item) => {
console.log("Navigation clicked:", item);
// 点击导航时自动展开对应的折叠面板
if (!activeCollapse.value.includes(item.name)) {
activeCollapse.value.push(item.name);
}
// 等待 DOM 更新后滚动
nextTick(() => {
setTimeout(() => {
const targetId = `collapse-${item.name}`;
const targetElement = document.getElementById(targetId);
console.log("Scrolling to element:", {
targetId,
found: !!targetElement,
element: targetElement,
});
if (targetElement) {
// 使用 scrollIntoView 获得更平滑的效果
targetElement.scrollIntoView({
behavior: "smooth",
block: "start",
inline: "nearest",
});
// 可选:添加额外的偏移量调整
setTimeout(() => {
const elementPosition = targetElement.getBoundingClientRect().top;
if (elementPosition < 80) {
// 如果距离顶部太近,向上滚动一点
window.scrollBy({
top: elementPosition - 80,
behavior: "smooth",
});
}
}, 300);
} else {
console.error("Element not found:", targetId);
console.log(
"Available collapse elements:",
document.querySelectorAll('[id^="collapse-"]'),
);
}
}, 300); // 增加延迟确保动画完成
});
};
const submitAudit = () => { const submitAudit = () => {
auditForm.value.validate((valid) => { auditForm.value.validate((valid) => {
if (valid) { if (valid) {
...@@ -5072,11 +5169,11 @@ const submitAudit = () => { ...@@ -5072,11 +5169,11 @@ const submitAudit = () => {
formData.projectLzType.toString() === "3" formData.projectLzType.toString() === "3"
? "approvalLixiang" ? "approvalLixiang"
: jcFormData.projectLzType.toString() === "8" : jcFormData.projectLzType.toString() === "8"
? "approvalJuece" ? "approvalJuece"
: jcFormData.projectLzType.toString() === "12" || : jcFormData.projectLzType.toString() === "12" ||
jcFormData.projectLzType.toString() === "11" jcFormData.projectLzType.toString() === "11"
? "approvalZaiJuece" ? "approvalZaiJuece"
: ""; : "";
proxy.$post({ proxy.$post({
url: "/api/project/" + url, url: "/api/project/" + url,
data: { data: {
...@@ -5097,4 +5194,26 @@ const submitAudit = () => { ...@@ -5097,4 +5194,26 @@ const submitAudit = () => {
}; };
</script> </script>
<style lang="less"></style> <style scoped lang="less">
.collapse-navigation {
position: fixed;
top: 228px;
right: 36px;
}
.project-tab-content {
margin-right: 230px;
}
.navigation-wrapper {
flex-shrink: 0;
width: auto;
padding-left: 10px;
.nav-list {
width: 215px;
}
}
.tab-content {
width: 100%;
}
</style>
...@@ -6060,6 +6060,20 @@ userInfo.roles.map((item) => { ...@@ -6060,6 +6060,20 @@ userInfo.roles.map((item) => {
} }
}); });
const navigationItems1 = ref([]);
const navigationItems2 = ref([]);
const navigationItems3 = ref([]);
const navigationItems4 = ref([]);
const navigationItems5 = ref([]);
const navigationItems6 = ref([]);
const activeCollapse1 = ref([]);
const activeCollapse2 = ref([]);
const activeCollapse3 = ref([]);
const activeCollapse4 = ref([]);
const activeCollapse5 = ref([]);
const activeCollapse6 = ref([]);
// tab相关 // tab相关
const pageActiveName = ref("立项填报"); const pageActiveName = ref("立项填报");
const lxTabActiveName = ref("基本信息"); const lxTabActiveName = ref("基本信息");
...@@ -7813,4 +7827,32 @@ const submitAudit = () => { ...@@ -7813,4 +7827,32 @@ const submitAudit = () => {
}; };
</script> </script>
<style lang="less"></style> <!-- <style scoped lang="less">
.collapse-navigation {
position: fixed;
top: 228px;
right: 36px;
}
.project-tab-content {
margin-right: 230px;
}
// 布局容器
.tabBody {
display: flex;
gap: 20px;
position: relative;
}
.navigation-wrapper {
flex-shrink: 0;
width: auto;
padding-left: 10px;
.nav-list {
width: 215px;
}
}
.tab-content {
width: 100%;
}
</style> -->
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment