明树Git Lab
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
J
jt_front
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
jt_front
Commits
3d224552
Commit
3d224552
authored
Feb 11, 2026
by
zhanghan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1\
parent
b456d56b
Pipeline
#107240
passed with stage
in 19 seconds
Changes
5
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
1686 additions
and
986 deletions
+1686
-986
index.vue
src/components/FormDynamicTable/index.vue
+18
-18
routes.js
src/router/routes.js
+14
-2
decision.vue
src/views/investingManage/decision.vue
+188
-0
decisionAdd.vue
src/views/investingManage/decisionAdd.vue
+1115
-0
quitAdd.vue
src/views/investingManage/quitAdd.vue
+351
-966
No files found.
src/components/FormDynamicTable/index.vue
View file @
3d224552
...
...
@@ -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>
...
...
src/router/routes.js
View file @
3d224552
...
...
@@ -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"
),
},
],
},
...
...
src/views/investingManage/decision.vue
0 → 100644
View file @
3d224552
<
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
>
src/views/investingManage/decisionAdd.vue
0 → 100644
View file @
3d224552
<
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
>
src/views/investingManage/quitAdd.vue
View file @
3d224552
...
...
@@ -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.t
brlxdh
"
placeholder=
"请输入
填报人联系电话
"
v-model=
"formData.t
zBk
"
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
:
""
,
// 项目预计完成时间
t
br
:
""
,
// 填报人
tbrlxdh
:
""
,
// 填报人联系电话
t
cSqrq
:
""
,
// 退出申请日期
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
>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment