明树Git Lab

Commit 09d31d4e authored by zhanghan's avatar zhanghan

组件修改

parent a16431ee
Pipeline #109176 passed with stage
in 21 seconds
......@@ -3,10 +3,13 @@
<div class="add-project-content" v-loading="loading">
<routerBack />
<div class="tabs-content">
<div class="project-tab-content">
<div class="project-tab-content-wrapper">
<div class="tab-content">
<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-row :gutter="24">
<el-col :span="6">
......@@ -132,67 +135,87 @@
</el-collapse-item>
<el-collapse-item
title="投资额完成情况(万元)"
name="投资额完成情况(万元)"
title="投资额完成情况(单位:万元)"
name="投资额完成情况(单位:万元)"
><el-row gutter="20">
<el-col :span="12">
<el-form-item
label-width="260px"
label="项目投资总额(决策值)(万元)"
label="项目投资总额(决策值)"
>
<el-input-number
<el-input
precision="2"
v-model="formData.tzzejc"
placeholder="请输入项目投资总额(决策值)(万元)"
/>
placeholder="请输入项目投资总额(决策值)"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="260px"
label="我方资本金出资额-决策值(万元)"
label="我方资本金出资额-决策值"
>
<el-input-number
<el-input
precision="2"
v-model="formData.wfzbjczejc"
placeholder="请输入我方资本金出资额-决策值(万元)"
/>
placeholder="请输入我方资本金出资额-决策值"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="260px"
label="投资总额-实际值(万元)"
label="投资总额-实际值"
>
<el-input-number
<el-input
precision="2"
v-model="formData.tzzesj"
placeholder="请输入投资总额-实际值(万元)"
/>
placeholder="请输入投资总额-实际值"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="260px"
label="我方资本金出资额--实际值(万元)"
label="我方资本金出资额--实际值"
>
<el-input-number
<el-input
precision="2"
v-model="formData.wfzbjczesj"
placeholder="请输入我方资本金出资额--实际值(万元)"
/>
placeholder="请输入我方资本金出资额--实际值"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="260px"
label="投资总额-计划值(万元)"
label="投资总额-计划值"
>
<el-input-number
<el-input
precision="2"
v-model="formData.tzzejhz"
placeholder="请输入投资总额-计划值(万元)"
/>
placeholder="请输入投资总额-计划值"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
......@@ -207,14 +230,18 @@
<el-col :span="12">
<el-form-item
label-width="260px"
label="本年完成 投资回收决策目标值(万元)"
label="本年完成 投资回收决策目标值"
>
<el-input-number
<el-input
precision="2"
v-model="formData.bnwc"
type="number"
placeholder="请输入本年完成 投资回收决策目标值(万元)"
/>
placeholder="请输入本年完成 投资回收决策目标值"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
......@@ -222,38 +249,50 @@
label-width="260px"
label="截止本年累计(决策目标值)"
>
<el-input-number
<el-input
precision="2"
v-model="formData.jzbnlj"
type="number"
placeholder="请输入截止本年累计(决策目标值)"
/>
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="260px"
label="下一年完成数(万元)"
label="下一年完成数"
>
<el-input-number
<el-input
precision="2"
v-model="formData.xynwcs"
type="number"
placeholder="请输入下一年完成数(万元)"
/>
placeholder="请输入下一年完成数"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="260px"
label="本年计划(万元)"
label="本年计划"
>
<el-input-number
<el-input
precision="2"
v-model="formData.bnjh"
type="number"
placeholder="请输入本年计划(万元)"
/>
placeholder="请输入本年计划"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
......@@ -261,14 +300,18 @@
<el-col :span="12">
<el-form-item
label-width="260px"
label="本年完成--投资回收实际值(万元)"
label="本年完成--投资回收实际值"
>
<el-input-number
<el-input
precision="2"
v-model="formData.bnwcsjz"
type="number"
placeholder="请输入本年完成--投资回收实际值(万元)"
/>
placeholder="请输入本年完成--投资回收实际值"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
......@@ -276,35 +319,47 @@
label-width="260px"
label="截止本年累计--投资回收实际值"
>
<el-input-number
<el-input
precision="2"
v-model="formData.jzbnljsjz"
type="number"
placeholder="请输入截止本年累计--投资回收实际值"
/>
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="260px"
label="累计欠收(万元)"
label="累计欠收"
>
<el-input-number
<el-input
precision="2"
v-model="formData.ljqs"
type="number"
placeholder="请输入累计欠收(万元)"
/>
placeholder="请输入累计欠收"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item lable-width="240px" label="完成率(%)">
<el-input-number
<el-form-item label-width="260px" label="完成率">
<el-input
precision="2"
v-model="formData.wcl"
type="number"
placeholder="请输入完成率(%)"
/>
placeholder="请输入完成率"
>
<template #suffix>
<span>%</span>
</template>
</el-input>
</el-form-item>
</el-col>
......@@ -425,6 +480,15 @@
</el-collapse>
</el-form>
</div>
<div class="navigation-wrapper">
<CollapseNavigation
:nav-items="navigationItems"
:active-item="activeCollapse"
title="目录导航"
width="auto"
@nav-click="handleNavClick"
/>
</div>
</div>
</div>
<div class="add-project-header">
......@@ -462,6 +526,7 @@ import {
getCurrentInstance,
h,
computed,
nextTick,
} from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage } from "element-plus";
......@@ -469,6 +534,7 @@ import DynamicTable from "@/components/FormDynamicTable/index.vue";
import FinancialTable from "@/components/FinancialTable.vue";
import InvestmentRecoveryTable from "@/components/InvestmentRecoveryTable.vue";
import routerBack from "@/components/common/routerBack.vue";
import CollapseNavigation from "@/components/CollapseNavigation/index.vue";
const transferColumns = ref([
{
prop: "njfcgbl",
......@@ -512,6 +578,60 @@ const router = useRouter();
const route = useRoute();
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 = () => {
// 使用 Object.assign 直接替换整个对象,而不是合并
......@@ -1262,6 +1382,24 @@ onMounted(() => {
</script>
<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 {
display: flex;
div {
......
......@@ -3,10 +3,13 @@
<div class="add-project-content" v-loading="loading">
<routerBack />
<div class="tabs-content">
<div class="project-tab-content">
<div class="project-tab-content-wrapper">
<div class="tab-content">
<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-row :gutter="20">
<el-col :span="12">
......@@ -979,6 +982,15 @@
</el-collapse>
</el-form>
</div>
<div class="navigation-wrapper">
<CollapseNavigation
:nav-items="navigationItems"
:active-item="activeCollapse"
title="目录导航"
width="auto"
@nav-click="handleNavClick"
/>
</div>
</div>
</div>
<div class="add-project-header">
......@@ -994,11 +1006,12 @@
</div>
</template>
<script setup>
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import FileUploader from "@/components/FileUploader/index.vue";
import routerBack from "@/components/common/routerBack.vue";
import CollapseNavigation from "@/components/CollapseNavigation/index.vue";
import { useUserStore } from "@/stores/user.js";
const userStore = useUserStore();
......@@ -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 loading = ref(false);
......@@ -1572,6 +1639,24 @@ const saveClick = () => {
</script>
<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 {
.el-form-item {
display: block !important;
......
......@@ -3,10 +3,13 @@
<div class="add-project-content" v-loading="loading">
<routerBack />
<div class="tabs-content">
<div class="project-tab-content">
<div class="project-tab-content-wrapper">
<div class="tab-content">
<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-row :gutter="24">
<el-col :span="6">
......@@ -132,67 +135,87 @@
</el-collapse-item>
<el-collapse-item
title="投资额完成情况(万元)"
name="投资额完成情况(万元)"
title="投资额完成情况(单位:万元)"
name="投资额完成情况(单位:万元)"
><el-row gutter="20">
<el-col :span="12">
<el-form-item
label-width="280px"
label="项目投资总额(决策值)(万元)"
label="项目投资总额(决策值)"
>
<el-input-number
<el-input
precision="2"
v-model="formData.tzzejc"
placeholder="请输入项目投资总额(决策值)(万元)"
/>
placeholder="请输入项目投资总额(决策值)"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="280px"
label="我方资本金出资额-决策值(万元)"
label="我方资本金出资额-决策值"
>
<el-input-number
<el-input
precision="2"
v-model="formData.wfzbjczejc"
placeholder="请输入我方资本金出资额-决策值(万元)"
/>
placeholder="请输入我方资本金出资额-决策值"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="280px"
label="投资总额-实际值(万元)"
label="投资总额-实际值"
>
<el-input-number
<el-input
precision="2"
v-model="formData.tzzesj"
placeholder="请输入投资总额-实际值(万元)"
/>
placeholder="请输入投资总额-实际值"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="280px"
label="我方资本金出资额--实际值(万元)"
label="我方资本金出资额--实际值"
>
<el-input-number
<el-input
precision="2"
v-model="formData.wfzbjczesj"
placeholder="请输入我方资本金出资额--实际值(万元)"
/>
placeholder="请输入我方资本金出资额--实际值"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="280px"
label="投资总额-计划值(万元)"
label="投资总额-计划值"
>
<el-input-number
<el-input
precision="2"
v-model="formData.tzzejhz"
placeholder="请输入投资总额-计划值(万元)"
/>
placeholder="请输入投资总额-计划值"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
......@@ -207,14 +230,18 @@
<el-col :span="12">
<el-form-item
label-width="280px"
label="本年完成 投资回收决策目标值(万元)"
label="本年完成 投资回收决策目标值"
>
<el-input-number
<el-input
precision="2"
v-model="formData.bnwc"
type="number"
placeholder="请输入本年完成 投资回收决策目标值(万元)"
/>
placeholder="请输入本年完成 投资回收决策目标值"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
......@@ -222,38 +249,50 @@
label-width="280px"
label="截止本年累计(决策目标值)"
>
<el-input-number
<el-input
precision="2"
v-model="formData.jzbnlj"
type="number"
placeholder="请输入截止本年累计(决策目标值)"
/>
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="280px"
label="下一年完成数(万元)"
label="下一年完成数"
>
<el-input-number
<el-input
precision="2"
v-model="formData.xynwcs"
type="number"
placeholder="请输入下一年完成数(万元)"
/>
placeholder="请输入下一年完成数"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="280px"
label="本年计划(万元)"
label="本年计划"
>
<el-input-number
<el-input
precision="2"
v-model="formData.bnjh"
type="number"
placeholder="请输入本年计划(万元)"
/>
placeholder="请输入本年计划"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
......@@ -261,14 +300,18 @@
<el-col :span="12">
<el-form-item
label-width="280px"
label="本年完成--投资回收实际值(万元)"
label="本年完成--投资回收实际值"
>
<el-input-number
<el-input
precision="2"
v-model="formData.bnwcsjz"
type="number"
placeholder="请输入本年完成--投资回收实际值(万元)"
/>
placeholder="请输入本年完成--投资回收实际值"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
......@@ -276,35 +319,47 @@
label-width="280px"
label="截止本年累计--投资回收实际值"
>
<el-input-number
<el-input
precision="2"
v-model="formData.jzbnljsjz"
type="number"
placeholder="请输入截止本年累计--投资回收实际值"
/>
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="280px"
label="累计欠收(万元)"
label="累计欠收"
>
<el-input-number
<el-input
precision="2"
v-model="formData.ljqs"
type="number"
placeholder="请输入累计欠收(万元)"
/>
placeholder="请输入累计欠收"
>
<template #suffix>
<span>万元</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label-width="280px" label="完成率(%)">
<el-input-number
<el-form-item label-width="280px" label="完成率">
<el-input
precision="2"
v-model="formData.wcl"
type="number"
placeholder="请输入完成率(%)"
/>
placeholder="请输入完成率"
>
<template #suffix>
<span>%</span>
</template>
</el-input>
</el-form-item>
</el-col>
......@@ -425,6 +480,15 @@
</el-collapse>
</el-form>
</div>
<div class="navigation-wrapper">
<CollapseNavigation
:nav-items="navigationItems"
:active-item="activeCollapse"
title="目录导航"
width="auto"
@nav-click="handleNavClick"
/>
</div>
</div>
</div>
<div class="add-project-header">
......@@ -462,6 +526,7 @@ import {
getCurrentInstance,
h,
computed,
nextTick,
} from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage } from "element-plus";
......@@ -469,6 +534,7 @@ import DynamicTable from "@/components/FormDynamicTable/index.vue";
import FinancialTable from "@/components/FinancialTable.vue";
import InvestmentRecoveryTable from "@/components/InvestmentRecoveryTable.vue";
import routerBack from "@/components/common/routerBack.vue";
import CollapseNavigation from "@/components/CollapseNavigation/index.vue";
const transferColumns = ref([
{
prop: "njfcgbl",
......@@ -512,6 +578,60 @@ const router = useRouter();
const route = useRoute();
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 = () => {
// 使用 Object.assign 直接替换整个对象,而不是合并
......@@ -1262,6 +1382,24 @@ onMounted(() => {
</script>
<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 {
display: flex;
div {
......
......@@ -12,7 +12,11 @@
label-width="160px"
:disabled="isPreview"
>
<el-collapse v-model="activeCollapse">
<el-collapse
v-collapse-nav="navigationItems"
v-model="activeCollapse"
>
<!-- 1. 项目基本信息 -->
<el-collapse-item title="项目基本信息" name="项目基本信息">
<el-row :gutter="20">
<el-col :span="12">
......@@ -41,10 +45,7 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
label-width="180px"
label="申报单位企业规格"
>
<el-form-item label="申报单位企业规格">
<el-select
v-model="jcFormData.sbdwqygg"
placeholder="请选择"
......@@ -65,12 +66,9 @@
<el-input-number
v-model="jcFormData.xmztz"
:min="0"
:max="99999999999.99999999"
controls-position="right"
>
<template #suffix>
<span>万元</span>
</template>
<template #suffix><span>万元</span></template>
</el-input-number>
</el-form-item>
</el-col>
......@@ -85,134 +83,16 @@
</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-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-input v-model="jcFormData.tzms" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="对外签约品牌">
<el-input v-model="jcFormData.dwqypp" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="8">
<el-form-item label="是否能建重大或重要投资">
<el-radio-group v-model="jcFormData.sfnjzdhzytz">
<el-radio
......@@ -232,7 +112,7 @@
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="8">
<el-form-item label="能建是否牵头方">
<el-radio-group v-model="jcFormData.njsfqtf">
<el-radio
......@@ -252,7 +132,18 @@
</el-radio-group>
</el-form-item>
</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-radio-group v-model="jcFormData.sfpppxm">
<el-radio
......@@ -272,21 +163,6 @@
</el-radio-group>
</el-form-item>
</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-form-item label="项目资金来源">
<el-select
......@@ -424,66 +300,6 @@
</el-form-item>
</el-col>
<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-radio-group v-model="jcFormData.sfyjlx">
<el-radio
......@@ -564,9 +380,7 @@
placeholder="请选择"
no-data-text="暂无数据"
clearable
>
<!-- todo -->
</el-select>
></el-select>
</el-form-item>
</el-col>
<el-col :span="8">
......@@ -601,20 +415,14 @@
<el-input-number
v-model="jcFormData.cblrl"
:min="0"
:max="99999.99"
controls-position="right"
>
<template #suffix>
<span>%</span>
</template>
<template #suffix><span>%</span></template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
label="未通过主要原因与要求"
:label-width="160"
>
<el-form-item label="未通过主要原因与要求">
<el-input
v-model="jcFormData.wtgzyyyyyq"
type="textarea"
......@@ -624,6 +432,189 @@
</el-col>
</el-row>
</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-row :gutter="20">
<el-col :span="8">
......@@ -2058,11 +2049,21 @@
</el-collapse>
</el-form>
</div>
<div class="navigation-wrapper">
<CollapseNavigation
:nav-items="navigationItems"
:active-item="activeCollapse"
@nav-click="handleNavClick"
/>
</div>
</el-tab-pane>
<el-tab-pane label="财务评价" name="财务评价">
<div class="tab-content">
<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="投决计划">
<div class="tab-handle">
<el-button
......@@ -2473,11 +2474,22 @@
</el-collapse>
</el-form>
</div>
<div class="navigation-wrapper">
<CollapseNavigation
:nav-items="navigationItems2"
:active-item="cwpjcollapse"
@nav-click="handleNavClick"
/>
</div>
</el-tab-pane>
<el-tab-pane label="决策批复" name="决策批复">
<div class="tabBody"></div>
<div class="tab-content">
<el-form :model="jcFormData" :disabled="isPreview">
<el-collapse v-model="activeCollapse">
<el-collapse
v-collapse-nav="navigationItems3"
v-model="activeCollapse"
>
<el-collapse-item
title="项目投资总额(全口径)"
name="项目投资总额(全口径)"
......@@ -3222,9 +3234,17 @@
</el-collapse>
</el-form>
</div>
<div class="navigation-wrapper">
<CollapseNavigation
:nav-items="navigationItems3"
:active-item="jcpfcollapse"
@nav-click="handleNavClick"
/>
</div>
</el-tab-pane>
</el-tabs>
</div>
<div class="add-project-header">
<div class="header-left"></div>
<div class="header-right">
......@@ -3235,7 +3255,7 @@
v-if="
!formData.projectLzType ||
['1', '5', '7', '9'].includes(
formData.projectLzType.toString()
formData.projectLzType.toString(),
)
"
@click="saveClick('save')"
......@@ -3327,6 +3347,8 @@ import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import { useUserStore } from "@/stores/user.js";
import routerBack from "@/components/common/routerBack.vue";
import CollapseNavigation from "@/components/CollapseNavigation/index.vue";
import _ from "lodash";
import Decimal from "decimal.js";
const router = useRouter();
......@@ -3387,6 +3409,24 @@ const activeCollapse = reactive([
"能建方现金流量表",
"利润表",
]);
const cwpjcollapse = reactive([
"投决计划",
"项目投资资金流量表",
"项目资本金现金流量表",
"能建方现金流量表",
"利润表",
]);
const jcpfcollapse = reactive([
"项目投资总额(全口径)",
"财务评价指标",
"核心边界条件",
"决策主体审核情况",
"投资主体审核情况",
"项目批复信息",
"审批意见",
"其他",
]);
let formData = reactive({});
let jcFormData = reactive({});
let loading = ref(false);
......@@ -3438,16 +3478,16 @@ const changeGdxxSums = () => {
};
}
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)));
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(
Number(obj[item.gdlx].yjzczb || 0)
Number(obj[item.gdlx].yjzczb || 0),
).plus(new Decimal(Number(item.yjzczb || 0)));
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)));
}
}
......@@ -3460,7 +3500,7 @@ const changeGdxxSums = () => {
const getObjSums = (obj, objkey) => {
return Object.entries(obj).reduce(
(acc, [key, item]) => acc.plus(new Decimal(item[objkey] || 0)),
new Decimal(0)
new Decimal(0),
);
};
// 支撑材料
......@@ -3491,7 +3531,7 @@ const multiDeleteZccl = () => {
})
.then(() => {
zcclData.value = zcclData.value.filter(
(item) => !zcclSelectIds.value.includes(item.id)
(item) => !zcclSelectIds.value.includes(item.id),
);
})
.catch(() => {});
......@@ -3617,7 +3657,7 @@ const multiDeleteLxpf = () => {
})
.then(() => {
lxpfwjData.value = lxpfwjData.value.filter(
(item) => !lxpfSelectIds.value.includes(item.id)
(item) => !lxpfSelectIds.value.includes(item.id),
);
})
.catch(() => {});
......@@ -3658,7 +3698,7 @@ const multiDeleteShcl = () => {
})
.then(() => {
shclData.value = shclData.value.filter(
(item) => !shclSelectIds.value.includes(item.id)
(item) => !shclSelectIds.value.includes(item.id),
);
})
.catch(() => {});
......@@ -3696,22 +3736,22 @@ const changeJcGdxxSums = () => {
};
}
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)));
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(
Number(obj[item.gdlx].lrfpbl || 0)
Number(obj[item.gdlx].lrfpbl || 0),
).plus(new Decimal(Number(item.lrfpbl || 0)));
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(
Number(obj[item.gdlx].yjzczb || 0)
Number(obj[item.gdlx].yjzczb || 0),
).plus(new Decimal(Number(item.yjzczb || 0)));
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)));
}
});
......@@ -3769,7 +3809,7 @@ const multiDeleteLcbsp = () => {
})
.then(() => {
lcbspData.value = lcbspData.value.filter(
(item) => !lcbspSelectIds.value.includes(item.id)
(item) => !lcbspSelectIds.value.includes(item.id),
);
})
.catch(() => {});
......@@ -3802,7 +3842,7 @@ const multiDeleteKycl = () => {
})
.then(() => {
kyclData.value = kyclData.value.filter(
(item) => !kyclSelectIds.value.includes(item.id)
(item) => !kyclSelectIds.value.includes(item.id),
);
})
.catch(() => {});
......@@ -3835,7 +3875,7 @@ const multiDeleteJjzbcs = () => {
})
.then(() => {
jjzbcsData.value = jjzbcsData.value.filter(
(item) => !jjzbcsSelectIds.value.includes(item.id)
(item) => !jjzbcsSelectIds.value.includes(item.id),
);
})
.catch(() => {});
......@@ -3868,7 +3908,7 @@ const multiDeleteTpbczccl = () => {
})
.then(() => {
tpbczcclData.value = tpbczcclData.value.filter(
(item) => !tpbczcclSelectIds.value.includes(item.id)
(item) => !tpbczcclSelectIds.value.includes(item.id),
);
})
.catch(() => {});
......@@ -3901,7 +3941,7 @@ const multiDeleteTpzccl = () => {
})
.then(() => {
tpzcclData.value = tpzcclData.value.filter(
(item) => !tpzcclSelectIds.value.includes(item.id)
(item) => !tpzcclSelectIds.value.includes(item.id),
);
})
.catch(() => {});
......@@ -3934,7 +3974,7 @@ const multiDeleteShya = () => {
})
.then(() => {
shyaData.value = shyaData.value.filter(
(item) => !shyaSelectIds.value.includes(item.id)
(item) => !shyaSelectIds.value.includes(item.id),
);
})
.catch(() => {});
......@@ -4162,7 +4202,7 @@ const downloadTemplate = async (type) => {
headers: {
Authorization: token.value,
},
}
},
)
.then((res) => res.blob())
.then((blob) => {
......@@ -5065,6 +5105,63 @@ const cancelAudit = () => {
auditFormData.value = {};
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 = () => {
auditForm.value.validate((valid) => {
if (valid) {
......@@ -5097,4 +5194,26 @@ const submitAudit = () => {
};
</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) => {
}
});
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相关
const pageActiveName = ref("立项填报");
const lxTabActiveName = ref("基本信息");
......@@ -7813,4 +7827,32 @@ const submitAudit = () => {
};
</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