明树Git Lab

Commit 3d224552 authored by zhanghan's avatar zhanghan

1\

parent b456d56b
Pipeline #107240 passed with stage
in 19 seconds
......@@ -10,7 +10,7 @@
v-if="showAddButton"
type="primary"
@click="handleAdd"
:disabled="disabled"
:disabled="disabled || column?.disabled"
>
{{ addButtonText || "新增" }}
</el-button>
......@@ -60,7 +60,7 @@
style="width: 100%"
empty-text="暂无数据"
border
:disabled="disabled"
:disabled="disabled || column?.disabled"
:scrollbar-always-on="scrollbarAlwaysOn"
>
<!-- 序号列 -->
......@@ -87,7 +87,7 @@
<el-input
v-model="scope.row[column.prop]"
:placeholder="column.placeholder"
:disabled="disabled"
:disabled="disabled || column?.disabled"
:maxlength="column.maxlength"
/>
</template>
......@@ -96,7 +96,7 @@
v-model.number="scope.row[column.prop]"
type="number"
:placeholder="column.placeholder"
:disabled="disabled"
:disabled="disabled || column?.disabled"
:precision="column.precision"
:min="column.min"
:max="column.max"
......@@ -107,7 +107,7 @@
v-model="scope.row[column.prop]"
type="textarea"
:placeholder="column.placeholder"
:disabled="disabled"
:disabled="disabled || column?.disabled"
:rows="column.rows || 3"
:maxlength="column.maxlength"
:show-word-limit="column.showWordLimit || false"
......@@ -117,7 +117,7 @@
<el-select
v-model="scope.row[column.prop]"
:placeholder="column.placeholder"
:disabled="disabled"
:disabled="disabled || column?.disabled"
:multiple="column.multiple || false"
>
<el-option
......@@ -131,7 +131,7 @@
<template v-else-if="column.type === 'radio'">
<el-radio-group
v-model="scope.row[column.prop]"
:disabled="disabled"
:disabled="disabled || column?.disabled"
>
<el-radio
v-for="item in selectOptions?.[column.optionKey] || []"
......@@ -152,7 +152,7 @@
:format="column.format || 'YYYY-MM-DD'"
:value-format="column.valueFormat || 'YYYY-MM-DD'"
:placeholder="column.placeholder"
:disabled="disabled"
:disabled="disabled || column?.disabled"
style="width: 100%"
/>
</template>
......@@ -160,7 +160,7 @@
<FileUploader
v-model="scope.row[column.prop]"
:isInline="true"
:disabled="disabled"
:disabled="disabled || column?.disabled"
/>
</template>
</template>
......@@ -183,7 +183,7 @@
<el-input
v-model="scope.row[column.prop]"
:placeholder="column.placeholder"
:disabled="disabled"
:disabled="disabled || column?.disabled"
:maxlength="column.maxlength"
/>
</template>
......@@ -192,7 +192,7 @@
v-model.number="scope.row[column.prop]"
type="number"
:placeholder="column.placeholder"
:disabled="disabled"
:disabled="disabled || column?.disabled"
:precision="column.precision"
:min="column.min"
:max="column.max"
......@@ -203,7 +203,7 @@
v-model="scope.row[column.prop]"
type="textarea"
:placeholder="column.placeholder"
:disabled="disabled"
:disabled="disabled || column?.disabled"
:rows="column.rows || 3"
:maxlength="column.maxlength"
:show-word-limit="column.showWordLimit || false"
......@@ -213,7 +213,7 @@
<el-select
v-model="scope.row[column.prop]"
:placeholder="column.placeholder"
:disabled="disabled"
:disabled="disabled || column?.disabled"
:multiple="column.multiple || false"
>
<el-option
......@@ -227,7 +227,7 @@
<template v-else-if="column.type === 'radio'">
<el-radio-group
v-model="scope.row[column.prop]"
:disabled="disabled"
:disabled="disabled || column?.disabled"
>
<el-radio
v-for="item in selectOptions?.[column.optionKey] || []"
......@@ -248,7 +248,7 @@
:format="column.format || 'YYYY-MM-DD'"
:value-format="column.valueFormat || 'YYYY-MM-DD'"
:placeholder="column.placeholder"
:disabled="disabled"
:disabled="disabled || column?.disabled"
style="width: 100%"
/>
</template>
......@@ -256,7 +256,7 @@
<FileUploader
v-model="scope.row[column.prop]"
:isInline="true"
:disabled="disabled"
:disabled="disabled || column?.disabled"
/>
</template>
</template>
......@@ -281,7 +281,7 @@
type="danger"
size="small"
@click="handleDelete(scope.$index)"
:disabled="disabled"
:disabled="disabled || column?.disabled"
class="operation-btn"
>
删除
......@@ -304,7 +304,7 @@
name="operations"
:row="scope.row"
:index="scope.$index"
:disabled="disabled"
:disabled="disabled || column?.disabled"
/>
</template>
</el-table-column>
......
......@@ -164,15 +164,27 @@ const routes = [
{
path: "/quit",
name: "quit",
title: "重大事项审批",
title: "项目退出",
component: () => import("@/views/investingManage/quit.vue"),
},
{
path: "/quitAdd",
name: "quitAdd",
title: "重大事项审批",
title: "项目退出",
component: () => import("@/views/investingManage/quitAdd.vue"),
},
{
path: "/decision",
name: "decision",
title: "重新决策",
component: () => import("@/views/investingManage/decision.vue"),
},
{
path: "/decisionAdd",
name: "decisionAdd",
title: "重新决策",
component: () => import("@/views/investingManage/decisionAdd.vue"),
},
],
},
......
<template>
<div class="manage-container">
<div class="manage-wrap">
<div class="manage-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="primary" @click="annualAdd">新增</el-button>
</div>
</div>
<div class="manage-content" v-loading="loading">
<common-table
:autoHeight="true"
:maxRows="10"
:data="tableData"
:columns="tableColumns"
:total="total"
:current-page="currentPage"
:page-size="pageSize"
:index="true"
:indexLabel="'序号'"
title=""
:border="true"
@size-change="handleSizeChange"
@current-page-change="handleCurrentPageChange"
>
<template #operations="{ row, index }">
<el-button
link
type="primary"
size="small"
@click="previewStatement(row)"
>查看</el-button
>
<el-button
link
type="primary"
size="small"
@click="editStatement(row)"
>编辑</el-button
>
<el-button
link
type="danger"
size="small"
@click="deleteStatement(row)"
>删除</el-button
>
</template>
</common-table>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import CommonTable from "@/components/common/commonTable.vue";
const router = useRouter();
const { proxy } = getCurrentInstance();
let tableData = ref([]);
let tableColumns = ref([
{
prop: "projectName",
label: "项目名称",
showOverflowTooltip: true,
},
{
prop: "projectForeignName",
label: "项目外文名称",
showOverflowTooltip: true,
},
{
prop: "sbdw",
label: "申报单位",
showOverflowTooltip: true,
},
{
prop: "ssejqy",
label: "所属二级企业",
showOverflowTooltip: true,
},
{
prop: "xmgsmc",
label: "项目公司名称",
showOverflowTooltip: true,
},
{
prop: "xmkgsjyj",
label: "项目预计起始时间",
showOverflowTooltip: true,
},
{
prop: "xmjgsjyj",
label: "目预计完成时间",
showOverflowTooltip: true,
},
{
prop: "operations",
label: "操作",
width: 170,
slot: "operations",
fixed: "right",
align: "center",
},
]);
let loading = ref(false);
let total = ref(0);
let currentPage = ref(1);
let pageSize = ref(10);
// 获取列表数据
const getStatementData = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getTzjhList",
data: {
page: currentPage.value,
pagesize: pageSize.value,
},
callback: (data) => {
tableData.value = data.rows;
total.value = data.count;
loading.value = false;
},
});
};
// 分页
const handleSizeChange = (size) => {
pageSize.value = size;
currentPage.value = 1;
getStatementData();
};
const handleCurrentPageChange = (page) => {
currentPage.value = page;
getStatementData();
};
const annualAdd = () => {
router.push("/decisionAdd");
};
const editStatement = (item) => {
router.push({
name: "decisionAdd",
query: {
id: item.id,
},
});
};
const previewStatement = (item) => {
router.push({
name: "decisionAdd",
query: {
isPreview: true,
id: item.id,
},
});
};
const deleteStatement = (item) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
proxy.$post({
url: "/api/project/deleteTzjh",
data: {
id: item.id,
},
callback: (data) => {
ElMessage.success("删除成功");
getStatementData();
},
});
})
.catch(() => {});
};
onMounted(() => {
getStatementData();
});
</script>
<style scoped lang="less">
@import "@/styles/manage.less";
</style>
<template>
<div class="add-project-container">
<div class="add-project-content" v-loading="loading">
<div class="add-project-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="default" @click="backClick">返回</el-button>
<template v-if="!loading && !isPreview">
<el-button type="primary" @click="saveClick">保存</el-button>
</template>
</div>
</div>
<div class="tabs-content">
<div class="project-tab-content">
<div class="tab-content">
<el-form :model="formData" :label-width="200" :disabled="isPreview">
<el-collapse v-model="activeCollapse">
<!-- 1. 项目基本信息 -->
<el-collapse-item title="项目基本信息" name="项目基本信息">
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="项目名称" required>
<el-select
v-model="formData.projectId"
placeholder="请选择项目名称"
no-data-text="暂无数据"
@change="changeProject"
>
<el-option
v-for="item in projectList"
:key="item.id"
:label="item.projectName"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编号">
<el-input
v-model="formData.projectCode"
placeholder="请输入项目编号"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否再决策">
<CommonSelector
:radio="true"
v-model="formData.isReDecision"
dictName="sf"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目外文名称">
<el-input
v-model="formData.projectForeignName"
placeholder="请输入项目外文名称"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否能建联合体项目">
<CommonSelector
:radio="true"
v-model="formData.isUnionProject"
dictName="sf"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="投资主体">
<el-input
v-model="formData.investmentSubject"
placeholder="请输入投资主体"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否一体化子项目">
<CommonSelector
:radio="true"
v-model="formData.isIntegratedSubProject"
dictName="sf"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="直属企业">
<el-input
v-model="formData.directEnterprise"
placeholder="请输入直属企业"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否能建重大或重要投资项目">
<CommonSelector
:radio="true"
v-model="formData.isImportantInvestProject"
dictName="sf"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="决策审批单位">
<el-input
v-model="formData.approvalUnit"
placeholder="请输入决策审批单位"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="财务报表类型">
<el-input
v-model="formData.financialReportType"
placeholder="请输入财务报表类型"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="政府(核准、备案)审批级别">
<el-input
v-model="formData.governmentApprovalLevel"
placeholder="请输入审批级别"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否自主决策">
<CommonSelector
:radio="true"
v-model="formData.isIndependentDecision"
dictName="sf"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="主业/非主业">
<el-select
v-model="formData.businessType"
placeholder="请选择"
>
<el-option label="主业" value="主业"></el-option>
<el-option label="非主业" value="非主业"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系人">
<el-input
v-model="formData.contactPerson"
placeholder="请输入联系人"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
<el-input
v-model="formData.contactPhone"
placeholder="请输入联系电话"
/>
</el-form-item>
</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="formData.domesticOverseas"
placeholder="请选择"
>
<el-option label="境内" value="境内"></el-option>
<el-option label="境外" value="境外"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="省(境内)/洲际(境外)">
<el-input
v-model="formData.provinceContinent"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="地市(境内)/国家(境外)">
<el-input
v-model="formData.cityCountry"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="区县(境内)/国家(境外)">
<el-input
v-model="formData.districtCountry"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目区域">
<el-input
v-model="formData.projectArea"
placeholder="请输入项目区域"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否一带一路沿线国家">
<CommonSelector
:radio="true"
v-model="formData.isBeltRoadCountry"
dictName="sf"
/>
</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="formData.currencyType"
placeholder="请选择币种"
>
<el-option label="人民币" value="CNY"></el-option>
<el-option label="美元" value="USD"></el-option>
<el-option label="欧元" value="EUR"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="汇率">
<el-input
v-model="formData.exchangeRate"
placeholder="请输入汇率"
:precision="6"
/>
</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
v-model="formData.constructionPeriod"
placeholder="请输入"
type="number"
min="0"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="运营年限 (年)">
<el-input
v-model="formData.operationYears"
placeholder="请输入"
type="number"
min="0"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目合作期 (年)">
<el-input
v-model="formData.cooperationPeriod"
placeholder="请输入"
type="number"
min="0"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目开工时间(预计)">
<el-date-picker
v-model="formData.plannedStartDate"
type="date"
placeholder="请选择"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目交工时间(预计)">
<el-date-picker
v-model="formData.plannedCompletionDate"
type="date"
placeholder="请选择"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 5. 投资分类 -->
<el-collapse-item title="投资分类" name="投资分类">
<el-row :gutter="20">
<el-col :span="24">
<el-tabs v-model="activeInvestTab">
<el-tab-pane label="投资属性分类" name="attribute">
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="一级分类">
<el-input
v-model="formData.investAttributeFirst"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="二级分类">
<el-input
v-model="formData.investAttributeSecond"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="投资板块">
<el-input
v-model="formData.investPlate1"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="投资板块">
<el-input
v-model="formData.investPlate2"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
</el-tab-pane>
<el-tab-pane label="投资目的分类" name="purpose">
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="一级分类">
<el-input
v-model="formData.investPurposeFirst"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="2+9布局分类">
<el-input
v-model="formData.layout29"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="二级分类">
<el-input
v-model="formData.investPurposeSecond"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="国民经济行业">
<el-input
v-model="formData.nationalEconomicIndustry"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="四新分类">
<el-input
v-model="formData.fourNewClassification"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
</el-tab-pane>
</el-tabs>
</el-col>
</el-row>
</el-collapse-item>
<!-- 6. 特别关注、特别监管类等信息 -->
<el-collapse-item
title="特别关注、特别监管类等信息"
name="特别关注、特别监管类等信息"
>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="是否须报国家发展改革委和商务部核准">
<CommonSelector
:radio="true"
v-model="formData.isReportedToNDRC"
dictName="sf"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否国家领导见签">
<CommonSelector
:radio="true"
v-model="formData.isLeaderSigned"
dictName="sf"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否境内特别监管类">
<CommonSelector
:radio="true"
v-model="formData.isDomesticSpecialSupervision"
dictName="sf"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否列入国资委负面清单">
<CommonSelector
:radio="true"
v-model="formData.isInSASACNegaticveList"
dictName="sf"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 7. 建设规模(实物量指标) -->
<el-collapse-item
title="建设规模(实物量指标)"
name="建设规模(实物量指标)"
>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label=" ">
<DynamicTable
:showAddButton="!isPreview"
:columns="constructionScaleColumns"
:disabled="isPreview"
v-model="formData.constructionScaleList"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 8. 股东信息 -->
<el-collapse-item title="股东信息" name="股东信息">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label=" ">
<DynamicTable
:showAddButton="!isPreview"
:columns="shareholderColumns"
:disabled="isPreview"
v-model="formData.shareholderList"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 9. 我方担保及股权融资情况 -->
<el-collapse-item
title="我方担保及股权融资情况"
name="我方担保及股权融资情况"
>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="我方负责的股权融资金额(万元)">
<el-input
v-model="formData.equityFinancingAmount"
placeholder="请输入"
type="number"
:precision="2"
min="0"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="融资成本(%)">
<el-input
v-model="formData.equityFinancingCost"
placeholder="请输入"
type="number"
:precision="2"
min="0"
max="100"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="期限(年)">
<el-input
v-model="formData.equityFinancingTerm"
placeholder="请输入"
type="number"
min="0"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="担保金额(万元)">
<el-input
v-model="formData.guaranteeAmount"
placeholder="请输入"
type="number"
:precision="2"
min="0"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 10. 我方担保及债权融资情况 -->
<el-collapse-item
title="我方担保及债权融资情况"
name="我方担保及债权融资情况"
>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label=" ">
<DynamicTable
:showAddButton="!isPreview"
:columns="debtFinancingColumns"
:disabled="isPreview"
v-model="formData.debtFinancingList"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 11. 项目内容及必要性 -->
<el-collapse-item
title="项目内容及必要性"
name="项目内容及必要性"
>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="建设内容及规模">
<el-input
v-model="formData.constructionContent"
type="textarea"
rows="4"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目必要性">
<el-input
v-model="formData.projectNecessity"
type="textarea"
rows="4"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="其他说明">
<el-input
v-model="formData.otherDescription"
type="textarea"
rows="4"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 12. 风险管理 -->
<el-collapse-item title="风险管理" name="风险管理">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label=" ">
<DynamicTable
:showAddButton="!isPreview"
:columns="riskManagementColumns"
:disabled="isPreview"
v-model="formData.riskManagementList"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 13. 里程碑节点 -->
<el-collapse-item title="里程碑节点" name="里程碑节点">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label=" ">
<DynamicTable
:showAddButton="!isPreview"
:columns="milestoneColumns"
:disabled="isPreview"
v-model="formData.milestoneList"
/>
</el-form-item>
</el-col>
<el-col :span="24" style="margin-top: 20px">
<el-form-item label="里程碑计划审批表">
<FileUploader
v-model="formData.milestoneApprovalFile"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 14. 投决申报材料 -->
<el-collapse-item title="投决申报材料" name="投决申报材料">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="可研材料">
<FileUploader v-model="formData.feasibilityStudyFile" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="经济指标初步测算资料">
<FileUploader
v-model="formData.economicIndicatorFile"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="补充相关支撑材料">
<FileUploader
v-model="formData.supplementarySupportFile"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="其他相关支撑材料">
<FileUploader v-model="formData.otherSupportFile" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="上会议案">
<FileUploader v-model="formData.meetingProposalFile" />
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
</el-collapse>
</el-form>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage } from "element-plus";
import DynamicTable from "@/components/FormDynamicTable/index.vue";
import FileUploader from "@/components/FileUploader/index.vue";
// ========== 动态表格列配置 ==========
// 7. 建设规模列配置
const constructionScaleColumns = ref([
{
prop: "indicatorName",
label: "指标名称",
type: "input",
placeholder: "请输入指标名称",
},
{
prop: "quantity",
label: "数量",
type: "input",
placeholder: "请输入数量",
typeParams: { type: "number", min: 0 },
},
{ prop: "unit", label: "单位", type: "input", placeholder: "请输入单位" },
{
prop: "supplement",
label: "补充说明",
type: "input",
placeholder: "请输入补充说明",
},
]);
// 8. 股东信息列配置
const shareholderColumns = ref([
{
prop: "shareholderType",
label: "股东类型",
type: "input",
placeholder: "请输入股东类型",
},
{
prop: "shareholderName",
label: "股东名称",
type: "input",
placeholder: "请输入股东名称",
},
{
prop: "shareholdingRatio",
label: "持股比例(%)",
type: "input",
placeholder: "请输入",
typeParams: { type: "number", min: 0, max: 100, precision: 2 },
},
{
prop: "contributionAmount",
label: "出资额(万元)",
type: "input",
placeholder: "请输入",
typeParams: { type: "number", min: 0, precision: 2 },
},
{
prop: "registeredCapital",
label: "应缴注册资本(万元)",
type: "input",
placeholder: "请输入",
typeParams: { type: "number", min: 0, precision: 2 },
},
{
prop: "projectCapital",
label: "应出项目资本金(万元)",
type: "input",
placeholder: "请输入",
typeParams: { type: "number", min: 0, precision: 2 },
},
{
prop: "cooperatorSituation",
label: "合作方情况",
type: "input",
placeholder: "请输入",
},
{ prop: "remark", label: "备注", type: "input", placeholder: "请输入备注" },
]);
// 10. 债权融资列配置
const debtFinancingColumns = ref([
{
prop: "amount",
label: "金额(万元)",
type: "input",
placeholder: "请输入",
typeParams: { type: "number", min: 0, precision: 2 },
},
{
prop: "financingCost",
label: "融资成本(%)",
type: "input",
placeholder: "请输入",
typeParams: { type: "number", min: 0, max: 100, precision: 2 },
},
{
prop: "term",
label: "期限(年)",
type: "input",
placeholder: "请输入",
typeParams: { type: "number", min: 0 },
},
{
prop: "expectedLandingTime",
label: "预计落地时间",
type: "date",
placeholder: "请选择",
typeParams: { valueFormat: "YYYY-MM-DD" },
},
]);
// 12. 风险管理列配置
const riskManagementColumns = ref([
{
prop: "riskType",
label: "风险类别",
type: "input",
placeholder: "请输入风险类别",
},
{
prop: "riskDescription",
label: "风险描述",
type: "input",
placeholder: "请输入风险描述",
},
{
prop: "responseMeasures",
label: "应对措施",
type: "input",
placeholder: "请输入应对措施",
},
]);
// 13. 里程碑节点列配置
const milestoneColumns = ref([
{
prop: "milestoneName",
label: "里程碑节点名称",
type: "input",
placeholder: "请输入节点名称",
},
{
prop: "completionDescription",
label: "节点完成描述",
type: "input",
placeholder: "请输入完成描述",
},
{
prop: "expectedCompletionTime",
label: "预计完成时间",
type: "date",
placeholder: "请选择",
typeParams: { valueFormat: "YYYY-MM-DD" },
},
]);
// ========== 路由/实例/全局方法 ==========
const router = useRouter();
const route = useRoute();
const { proxy } = getCurrentInstance();
// ========== 基础配置 ==========
const activeCollapse = ref([
"项目基本信息",
"项目所在地",
"计量币种",
"实施时间",
"投资分类",
"特别关注、特别监管类等信息",
"建设规模(实物量指标)",
"股东信息",
"我方担保及股权融资情况",
"我方担保及债权融资情况",
"项目内容及必要性",
"风险管理",
"里程碑节点",
"投决申报材料",
]);
const activeInvestTab = ref("attribute"); // 投资分类默认选中属性分类
const loading = ref(false);
const isPreview = ref(!!route.query.isPreview);
const projectList = ref([]);
const rcCgqyglId = ref(route.query.id || "");
// ========== 表单数据 ==========
const formData = reactive({
// 1. 项目基本信息
projectId: "",
projectCode: "",
isReDecision: "",
projectForeignName: "",
isUnionProject: "",
investmentSubject: "",
isIntegratedSubProject: "",
directEnterprise: "",
isImportantInvestProject: "",
approvalUnit: "",
financialReportType: "",
governmentApprovalLevel: "",
isIndependentDecision: "",
businessType: "",
contactPerson: "",
contactPhone: "",
// 2. 项目所在地
domesticOverseas: "",
provinceContinent: "",
cityCountry: "",
districtCountry: "",
projectArea: "",
isBeltRoadCountry: "",
// 3. 计量币种
currencyType: "",
exchangeRate: "",
// 4. 实施时间
constructionPeriod: "",
operationYears: "",
cooperationPeriod: "",
plannedStartDate: "",
plannedCompletionDate: "",
// 5. 投资分类
investAttributeFirst: "",
investAttributeSecond: "",
investPlate1: "",
investPlate2: "",
investPurposeFirst: "",
layout29: "",
investPurposeSecond: "",
nationalEconomicIndustry: "",
fourNewClassification: "",
// 6. 特别关注、特别监管类等信息
isReportedToNDRC: "",
isLeaderSigned: "",
isDomesticSpecialSupervision: "",
isInSASACNegativeList: "",
// 7. 建设规模(实物量指标)- 动态表格
constructionScaleList: [
{ indicatorName: "", quantity: "", unit: "", supplement: "" },
],
// 8. 股东信息 - 动态表格
shareholderList: [
{
shareholderType: "",
shareholderName: "",
shareholdingRatio: "",
contributionAmount: "",
registeredCapital: "",
projectCapital: "",
cooperatorSituation: "",
remark: "",
},
],
// 9. 我方担保及股权融资情况
equityFinancingAmount: "",
equityFinancingCost: "",
equityFinancingTerm: "",
guaranteeAmount: "",
// 10. 我方担保及债权融资情况 - 动态表格
debtFinancingList: [
{ amount: "", financingCost: "", term: "", expectedLandingTime: "" },
],
// 11. 项目内容及必要性
constructionContent: "",
projectNecessity: "",
otherDescription: "",
// 12. 风险管理 - 动态表格
riskManagementList: [
{ riskType: "", riskDescription: "", responseMeasures: "" },
],
// 13. 里程碑节点 - 动态表格 + 文件
milestoneList: [
{
milestoneName: "",
completionDescription: "",
expectedCompletionTime: "",
},
],
milestoneApprovalFile: "",
// 14. 投决申报材料 - 文件上传
feasibilityStudyFile: "",
economicIndicatorFile: "",
supplementarySupportFile: "",
otherSupportFile: "",
meetingProposalFile: "",
// 其他关联字段
projectName: "",
});
// ========== 业务方法:获取项目列表 ==========
const getProjectData = () => {
proxy.$post({
url: "/api/project/listProject",
data: { page: 1, pagesize: 1000, attributes: [], menuType: "xmjc" },
callback: (data) => {
projectList.value = data.rows || [];
},
error: () => ElMessage.warning("获取项目列表失败"),
});
};
// ========== 选择项目同步名称及相关信息 ==========
const changeProject = (val) => {
proxy.$post({
url: "/api/project/getProjectFinalInfo",
data: { id: val },
callback: (data) => {
loading.value = false;
// 回填基础字段(可根据实际接口返回扩展)
formData.projectName = data.projectName || "";
formData.projectCode = data.projectCode || "";
formData.investmentSubject = data.investmentSubject || "";
},
error: () => {
loading.value = false;
ElMessage.error("获取项目详情失败");
},
});
const selectItem = projectList.value.find((item) => item.id === val);
if (selectItem) formData.projectName = selectItem.projectName;
};
// ========== 获取详情(编辑/预览) ==========
const getJsqtzjcDetail = () => {
if (!rcCgqyglId.value) return;
loading.value = true;
proxy.$post({
url: "/api/project/getTzjh",
data: { id: rcCgqyglId.value },
callback: async (data) => {
loading.value = false;
if (!data) return ElMessage.error("未查询到数据");
Object.assign(formData, data);
// 处理动态表格数据默认值
formData.constructionScaleList = data.constructionScaleList || [
{ indicatorName: "", quantity: "", unit: "", supplement: "" },
];
formData.shareholderList = data.shareholderList || [
{
shareholderType: "",
shareholderName: "",
shareholdingRatio: "",
contributionAmount: "",
registeredCapital: "",
projectCapital: "",
cooperatorSituation: "",
remark: "",
},
];
formData.debtFinancingList = data.debtFinancingList || [
{ amount: "", financingCost: "", term: "", expectedLandingTime: "" },
];
formData.riskManagementList = data.riskManagementList || [
{ riskType: "", riskDescription: "", responseMeasures: "" },
];
formData.milestoneList = data.milestoneList || [
{
milestoneName: "",
completionDescription: "",
expectedCompletionTime: "",
},
];
},
error: () => {
loading.value = false;
ElMessage.error("获取投资计划详情失败");
},
});
};
// ========== 保存表单 ==========
const saveClick = () => {
if (!formData.projectId) return ElMessage.warning("请选择项目信息");
loading.value = true;
const url = rcCgqyglId.value
? "/api/project/updateTzjh"
: "/api/project/createTzjh";
// 组装提交数据
const submitData = {
...formData,
projectId: String(formData.projectId),
};
proxy.$post({
url: url,
data: submitData,
callback: () => {
loading.value = false;
ElMessage.success(rcCgqyglId.value ? "编辑成功" : "新增成功");
router.back(-1);
},
error: (err) => {
loading.value = false;
ElMessage.error(err.msg || "保存失败");
},
});
};
// ========== 辅助方法 ==========
const backClick = () => router.back(-1);
onMounted(() => {
getProjectData();
if (rcCgqyglId.value) {
// 编辑/预览:拉取接口数据
getJsqtzjcDetail();
}
});
</script>
<style scoped lang="less">
@import "@/styles/verticalManages.less";
// 调整折叠面板和表格样式
:deep(.el-collapse-item__header) {
font-weight: 600;
}
:deep(.el-table) {
--el-table-header-text-color: #333;
--el-table-row-hover-bg-color: #f8f9fa;
}
// 文件上传组件间距
:deep(.el-form-item) {
margin-bottom: 20px;
}
</style>
......@@ -15,23 +15,30 @@
<div class="tab-content">
<el-form :model="formData" :label-width="200" :disabled="isPreview">
<el-collapse v-model="activeCollapse">
<!-- 基本信息:字段完全对齐数据库 -->
<!-- 选择类型 -->
<el-collapse-item title="选择类型" name="选择类型">
<el-row :gutter="20">
<el-col :span="12">
<el-col :span="8">
<el-form-item label="请选择登记类型">
<CommonSelector
<!-- <CommonSelector
:radio="true"
v-model="formData.djlx"
dictName="xmtc_djlx"
/>
/> -->
<el-radio-group v-model="formData.djlx">
<el-radio value="1">中止</el-radio>
<el-radio value="2">重启</el-radio>
<el-radio value="3">终止</el-radio>
<el-radio value="4">推出</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 基本信息 -->
<el-collapse-item title="基本信息" name="基本信息">
<el-row :gutter="20">
<el-col :span="12">
<el-col :span="8">
<el-form-item label="项目名称" required>
<el-select
v-model="formData.projectId"
......@@ -49,15 +56,24 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目外文名称">
<el-col :span="8">
<el-form-item label="项目编号">
<el-input
v-model="formData.projectForeignName"
placeholder="请输入项目外文名称"
v-model="formData.xmbh"
placeholder="请输入项目编号"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="是否联合体">
<el-input
v-model="formData.sfLht"
placeholder="请输入是否联合体"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="申报单位">
<el-input
v-model="formData.sbdw"
......@@ -65,7 +81,7 @@
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="所属二级企业">
<el-input
v-model="formData.ssejqy"
......@@ -74,139 +90,82 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目预计起始时间">
<el-date-picker
v-model="formData.xmkgsjyj"
type="date"
placeholder="请选择项目预计起始时间"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目公司名称">
<el-col :span="8">
<el-form-item label="一级分类">
<el-input
v-model="formData.xmgsmc"
placeholder="请输入项目公司名称"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目预计完成时间">
<el-date-picker
v-model="formData.xmjgsjyj"
type="date"
placeholder="请选择项目预计完成时间"
value-format="YYYY-MM-DD"
v-model="formData.yjFl"
placeholder="请输入一级分类"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="填报人">
<el-col :span="8">
<el-form-item label="二级分类">
<el-input
v-model="formData.tbr"
placeholder="请输入填报人"
v-model="formData.ejFl"
placeholder="请输入二级分类"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="填报人联系电话">
<el-col :span="8">
<el-form-item label="投资板块">
<el-input
v-model="formData.tbrlxdh"
placeholder="请输入填报人联系电话"
v-model="formData.tzBk"
placeholder="请输入投资板块"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目建设期 (月)">
<el-col :span="8">
<el-form-item label="细分板块">
<el-input
v-model="formData.xmjsqy"
:min="0"
placeholder="请输入项目建设期 (月)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目流转状态(审批状态)">
<CommonSelector
v-model="formData.projectLzType"
dictName="xmlzzt"
></CommonSelector>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目阶段">
<CommonSelector
v-model="formData.xmjd"
dictName="project_phase"
v-model="formData.xfBk"
placeholder="请输入细分板块"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="运营年限(年)">
<el-col :span="8">
<el-form-item label="项目公司全称">
<el-input
v-model="formData.yynxn"
:min="0"
placeholder="请输入运营年限(年)"
v-model="formData.xmgsmc"
placeholder="请输入项目公司全称"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="建成后成效">
<el-col :span="8">
<el-form-item label="项目批复时间">
<el-input
v-model="formData.jchcx"
type="textarea"
:rows="3"
placeholder="请输入建成后成效"
v-model="formData.xmPfsj"
placeholder="请输入项目批复时间"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="项目信息" required>
<el-select
v-model="formData.projectId"
placeholder="请选择项目信息"
no-data-text="暂无数据"
@change="changeProject"
>
<el-option
v-for="item in projectList"
:key="item.id"
:label="item.projectName"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目外文名称">
<el-col :span="8">
<el-form-item label="报备时间">
<el-input
v-model="formData.projectForeignName"
placeholder="请输入项目外文名称"
v-model="formData.bbsj"
placeholder="请输入报备时间"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="填报单位名称">
<el-col :span="8">
<el-form-item label="项目建设期 (月)">
<el-input
v-model="formData.tbdwmc"
placeholder="请输入填报单位名称"
v-model="formData.xmjsqy"
:min="0"
placeholder="请输入项目建设期 (月)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属二级企业">
<el-col :span="8">
<el-form-item label="运营年限(年)">
<el-input
v-model="formData.ssejqy"
placeholder="请输入所属二级企业"
v-model="formData.yynxn"
:min="0"
placeholder="请输入运营年限(年)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="项目预计起始时间">
<el-date-picker
v-model="formData.xmkgsjyj"
......@@ -216,15 +175,8 @@
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目公司名称">
<el-input
v-model="formData.xmgsmc"
placeholder="请输入项目公司名称"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="项目预计完成时间">
<el-date-picker
v-model="formData.xmjgsjyj"
......@@ -234,7 +186,29 @@
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="退出申请日期">
<el-date-picker
v-model="formData.tcSqrq"
type="date"
placeholder="请选择退出申请日期"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="申请日期">
<el-date-picker
v-model="formData.sqrq"
type="date"
placeholder="请选择申请日期"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="填报人">
<el-input
v-model="formData.tbr"
......@@ -242,7 +216,7 @@
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="填报人联系电话">
<el-input
v-model="formData.tbrlxdh"
......@@ -250,350 +224,258 @@
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目建设期 (月)">
<el-col :span="8">
<el-form-item label="当前净资产">
<el-input
v-model="formData.xmjsqy"
v-model="formData.zqRz"
:min="0"
placeholder="请输入项目建设期 (月)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目流转状态(审批状态)">
<CommonSelector
v-model="formData.projectLzType"
dictName="xmlzzt"
></CommonSelector>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目阶段">
<CommonSelector
v-model="formData.xmjd"
dictName="project_phase"
:precision="2"
controls-position="right"
placeholder="0.00"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="运营年限(年)">
<el-col :span="24">
<el-form-item label="项目的主要建设内容">
<el-input
v-model="formData.yynxn"
:min="0"
placeholder="请输入运营年限(年)"
v-model="formData.xmJsContent"
type="textarea"
rows="3"
placeholder="请输入项目的主要建设内容"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="建成后成效">
<el-form-item label="我方出资人及持股比例">
<el-input
v-model="formData.jchcx"
v-model="formData.cgRatio"
type="textarea"
:rows="3"
placeholder="请输入建成后成效"
rows="3"
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-col :span="24">
<el-form-item label="最终分类情况说明">
<el-input
v-model="formData.zzflqk"
type="textarea"
:rows="5"
placeholder="请输入最终分类情况详细说明"
<el-form-item label=" ">
<DynamicTable
:showAddButton="false"
:columns="transferColumns"
:disabled="isPreview"
v-model="formData.projectGdxxs"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 年度投资计划:基础信息 -->
<el-collapse-item title="年度投资计划" name="年度投资计划">
<el-collapse-item title="项目中止内容" name="项目中止内容">
<el-row :gutter="20">
<!-- 基础短字段:span12分栏 -->
<el-col :span="12">
<el-form-item label="计划年份">
<el-date-picker
v-model="formData.jhnf"
type="year"
format="YYYY"
value-format="YYYY"
placeholder="请选择计划年份"
picker-options="{ disabledDate: (date) => date > new Date() }"
<el-col :span="24">
<el-form-item label="中止原因">
<el-input
v-model="formData.zzyy"
type="textarea"
rows="2"
placeholder="请输入中止原因"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="新建/续建">
<CommonSelector v-model="formData.xjXj" dictName="xj" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="年度投资目标">
<el-col :span="24">
<el-form-item label="中止详细原因">
<el-input
v-model="formData.ndTzMb"
placeholder="请输入年度投资目标"
v-model="formData.zzxxyy"
type="textarea"
rows="3"
placeholder="请输入中止详细原因"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目预计工期">
<el-col :span="24">
<el-form-item label="其他说明">
<el-input
v-model="formData.xmYjGq"
placeholder="请输入项目预计工期(如12个月)"
v-model="formData.qtsm"
type="textarea"
rows="3"
placeholder="请输入其他说明"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目融资落地时间或预计落地时间">
<el-date-picker
v-model="formData.xmRzLdSjHyyjLdSj"
type="date"
placeholder="请选择时间"
value-format="YYYY-MM-DD"
/>
<el-col :span="24">
<el-form-item label="中止报告">
<FileUploader v-model="formData.zzbg"></FileUploader>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预计实现资本金内部收益率(%)">
<el-input
v-model="formData.yjSxZbjNbsyl"
:min="0"
:precision="2"
:max="999.99"
controls-position="right"
placeholder="请输入收益率"
style="width: 100%"
/>
<el-col :span="24">
<el-form-item label="其他相关支撑材料">
<FileUploader
v-model="formData.qtxgzccl"
></FileUploader>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目计划总投资类型">
<el-input
v-model="formData.xmTzZeXmJhZtzLx"
placeholder="请输入项目计划总投资类型"
/>
<el-col :span="24">
<el-form-item label="报批报备文件">
<FileUploader v-model="formData.bpbbwj"></FileUploader>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="计划类型">
</el-row>
</el-collapse-item>
<el-collapse-item title="项目重启内容" name="项目重启内容">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="中止原因">
<el-input
v-model="formData.jhLx"
placeholder="请输入计划类型"
v-model="formData.zzyy"
type="textarea"
rows="2"
placeholder="请输入中止原因"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前进展阶段">
<el-col :span="24">
<el-form-item label="中止详细原因">
<el-input
v-model="formData.dqJzJd"
placeholder="请输入当前进展阶段"
v-model="formData.zzxxyy"
type="textarea"
rows="3"
placeholder="请输入中止详细原因"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目融资是否已经落地">
<CommonSelector
v-model="formData.xmRzSfYjLd"
dictName="sf"
<el-col :span="24">
<el-form-item label="其他说明">
<el-input
v-model="formData.qtsm"
type="textarea"
rows="3"
placeholder="请输入其他说明"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前进展情况">
<el-input
v-model="formData.dqJzQk"
placeholder="请输入当前进展情况"
/>
<el-col :span="24">
<el-form-item label="中止报告">
<FileUploader v-model="formData.zzbg"></FileUploader>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目实际开工时间">
<el-date-picker
v-model="formData.xmSjKgSj"
type="date"
placeholder="请选择时间"
value-format="YYYY-MM-DD"
/>
<el-col :span="24">
<el-form-item label="其他相关支撑材料">
<FileUploader
v-model="formData.qtxgzccl"
></FileUploader>
</el-form-item>
</el-col>
<!-- 长文本字段:span24通栏,用文本域 -->
<el-col :span="24">
<el-form-item label="预期实现效果">
<el-input
v-model="formData.yqSxXg"
type="textarea"
:rows="3"
placeholder="请输入预期实现效果详细说明"
/>
<el-form-item label="报批报备文件">
<FileUploader v-model="formData.bpbbwj"></FileUploader>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="项目终止内容" name="项目终止内容">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item
label="2025年投资金额(全口径)目标(决算)与计划差异说明"
>
<el-form-item label="中止原因">
<el-input
v-model="formData.nTzJqMbjyYjhCySm"
v-model="formData.zzyy"
type="textarea"
:rows="3"
placeholder="请输入差异说明"
rows="2"
placeholder="请输入中止原因"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
label="2025年计划投资目标(决算)与计划差异说明"
>
<el-form-item label="中止详细原因">
<el-input
v-model="formData.nJhTzMbjyYjhCySm"
v-model="formData.zzxxyy"
type="textarea"
:rows="3"
placeholder="请输入差异说明"
rows="3"
placeholder="请输入中止详细原因"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目主要风险及主要风险应对举措">
<el-form-item label="其他说明">
<el-input
v-model="formData.xmZyFxJzyFxYdcj"
v-model="formData.qtsm"
type="textarea"
:rows="4"
placeholder="请输入主要风险及对应的应对举措"
rows="3"
placeholder="请输入其他说明"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 项目年度计划(资金支付口径):金额类字段统一用数字输入框,精度2,单位万元 -->
<el-collapse-item
title="项目年度计划(资金支付口径)"
name="项目年度计划(资金支付口径)"
>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="资金支付比例(%)">
<el-input
v-model="formData.zjfzBl"
:min="0"
:max="100"
:precision="2"
controls-position="right"
placeholder="0.00"
style="width: 100%"
/>
<el-col :span="24">
<el-form-item label="中止报告">
<FileUploader v-model="formData.zzbg"></FileUploader>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="债权融资(万元)">
<el-input
v-model="formData.zqRz"
:min="0"
:precision="2"
controls-position="right"
placeholder="0.00"
style="width: 100%"
/>
<el-col :span="24">
<el-form-item label="其他相关支撑材料">
<FileUploader
v-model="formData.qtxgzccl"
></FileUploader>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="年度计划总额(万元)">
<el-input
v-model="formData.ndJhZe"
:min="0"
:precision="2"
controls-position="right"
placeholder="0.00"
style="width: 100%"
/>
<el-col :span="24">
<el-form-item label="报批报备文件">
<FileUploader v-model="formData.bpbbwj"></FileUploader>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="回款再投入(万元)">
</el-row>
</el-collapse-item>
<el-collapse-item title="项目退出内容" name="项目退出内容">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="中止原因">
<el-input
v-model="formData.hkZtr"
:min="0"
:precision="2"
controls-position="right"
placeholder="0.00"
style="width: 100%"
v-model="formData.zzyy"
type="textarea"
rows="2"
placeholder="请输入中止原因"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资本金-配套方(万元)">
<el-col :span="24">
<el-form-item label="中止详细原因">
<el-input
v-model="formData.zbjPtF"
:min="0"
:precision="2"
controls-position="right"
placeholder="0.00"
style="width: 100%"
v-model="formData.zzxxyy"
type="textarea"
rows="3"
placeholder="请输入中止详细原因"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="其他(万元)">
<el-col :span="24">
<el-form-item label="其他说明">
<el-input
v-model="formData.qt"
:min="0"
:precision="2"
controls-position="right"
placeholder="0.00"
style="width: 100%"
v-model="formData.qtsm"
type="textarea"
rows="3"
placeholder="请输入其他说明"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资本金-外部股东(万元)">
<el-input
v-model="formData.zbjWbGd"
:min="0"
:precision="2"
controls-position="right"
placeholder="0.00"
style="width: 100%"
/>
<el-col :span="24">
<el-form-item label="中止报告">
<FileUploader v-model="formData.zzbg"></FileUploader>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="我方仅指本单位出资(万元)">
<el-input
v-model="formData.wfJzBdwCz"
:min="0"
:precision="2"
controls-position="right"
placeholder="0.00"
style="width: 100%"
/>
<el-col :span="24">
<el-form-item label="其他相关支撑材料">
<FileUploader
v-model="formData.qtxgzccl"
></FileUploader>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 2026年参股单位出资情况修正 -->
<el-collapse-item
title="2026年参股单位出资情况修正(单位:万元)"
name="2026年参股单位出资情况修正(单位:万元)"
>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="参股单位出资情况修正">
<DynamicTable
:columns="transferColumns"
:disabled="isPreview"
v-model="formData.cgdwczqkxz"
:default-row="{
mc: '',
fj: '',
bz: '',
}"
/>
<el-form-item label="报批报备文件">
<FileUploader v-model="formData.bpbbwj"></FileUploader>
</el-form-item>
</el-col>
</el-row>
......@@ -608,72 +490,74 @@
</template>
<script setup>
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage } from "element-plus";
import DynamicTable from "@/components/FormDynamicTable/index.vue";
// ========== 年度计划子组件专属时间列表【核心:适配任意年份,父子唯一统一】 ==========
const annualDynamicTimeList = ref([]);
// ========== 【核心通用方法1】从表格数据自动解析基准年(适配2022/2023/任意年回显) ==========
// 解析锚点:匹配数据中的「XX-小记」字段,提取XX作为基准年,无则兜底用【系统年+1】(贴合原有新增逻辑)
const getBaseYearFromTableData = (tableData) => {
if (!Array.isArray(tableData) || tableData.length === 0) {
return new Date().getFullYear() + 1;
}
const firstRowKeys = Object.keys(tableData[0]);
const matchKey = firstRowKeys.find((key) => key.includes("-小记"));
if (matchKey) {
const baseYear = Number(matchKey.split("-")[0]);
return baseYear;
}
return new Date().getFullYear() + 1;
};
// ========== 【核心通用方法2】根据基准年生成时间列表(保留原有字段结构,支持传参) ==========
// 新增模式:传系统年+1;编辑模式:传解析出的基准年(2022/2023/任意)
const getCurrentYearTimeList = (baseYear) => {
const targetYear = baseYear || new Date().getFullYear() + 1;
const preYear = targetYear - 1;
const timeList = [
`${preYear}及以前`,
`${targetYear}`,
`${targetYear}-小记`,
`${targetYear}-一季度`,
`${targetYear}-二季度`,
`${targetYear}-三季度`,
`${targetYear}-四季度`,
`${targetYear + 1}`,
`${targetYear + 2}`,
`${targetYear + 3}`,
`${targetYear + 4}`,
`${targetYear + 5}`,
];
annualDynamicTimeList.value = timeList;
};
import FileUploader from "@/components/FileUploader/index.vue";
// ========== 动态表格列配置(参股单位出资修正) ==========
const transferColumns = ref([
{
prop: "mc",
label: "单位名称",
prop: "njfcgbl",
label: "审批时",
disabled: true,
type: "input",
headerGroup: "投资总额(万元)",
placeholder: "请输入审批时金额",
},
{
prop: "njfcgblqk",
label: "已投资",
type: "input",
headerGroup: "投资总额(万元)",
placeholder: "审批时已投资金额",
},
{
prop: "njfcgblqk_nt",
label: "审批时",
disabled: true,
type: "input",
headerGroup: "我方资本金出资(万元)",
placeholder: "请填写审批时",
},
{
prop: "zwfcgbl",
label: "已投资",
type: "input",
headerGroup: "我方资本金出资(万元)",
placeholder: "请填写已投资",
},
{
prop: "jjcgbl",
label: "预计",
disabled: true,
type: "input",
headerGroup: "项目全投资内部收益率(税前)%",
placeholder: "请填写预计",
min: 0,
},
{
prop: "njfglmc",
label: "预计",
type: "input",
placeholder: "请填写单位名称",
headerGroup: "项目全投资内部收益率(税前)%",
placeholder: "请填写预计",
},
{
prop: "fj",
label: "我方出资额(万元)",
prop: "jjcgbl2",
label: "预计",
disabled: true,
type: "input",
placeholder: "请输入我方出资额(万元)",
headerGroup: "项目全投资内部收益率(税后)%",
placeholder: "请填写预计",
min: 0,
precision: 2,
},
{
prop: "bz",
label: "差异说明",
type: "textarea",
rows: 2,
placeholder: "请输入差异说明",
prop: "njfglmc2",
label: "预计",
type: "input",
headerGroup: "项目全投资内部收益率(税后)%",
placeholder: "请填写预计",
},
]);
......@@ -682,481 +566,65 @@ const router = useRouter();
const route = useRoute();
const { proxy } = getCurrentInstance();
// ========== 基础配置:两个表格共用(仅时间列表,无其他关联) ==========
// ========== 基础配置 ==========
const activeCollapse = ref([
"基本信息",
"年度投资计划",
"项目年度计划(资金支付口径)",
"2026年参股单位出资情况修正(单位:万元)",
"可研/决策信息(单位:万元)",
"项目年度计划表格(单位:万元)",
"选择类型",
"发展类(B类)",
"关注类(C类)",
"管控类(D类)",
"最终分类情况",
"基本信息",
"项目中止内容",
"项目重启内容",
"项目终止内容",
"项目退出内容",
"项目投资效益",
]);
const loading = ref(false);
const isPreview = ref(!!route.query.isPreview);
const projectList = ref([]);
const rcCgqyglId = ref(route.query.id || "");
const timeHeaderType = ref("year"); // year/ month 切换时间表头类型
const dynamicTimeList = ref([]); // 可研表格专属时间列表,与年度计划彻底隔离
// ========== 数据源完全隔离:可研表格 & 年度计划表格 各自独立 ==========
// 1. 可研/决策信息表格:专属数据源(独立)
const financialIndicators = ref([]); // 可研表格渲染数据源
// ========== 可研/决策信息表格:原始配置+专属初始化/方法(完全独立) ==========
const financialOriginConfig = ref([
{
serialNumber: "1",
indicatorName: "项目筹资(建设期投资)",
level: 0,
isTotal: false,
},
{
serialNumber: "1.1",
indicatorName: "项目资本金(股权融资)",
level: 1,
isTotal: false,
},
{ serialNumber: "1.1.1", indicatorName: "能建方", level: 2, isTotal: false },
{
serialNumber: "1.1.2",
indicatorName: "其他社会资本方",
level: 2,
isTotal: false,
},
{
serialNumber: "1.2",
indicatorName: "借款(债权融资)",
level: 1,
isTotal: false,
},
{
serialNumber: "1.2.1",
indicatorName: "银行贷款",
level: 2,
isTotal: false,
},
{
serialNumber: "1.2.1.1",
indicatorName: "其中:非并表项目我方贷款/担保额",
level: 3,
isTotal: false,
},
{ serialNumber: "1.3", indicatorName: "其他出资", level: 1, isTotal: false },
{
serialNumber: "1.3.1",
indicatorName: "其中:能建方出资",
level: 2,
isTotal: false,
},
{
serialNumber: " ",
indicatorName: "筹资总额",
level: 1,
isTotal: true,
parentCode: ["1.1", "1.2", "1.3"],
},
{ serialNumber: "2", indicatorName: "经营情况", level: 0, isTotal: false },
{
serialNumber: "2.1",
indicatorName: "营业总收入",
level: 1,
isTotal: false,
},
{
serialNumber: "2.2",
indicatorName: "营业总成本",
level: 1,
isTotal: false,
},
{
serialNumber: "2.2.1",
indicatorName: "其中:营业成本",
level: 2,
isTotal: false,
},
{
serialNumber: "2.2.2",
indicatorName: "其中:折旧及摊销",
level: 2,
isTotal: false,
},
{ serialNumber: "2.3", indicatorName: "利润总额", level: 1, isTotal: false },
{ serialNumber: "2.4", indicatorName: "所得税", level: 1, isTotal: false },
{ serialNumber: "2.5", indicatorName: "净利润", level: 1, isTotal: false },
{
serialNumber: "2.6",
indicatorName: "能建方分红(税前)",
level: 1,
isTotal: false,
},
{
serialNumber: "2.7",
indicatorName: "能建方分红(税后)",
level: 1,
isTotal: false,
},
{
serialNumber: "2.8",
indicatorName: "未分配利润",
level: 1,
isTotal: false,
},
{ serialNumber: "3", indicatorName: "资金偿还", level: 0, isTotal: false },
{ serialNumber: "3.1", indicatorName: "银行贷款", level: 1, isTotal: false },
{ serialNumber: "3.1.1", indicatorName: "项目贷", level: 2, isTotal: false },
{
serialNumber: "3.1.2",
indicatorName: "项目贷利息",
level: 2,
isTotal: false,
},
{ serialNumber: "3.2", indicatorName: "其他资金", level: 1, isTotal: false },
{
serialNumber: "3.2.1",
indicatorName: "其他资金本金",
level: 2,
isTotal: false,
},
{
serialNumber: "3.2.2",
indicatorName: "其他资金利息(融资费用)",
level: 2,
isTotal: false,
},
{
serialNumber: "4",
indicatorName: "项目公司其他财务指标",
level: 0,
isTotal: false,
},
{
serialNumber: "4.1",
indicatorName: "资产总额(期末值)",
level: 1,
isTotal: false,
},
{
serialNumber: "4.2",
indicatorName: "负债总额(期末值)",
level: 1,
isTotal: false,
},
{
serialNumber: "4.3",
indicatorName: "经营活动产生的现金流净额",
level: 1,
isTotal: false,
},
{
serialNumber: "4.3.1",
indicatorName: "经营活动产生的现金流入",
level: 2,
isTotal: false,
},
{
serialNumber: "4.3.2",
indicatorName: "经营活动产生的现金流出",
level: 2,
isTotal: false,
},
{
serialNumber: "4.4",
indicatorName: "投资活动产生的现金流净额",
level: 1,
isTotal: false,
},
{
serialNumber: "4.4.1",
indicatorName: "投资活动产生的现金流入",
level: 2,
isTotal: false,
},
{
serialNumber: "4.4.2",
indicatorName: "投资活动产生的现金流出",
level: 2,
isTotal: false,
},
{
serialNumber: "4.5",
indicatorName: "筹资活动产生的现金流净额",
level: 1,
isTotal: false,
},
{
serialNumber: "4.5.1",
indicatorName: "筹资活动产生的现金流入",
level: 2,
isTotal: false,
},
{
serialNumber: "4.5.2",
indicatorName: "筹资活动产生的现金流出",
level: 2,
isTotal: false,
},
{
serialNumber: "4.6",
indicatorName: "利息备付率",
level: 1,
isTotal: false,
},
{
serialNumber: "4.7",
indicatorName: "偿债备付率",
level: 1,
isTotal: false,
},
{
serialNumber: "4.8",
indicatorName: "投资回收额",
level: 1,
isTotal: false,
},
]);
// ========== 表单数据:完全对齐数据库,两个表格的JSON字段完全独立 ==========
// ========== 表单数据(仅保留核心使用的字段) ==========
const formData = reactive({
// 动态表格数据
projectGdxxs: [
{
njfcgbl: "",
njfcgblqk_nt: "",
jjcgbl: "",
jjcgbl2: "",
njfcgblqk: "",
zwfcgbl: "",
njfglmc: "",
njfglmc2: "",
},
],
// 基础字段
projectId: "",
projectName: "",
projectForeignName: "",
djlx: "", // 登记类型
xmbh: "", // 项目编号
sfLht: "", // 是否联合体
sbdw: "", // 申报单位
ssejqy: "", // 所属二级企业
xmgsmc: "", // 项目公司名称
yjFl: "", // 一级分类
ejFl: "", // 二级分类
tzBk: "", // 投资板块
xfBk: "", // 细分板块
xmgsmc: "", // 项目公司全称
xmPfsj: "", // 项目批复时间
bbsj: "", // 报备时间
xmkgsjyj: "", // 项目预计起始时间
xmjgsjyj: "", // 项目预计完成时间
tbr: "", // 填报人
tbrlxdh: "", // 填报人联系电话
tcSqrq: "", // 退出申请日期
sqrq: "", // 申请日期
xmjsqy: 0, // 项目建设期(月)
projectLzType: "", // 项目流转状态(审批状态)
xmjd: "", // 项目阶段
yynxn: 0, // 运营年限(年)
jchcx: "", // 建成后成效
// 选择类型
sfgjzcqghzdxm: null,
sfgjygbmxddzdxm: null,
dgmsbgx: null,
zlxxxcybdgc: null,
lryqcyhxhwlcyqhxddxm: null,
qlblzdxm: null,
dyzdhzdxmmlmc: "",
zlxxxcyfl: "",
// 发展类B
lrqyfzzlxxxcygzfadxm: null,
lsnykczybzxm: null,
ctcygdh: null,
zcqyfzdddxm: null,
zzyjsgzxm: null,
// 关注类C
dwbgltzxm: null,
tbjglxm: null,
jwtbgzlxm: null,
dwcglxtzxm: null,
fdctzxm: null,
ppptzxm: null,
lgxm: null,
// 管控类D
fzytzxm: null,
zpjrjg: null,
ljrjg: null,
qtjrjg: null,
jjjjjglgs: null,
cytzjj: null,
// 最终分类
zzflqk: "",
// 两个表格的JSON字段:完全独立,无任何关联
kyjcxx: [], // 可研/决策信息表格:专属提交字段
xmndjh: [], // 项目年度计划表格:专属提交字段(子组件双向绑定)
// 年度投资计划基础信息
jhnf: "",
xjXj: "",
ndTzMb: "",
xmYjGq: "",
xmRzLdSjHyyjLdSj: "",
yjSxZbjNbsyl: "",
xmTzZeXmJhZtzLx: "",
jhLx: "",
dqJzJd: "",
dqJzQk: "",
xmRzSfYjLd: "",
xmSjKgSj: "",
yqSxXg: "",
nTzJqMbjyYjhCySm: "",
nJhTzMbjyYjhCySm: "",
xmZyFxJzyFxYdcj: "",
// 项目年度计划(资金支付口径) 金额类字段
zjfzBl: 0.0,
zqRz: 0.0,
ndJhZe: 0.0,
hkZtr: 0.0,
zbjPtF: 0.0,
qt: 0.0,
zbjWbGd: 0.0,
wfJzBdwCz: 0.0,
// 参股单位出资修正
cgdwczqkxz: [],
tbr: "", // 填报人
tbrlxdh: "", // 填报人联系电话
zqRz: 0.0, // 当前净资产
xmJsContent: "", // 项目主要建设内容
cgRatio: "", // 我方出资人及持股比例
});
// ========== 【专属方法】可研/决策信息表格:初始化(独立) ==========
const initFinancialTable = () => {
if (dynamicTimeList.value.length === 0) return;
const tableData = financialOriginConfig.value.map((item) => {
const row = { ...item, total: 0 };
// 仅为可研表格的行赋值时间字段,与年度计划无关
dynamicTimeList.value.forEach((time) => (row[time] = 0));
return row;
});
financialIndicators.value = tableData;
// 初始化可研表格的合计
initFinancialRowTotal();
};
// ========== 【专属方法】项目年度计划表格:初始化(独立,仅新增模式执行,不覆盖接口数据) ==========
const initAnnualPlanTable = () => {
// 仅新增模式初始化,编辑模式由接口回填,不执行此方法
if (rcCgqyglId.value) return;
if (annualDynamicTimeList.value.length === 0) return;
// 生成17行带唯一id的独立数据(保留基础id,子组件会保留所有字段)
const tableData = Array.from({ length: 17 }, (_, index) => ({
id: index + 1, // 子组件唯一标识,必须保留
total: 0,
...annualDynamicTimeList.value.reduce(
(obj, time) => ({ ...obj, [time]: 0 }),
{},
),
}));
formData.xmndjh = tableData;
};
// ========== 【专属方法】可研/决策信息表格:单行合计计算(独立) ==========
const updateFinancialRowTotal = (row) => {
row.total = dynamicTimeList.value.reduce((sum, time) => {
return sum + (Number(row[time]) || 0);
}, 0);
};
// ========== 【专属方法】可研/决策信息表格:全量合计行更新(独立) ==========
const updateAllFinancialTotalRow = () => {
financialIndicators.value.forEach((totalRow) => {
if (!totalRow.isTotal || !totalRow.parentCode) return;
totalRow.total = 0;
dynamicTimeList.value.forEach((time) => (totalRow[time] = 0));
totalRow.parentCode.forEach((code) => {
const childRow = financialIndicators.value.find(
(item) => item.serialNumber === code,
);
if (childRow) {
totalRow.total += Number(childRow.total) || 0;
dynamicTimeList.value.forEach((time) => {
totalRow[time] += Number(childRow[time]) || 0;
});
}
});
});
};
// ========== 【专属方法】可研/决策信息表格:批量初始化合计(独立) ==========
const initFinancialRowTotal = () => {
// 仅计算可研表格的非合计行
financialIndicators.value.forEach(
(row) => !row.isTotal && updateFinancialRowTotal(row),
);
// 仅更新可研表格的合计行
updateAllFinancialTotalRow();
// 同步到可研的提交字段
formData.kyjcxx = [...financialIndicators.value];
};
// ========== 【专属方法】可研/决策信息表格:数据变更回调(独立,仅影响自身) ==========
const handleFinancialChange = (currentRow) => {
if (isPreview.value) return;
// 仅更新可研表格的当前行合计
updateFinancialRowTotal(currentRow);
// 仅更新可研表格的全量合计行
updateAllFinancialTotalRow();
// 仅同步可研表格的提交字段
formData.kyjcxx = [...financialIndicators.value];
};
// ========== 【专属方法】项目年度计划表格:子组件回调(独立,仅影响自身) ==========
const handleAnnualPlanTableChange = (newData) => {
if (isPreview.value) return;
formData.xmndjh = newData;
};
// ========== 可研表格动态时间生成:仅可研用,与年度计划无关 ==========
const generateDynamicTime = () => {
const now = new Date();
const currentYear = now.getFullYear();
const currentMonth = now.getMonth() + 1;
const timeList = [];
for (let i = 0; i <= 15; i++) {
if (timeHeaderType.value === "year") {
timeList.push(String(currentYear + i));
} else {
const calcYear = currentYear + Math.floor((currentMonth + i - 1) / 12);
const calcMonth = ((currentMonth + i - 1) % 12) + 1;
timeList.push(`${calcYear}-${calcMonth.toString().padStart(2, "0")}`);
}
}
dynamicTimeList.value = timeList;
// 仅初始化可研表格,年度计划表格单独初始化
initFinancialTable();
};
// ========== 回填逻辑:完全隔离,各自处理自身表格 ==========
// 1. 可研/决策信息表格:专属回填(独立)
const fillFinancialTable = (backfillData) => {
if (!Array.isArray(backfillData) || backfillData.length === 0) return;
financialIndicators.value.forEach((frontRow) => {
const backfillRow = backfillData.find(
(item) =>
item.serialNumber === frontRow.serialNumber &&
item.indicatorName === frontRow.indicatorName,
);
if (!backfillRow) return;
frontRow.total = Number(backfillRow.total) || 0;
dynamicTimeList.value.forEach((time) => {
frontRow[time] = Number(backfillRow[time]) || 0;
});
});
// 仅初始化可研表格的合计
initFinancialRowTotal();
};
// 2. 年度计划表格:专属回填【核心:用子组件的annualDynamicTimeList,不与可研混用】
const fillAnnualPlanTable = (backfillData) => {
if (!Array.isArray(backfillData) || backfillData.length === 0) return;
// 按唯一id匹配回填,保留所有原有字段,仅更新数字字段
formData.xmndjh.forEach((frontRow) => {
const backfillRow = backfillData.find((item) => item.id === frontRow.id);
if (!backfillRow) return;
// 仅赋值total,不碰其他字段
frontRow.total = Number(backfillRow.total) || 0;
// 仅遍历子组件的年度时间列表赋值,其他字段完全保留
annualDynamicTimeList.value.forEach((time) => {
frontRow[time] =
backfillRow[time] !== undefined ? Number(backfillRow[time]) || 0 : 0;
});
});
};
// ========== 业务方法:获取项目列表(通用) ==========
// ========== 业务方法:获取项目列表 ==========
const getProjectData = () => {
proxy.$post({
url: "/api/project/listProject",
......@@ -1168,7 +636,7 @@ const getProjectData = () => {
});
};
// ========== 选择项目同步名称(通用) ==========
// ========== 选择项目同步名称及相关信息 ==========
const changeProject = (val) => {
proxy.$post({
url: "/api/project/getProjectFinalInfo",
......@@ -1183,6 +651,14 @@ const changeProject = (val) => {
formData.xmjd = data.xmjd || "";
formData.yynxn = data.yynxn || "";
formData.xmjsqy = data.xmjsqy || "";
// 回填项目投资效益表格数据
formData.projectGdxxs[0].njfcgblqk_nt =
data.projectXmtzzes?.at(1)?.children?.at(0)?.rmbjj || "";
formData.projectGdxxs[0].njfcgbl =
data.projectXmtzzes?.at(2)?.rmbjj || "";
formData.projectGdxxs[0].jjcgbl = data.projectCwpjzbs?.at(0)?.num || "";
formData.projectGdxxs[0].jjcgbl2 = data.projectCwpjzbs?.at(1)?.num || "";
},
error: () => {
loading.value = false;
......@@ -1193,7 +669,7 @@ const changeProject = (val) => {
if (selectItem) formData.projectName = selectItem.projectName;
};
// ========== 获取详情(编辑/预览):核心整合【自动解析基准年+生成时间列表+回填】 ==========
// ========== 获取详情(编辑/预览) ==========
const getJsqtzjcDetail = () => {
if (!rcCgqyglId.value) return;
loading.value = true;
......@@ -1203,28 +679,7 @@ const getJsqtzjcDetail = () => {
callback: async (data) => {
loading.value = false;
if (!data) return ElMessage.error("未查询到数据");
// 1. 回填基础字段,保留xmndjh的完整结构
Object.assign(formData, data);
// 2. 可研表格:初始化时间+回填(与年度计划无关)
if (data.kyjcxx && Array.isArray(data.kyjcxx) && data.kyjcxx.length > 0) {
dynamicTimeList.value = Object.keys(data.kyjcxx[0]).filter((key) =>
/^\d{4}(-\d{2})?$/.test(key),
);
} else {
generateDynamicTime();
}
initFinancialTable();
if (data.kyjcxx) fillFinancialTable(data.kyjcxx);
// 3. 年度计划核心:自动解析基准年 → 生成匹配时间列表 → 等待DOM更新 → 回填
if (data.xmndjh && Array.isArray(data.xmndjh) && data.xmndjh.length > 0) {
const baseYear = getBaseYearFromTableData(data.xmndjh);
getCurrentYearTimeList(baseYear);
await nextTick(); // 强制等待时间列表生成完成,避免字段不匹配
fillAnnualPlanTable(data.xmndjh); // 此时时间列表已就绪,安全回填
}
},
error: () => {
loading.value = false;
......@@ -1233,7 +688,7 @@ const getJsqtzjcDetail = () => {
});
};
// ========== 保存表单:保留原有逻辑【直接传递完整xmndjh,不过滤】 ==========
// ========== 保存表单 ==========
const saveClick = () => {
if (!formData.projectId) return ElMessage.warning("请选择项目信息");
loading.value = true;
......@@ -1241,23 +696,10 @@ const saveClick = () => {
? "/api/project/updateTzjh"
: "/api/project/createTzjh";
// 组装提交数据:【核心】xmndjh直接传递,不做任何过滤,保留所有字段
// 组装提交数据
const submitData = {
...formData,
projectId: String(formData.projectId),
// 可研表格:按需过滤(保留原有逻辑)
kyjcxx: financialIndicators.value.map((row) => {
const filterRow = {
serialNumber: row.serialNumber,
indicatorName: row.indicatorName,
level: row.level,
total: row.total,
};
dynamicTimeList.value.forEach((time) => (filterRow[time] = row[time]));
return filterRow;
}),
// 年度计划表格:直接传完整的xmndjh,不做map过滤
xmndjh: formData.xmndjh,
};
proxy.$post({
......@@ -1275,75 +717,18 @@ const saveClick = () => {
});
};
// ========== 辅助方法(通用) ==========
// ========== 辅助方法 ==========
const backClick = () => router.back(-1);
const tableCellStyle = ({ row }) =>
row.isTotal ? { background: "#f5f7fa", fontWeight: "bold" } : {};
// ========== 页面初始化:新增/编辑分离,严格保障执行顺序 ==========
onMounted(() => {
getProjectData();
if (rcCgqyglId.value) {
// 编辑/预览:拉取接口数据,内部自动解析基准年+生成时间列表,不执行本地初始化
setTimeout(() => getJsqtzjcDetail(), 100);
} else {
// 新增模式:先生成时间列表(系统年+1)→ 再初始化两个表格,互不影响
getCurrentYearTimeList(); // 无参=系统年+1,贴合原有逻辑
generateDynamicTime(); // 可研表格时间初始化
initAnnualPlanTable(); // 年度计划表格本地初始化
// 编辑/预览:拉取接口数据
getJsqtzjcDetail();
}
});
</script>
<style scoped lang="less">
@import "@/styles/verticalManages.less";
.add-project-container {
width: 100%;
height: 100%;
padding: 20px;
box-sizing: border-box;
}
.add-project-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.tab-content {
background: #fff;
padding: 20px;
border-radius: 4px;
}
// 表格样式优化:两个表格统一样式,逻辑独立
:deep(.el-table-cell) {
padding-left: 8px !important;
box-sizing: border-box;
}
:deep(.el-input-number__input) {
text-align: right;
padding-right: 25px;
}
:deep(.el-collapse-item__header) {
font-weight: bold;
}
:deep(.el-table) {
--el-table-border-color: #ebeef5;
}
// 文本域宽度适配
:deep(.el-textarea__inner) {
width: 100% !important;
}
// 年度计划表格子组件容器
.annualPlans {
width: 100%;
overflow-x: auto;
}
// 修复数字输入框样式
:deep(.el-input-number) {
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