明树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
730179f8
Commit
730179f8
authored
Feb 09, 2026
by
zhanghan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bug处理
parent
1e428006
Pipeline
#107146
passed with stage
in 19 seconds
Changes
4
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
1875 additions
and
6 deletions
+1875
-6
routes.js
src/router/routes.js
+12
-0
annualAdd.vue
src/views/everydayPage/annualAdd.vue
+0
-6
quit.vue
src/views/investingManage/quit.vue
+188
-0
quitAdd.vue
src/views/investingManage/quitAdd.vue
+1675
-0
No files found.
src/router/routes.js
View file @
730179f8
...
...
@@ -161,6 +161,18 @@ const routes = [
title
:
"重大事项审批"
,
component
:
()
=>
import
(
"@/views/investingManage/bigIssuesAdd.vue"
),
},
{
path
:
"/quit"
,
name
:
"quit"
,
title
:
"重大事项审批"
,
component
:
()
=>
import
(
"@/views/investingManage/quit.vue"
),
},
{
path
:
"/quitAdd"
,
name
:
"quitAdd"
,
title
:
"重大事项审批"
,
component
:
()
=>
import
(
"@/views/investingManage/quitAdd.vue"
),
},
],
},
...
...
src/views/everydayPage/annualAdd.vue
View file @
730179f8
...
...
@@ -790,12 +790,6 @@
name=
"项目年度计划表格(单位:万元)"
>
<div
class=
"annualPlans"
>
{{ formData.xmndjh }}formData.xmndjh
{{ formData.xmndjh }}formData.xmndjh
{{
formData.annualDynamicTimeList
}}formData.annualDynamicTimeList
<annualPlan
v-model=
"formData.xmndjh"
:dynamic-time-list=
"annualDynamicTimeList"
...
...
src/views/investingManage/quit.vue
0 → 100644
View file @
730179f8
<
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
(
"/quitAdd"
);
};
const
editStatement
=
(
item
)
=>
{
router
.
push
({
name
:
"quitAdd"
,
query
:
{
id
:
item
.
id
,
},
});
};
const
previewStatement
=
(
item
)
=>
{
router
.
push
({
name
:
"quitAdd"
,
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/quitAdd.vue
0 → 100644
View file @
730179f8
<
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"
>
<!-- 基本信息:字段完全对齐数据库 -->
<el-collapse-item
title=
"基本信息"
name=
"基本信息"
>
<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-input
v-model=
"formData.projectForeignName"
placeholder=
"请输入项目外文名称"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"申报单位"
>
<el-input
v-model=
"formData.sbdw"
placeholder=
"请输入申报单位"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"所属二级企业"
>
<el-input
v-model=
"formData.ssejqy"
placeholder=
"请输入所属二级企业"
/>
</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-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"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"填报人"
>
<el-input
v-model=
"formData.tbr"
placeholder=
"请输入填报人"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"填报人联系电话"
>
<el-input
v-model=
"formData.tbrlxdh"
placeholder=
"请输入填报人联系电话"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<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"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"运营年限(年)"
>
<el-input
v-model=
"formData.yynxn"
:min=
"0"
placeholder=
"请输入运营年限(年)"
/>
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"建成后成效"
>
<el-input
v-model=
"formData.jchcx"
type=
"textarea"
:rows=
"3"
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-input
v-model=
"formData.projectForeignName"
placeholder=
"请输入项目外文名称"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"填报单位名称"
>
<el-input
v-model=
"formData.tbdwmc"
placeholder=
"请输入填报单位名称"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"所属二级企业"
>
<el-input
v-model=
"formData.ssejqy"
placeholder=
"请输入所属二级企业"
/>
</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-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"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"填报人"
>
<el-input
v-model=
"formData.tbr"
placeholder=
"请输入填报人"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"填报人联系电话"
>
<el-input
v-model=
"formData.tbrlxdh"
placeholder=
"请输入填报人联系电话"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<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"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"运营年限(年)"
>
<el-input
v-model=
"formData.yynxn"
:min=
"0"
placeholder=
"请输入运营年限(年)"
/>
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"建成后成效"
>
<el-input
v-model=
"formData.jchcx"
type=
"textarea"
:rows=
"3"
placeholder=
"请输入建成后成效"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 战略类A:按数据库字段补充所有表单项 -->
<el-collapse-item
title=
"战略类A"
name=
"战略类A"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"是否国家中长期规划重大项目(A1)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.sfgjzcqghzdxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"是否国家有关部门下达的重点项目(A2)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.sfgjygbmxddzdxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"大规模设备更新(A3)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.dgmsbgx"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"战略性新兴产业百大工程(A4)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.zlxxxcybdgc"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"列入央企产业焕新和未来产业启航行动的项目(A5)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.lryqcyhxhwlcyqhxddxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"强链补链重点项目(A6)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.qlblzdxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"对应重大或重点项目名录名称"
>
<el-input
v-model=
"formData.dyzdhzdxmmlmc"
placeholder=
"请输入对应重大或重点项目名录名称"
/>
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"战略性新兴产业分类(如有,必填)"
>
<el-input
v-model=
"formData.zlxxxcyfl"
placeholder=
"请输入战略性新兴产业分类"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 发展类B:按数据库字段补充所有表单项 -->
<el-collapse-item
title=
"发展类(B类)"
name=
"发展类(B类)"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"列入企业发展战略性新兴产业工作方案的项目(B1)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.lrqyfzzlxxxcygzfadxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"粮食、能源、矿产资源保障项目(B2)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.lsnykczybzxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"传统产业高端化、智能化、绿色化转型升级项目(B3)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.ctcygdh"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"支撑企业发展的重点项目(B4)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.zcqyfzdddxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"制造业技术改造项目"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.zzyjsgzxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 关注类C:按数据库字段补充所有表单项 -->
<el-collapse-item
title=
"关注类(C类)"
name=
"关注类(C类)"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"对外并购类投资项目(C1)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.dwbgltzxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"特别监管类项目(C2)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.tbjglxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"境外特别关注类项目(C3)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.jwtbgzlxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"对外参股类投资项目(C4)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.dwcglxtzxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"房地产投资项目(C5)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.fdctzxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"PPP投资项目(C6)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.ppptzxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"两高项目(C7)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.lgxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 管控类D:按数据库字段补充所有表单项 -->
<el-collapse-item
title=
"管控类(D类)"
name=
"管控类(D类)"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"非主业投资项目(D1)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.fzytzxm"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"持牌金融机构(D2)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.zpjrjg"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"类金融机构(D3)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.ljrjg"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"其他金融机构(D4)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.qtjrjg"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"基金及基金管理公司(D5)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.jjjjjglgs"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"创业投资基金(D6)"
>
<CommonSelector
:radio=
"true"
v-model=
"formData.cytzjj"
dictName=
"sf"
/>
</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=
"最终分类情况说明"
>
<el-input
v-model=
"formData.zzflqk"
type=
"textarea"
:rows=
"5"
placeholder=
"请输入最终分类情况详细说明"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 可研/决策信息(单位:万元):独立表格,专属方法/数据源 -->
<el-collapse-item
title=
"可研/决策信息(单位:万元)"
name=
"可研/决策信息(单位:万元)"
>
<el-table
:data=
"financialIndicators"
style=
"width: 100%"
border
:cell-style=
"tableCellStyle"
row-key=
"serialNumber"
>
<!-- 序号列 -->
<el-table-column
prop=
"serialNumber"
label=
"序号"
width=
"80"
align=
"center"
/>
<!-- 指标项列(层级缩进) -->
<el-table-column
prop=
"indicatorName"
label=
"指标项"
min-width=
"280"
>
<
template
#
default=
"{ row }"
>
<span
:style=
"
{ textIndent: `${row.level * 20}px` }">
{{
row
.
indicatorName
}}
</span>
</
template
>
</el-table-column>
<!-- 合计列(自动统计) -->
<el-table-column
label=
"合计"
width=
"120"
align=
"center"
>
<
template
#
default=
"{ row }"
>
<span
>
{{
row
.
total
?
row
.
total
.
toFixed
(
2
)
:
"0.00"
}}
万元
</span
>
</
template
>
</el-table-column>
<!-- 动态时间表头:当前时间+后续15期(年/年月) -->
<el-table-column
v-for=
"time in dynamicTimeList"
:key=
"time"
:label=
"time"
width=
"140"
align=
"center"
>
<
template
#
default=
"{ row }"
>
<el-input
v-model=
"row[time]"
:min=
"0"
:precision=
"2"
controls-position=
"right"
@
change=
"handleFinancialChange(row)"
:disabled=
"isPreview"
style=
"width: 100%"
/>
</
template
>
</el-table-column>
</el-table>
</el-collapse-item>
<!-- 年度投资计划:基础信息 -->
<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-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-input
v-model=
"formData.ndTzMb"
placeholder=
"请输入年度投资目标"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"项目预计工期"
>
<el-input
v-model=
"formData.xmYjGq"
placeholder=
"请输入项目预计工期(如12个月)"
/>
</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-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-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"项目计划总投资类型"
>
<el-input
v-model=
"formData.xmTzZeXmJhZtzLx"
placeholder=
"请输入项目计划总投资类型"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"计划类型"
>
<el-input
v-model=
"formData.jhLx"
placeholder=
"请输入计划类型"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"当前进展阶段"
>
<el-input
v-model=
"formData.dqJzJd"
placeholder=
"请输入当前进展阶段"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"项目融资是否已经落地"
>
<CommonSelector
v-model=
"formData.xmRzSfYjLd"
dictName=
"sf"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"当前进展情况"
>
<el-input
v-model=
"formData.dqJzQk"
placeholder=
"请输入当前进展情况"
/>
</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-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>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"2025年投资金额(全口径)目标(决算)与计划差异说明"
>
<el-input
v-model=
"formData.nTzJqMbjyYjhCySm"
type=
"textarea"
:rows=
"3"
placeholder=
"请输入差异说明"
/>
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"2025年计划投资目标(决算)与计划差异说明"
>
<el-input
v-model=
"formData.nJhTzMbjyYjhCySm"
type=
"textarea"
:rows=
"3"
placeholder=
"请输入差异说明"
/>
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"项目主要风险及主要风险应对举措"
>
<el-input
v-model=
"formData.xmZyFxJzyFxYdcj"
type=
"textarea"
:rows=
"4"
placeholder=
"请输入主要风险及对应的应对举措"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!-- 项目年度计划表格(单位:万元):独立子组件表格,专属方法/数据源 -->
<el-collapse-item
title=
"项目年度计划表格(单位:万元)"
name=
"项目年度计划表格(单位:万元)"
>
<div
class=
"annualPlans"
>
{{ formData.xmndjh }}
{{ formData.xmndjh }}
{{ formData.annualDynamicTimeList }}
</div>
</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-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-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-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"回款再投入(万元)"
>
<el-input
v-model=
"formData.hkZtr"
:min=
"0"
: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-input
v-model=
"formData.zbjPtF"
:min=
"0"
: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-input
v-model=
"formData.qt"
:min=
"0"
: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-input
v-model=
"formData.zbjWbGd"
:min=
"0"
: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-input
v-model=
"formData.wfJzBdwCz"
:min=
"0"
:precision=
"2"
controls-position=
"right"
placeholder=
"0.00"
style=
"width: 100%"
/>
</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>
</el-col>
</el-row>
</el-collapse-item>
</el-collapse>
</el-form>
</div>
</div>
</div>
</div>
</div>
</template>
<
script
setup
>
import
{
reactive
,
ref
,
onMounted
,
getCurrentInstance
,
nextTick
}
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
;
};
// ========== 动态表格列配置(参股单位出资修正) ==========
const
transferColumns
=
ref
([
{
prop
:
"mc"
,
label
:
"单位名称"
,
type
:
"input"
,
placeholder
:
"请填写单位名称"
,
},
{
prop
:
"fj"
,
label
:
"我方出资额(万元)"
,
type
:
"input"
,
placeholder
:
"请输入我方出资额(万元)"
,
min
:
0
,
precision
:
2
,
},
{
prop
:
"bz"
,
label
:
"差异说明"
,
type
:
"textarea"
,
rows
:
2
,
placeholder
:
"请输入差异说明"
,
},
]);
// ========== 路由/实例/全局方法 ==========
const
router
=
useRouter
();
const
route
=
useRoute
();
const
{
proxy
}
=
getCurrentInstance
();
// ========== 基础配置:两个表格共用(仅时间列表,无其他关联) ==========
const
activeCollapse
=
ref
([
"基本信息"
,
"年度投资计划"
,
"项目年度计划(资金支付口径)"
,
"2026年参股单位出资情况修正(单位:万元)"
,
"可研/决策信息(单位:万元)"
,
"项目年度计划表格(单位:万元)"
,
"战略类A"
,
"发展类(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
({
// 基础字段
projectId
:
""
,
projectName
:
""
,
projectForeignName
:
""
,
sbdw
:
""
,
// 申报单位
ssejqy
:
""
,
// 所属二级企业
xmgsmc
:
""
,
// 项目公司名称
xmkgsjyj
:
""
,
// 项目预计起始时间
xmjgsjyj
:
""
,
// 项目预计完成时间
tbr
:
""
,
// 填报人
tbrlxdh
:
""
,
// 填报人联系电话
xmjsqy
:
0
,
// 项目建设期(月)
projectLzType
:
""
,
// 项目流转状态(审批状态)
xmjd
:
""
,
// 项目阶段
yynxn
:
0
,
// 运营年限(年)
jchcx
:
""
,
// 建成后成效
// 战略类A
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
:
[],
});
// ========== 【专属方法】可研/决策信息表格:初始化(独立) ==========
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"
,
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
.
sbdw
=
data
.
sbdw
||
""
;
formData
.
xmgsmc
=
data
.
xmgsmc
||
""
;
formData
.
xmkgsjyj
=
data
.
xmkgsjyj
||
""
;
formData
.
xmjgsjyj
=
data
.
xmjgsjyj
||
""
;
formData
.
xmjd
=
data
.
xmjd
||
""
;
formData
.
yynxn
=
data
.
yynxn
||
""
;
formData
.
xmjsqy
=
data
.
xmjsqy
||
""
;
},
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
(
"未查询到数据"
);
// 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
;
ElMessage
.
error
(
"获取投资计划详情失败"
);
},
});
};
// ========== 保存表单:保留原有逻辑【直接传递完整xmndjh,不过滤】 ==========
const
saveClick
=
()
=>
{
if
(
!
formData
.
projectId
)
return
ElMessage
.
warning
(
"请选择项目信息"
);
loading
.
value
=
true
;
const
url
=
rcCgqyglId
.
value
?
"/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
({
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
);
const
tableCellStyle
=
({
row
})
=>
row
.
isTotal
?
{
background
:
"#f5f7fa"
,
fontWeight
:
"bold"
}
:
{};
// ========== 页面初始化:新增/编辑分离,严格保障执行顺序 ==========
onMounted
(()
=>
{
getProjectData
();
if
(
rcCgqyglId
.
value
)
{
// 编辑/预览:拉取接口数据,内部自动解析基准年+生成时间列表,不执行本地初始化
setTimeout
(()
=>
getJsqtzjcDetail
(),
100
);
}
else
{
// 新增模式:先生成时间列表(系统年+1)→ 再初始化两个表格,互不影响
getCurrentYearTimeList
();
// 无参=系统年+1,贴合原有逻辑
generateDynamicTime
();
// 可研表格时间初始化
initAnnualPlanTable
();
// 年度计划表格本地初始化
}
});
</
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