明树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
ada7604b
Commit
ada7604b
authored
Jan 21, 2026
by
zhanghan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
建设期投资检查开发完毕
parent
1b3f498c
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
622 additions
and
534 deletions
+622
-534
index.vue
src/components/FileUploader/index.vue
+462
-0
verticalManages.css
src/styles/verticalManages.css
+3
-0
verticalManages.less
src/styles/verticalManages.less
+3
-0
construction.vue
src/views/investingManage/construction.vue
+4
-34
constructionAdd.vue
src/views/investingManage/constructionAdd.vue
+150
-500
No files found.
src/components/FileUploader/index.vue
0 → 100644
View file @
ada7604b
<
template
>
<div
class=
"file-uploader-container"
:class=
"isInline ? 'inline' : ''"
>
<!-- 上传按钮区域 -->
<el-upload
:action=
"uploadUrl"
:headers=
"headers"
:show-file-list=
"false"
multiple
:disabled=
"disabled"
:on-success=
"handleUploadSuccess"
:before-upload=
"beforeUpload"
>
<el-button
type=
"default"
:disabled=
"disabled"
>
上传
</el-button>
</el-upload>
<el-button
v-if=
"!isInline"
type=
"default"
@
click=
"handleMultiDelete"
:disabled=
"!selectedIds.length || disabled"
class=
"multi-delete-btn"
>
删除选中文件
</el-button>
<!-- 文件列表表格 -->
<el-form-item
:label=
"label"
v-if=
"!isInline"
>
<el-table
:data=
"fileList"
style=
"width: 100%"
empty-text=
"暂无数据"
border
@
selection-change=
"handleSelectionChange"
class=
"file-table"
>
<el-table-column
type=
"selection"
width=
"55"
:disabled=
"disabled"
/>
<el-table-column
prop=
"originalname"
label=
"文件名"
/>
<el-table-column
prop=
"updatedAt"
label=
"上传时间"
>
<template
#
default=
"
{ row }">
<span>
{{
formatDate
(
row
.
updatedAt
)
}}
</span>
</
template
>
</el-table-column>
<el-table-column
prop=
"size"
label=
"大小"
/>
<el-table-column
fixed=
"right"
label=
"操作"
width=
"100"
>
<
template
#
default=
"{ row, $index }"
>
<span
class=
"download-btn"
@
click=
"handleDownload(row)"
>
下载
</span>
<el-button
link
type=
"danger"
size=
"small"
@
click=
"handleDelete($index)"
:disabled=
"disabled"
class=
"delete-btn"
>
删除
</el-button>
</
template
>
</el-table-column>
</el-table>
</el-form-item>
<div
v-else
class=
"inline-file-wrapper"
>
<el-popover
v-model:visible=
"popoverVisible"
placement=
"bottom-start"
width=
"420"
trigger=
"hover"
:disabled=
"fileList.length === 0 || disabled"
popper-class=
"file-popover"
>
<!-- 弹窗内容 -->
<
template
#
default
>
<div
class=
"file-popover-content"
>
<!-- 无文件提示 -->
<div
v-if=
"fileList.length === 0"
class=
"empty-file-tip"
>
暂无上传文件
</div>
<!-- 文件列表 -->
<div
v-else
class=
"file-list"
>
<div
v-for=
"(file, index) in fileList"
:key=
"file.id || index"
class=
"file-item"
>
<!-- 文件名 -->
<div
class=
"file-name"
>
<el-icon
class=
"file-icon"
><Document
/></el-icon>
<span
class=
"name-text"
:title=
"file.originalname"
>
{{
file
.
originalname
}}
</span>
</div>
<!-- 操作按钮 -->
<div
class=
"file-actions"
>
<el-button
link
type=
"primary"
size=
"small"
@
click
.
stop=
"handleDownload(file)"
class=
"download-action"
>
<el-icon><Download
/></el-icon>
下载
</el-button>
<el-button
link
type=
"danger"
size=
"small"
@
click
.
stop=
"handleDelete(index)"
:disabled=
"disabled"
class=
"delete-action"
>
<el-icon><Delete
/></el-icon>
删除
</el-button>
</div>
</div>
</div>
</div>
</
template
>
<!-- 触发元素(美观的文件数量展示) -->
<
template
#
reference
>
<div
class=
"inline-file"
>
<div
class=
"file-count"
>
<span
class=
"count-num"
>
{{
fileList
.
length
}}
</span>
<span
class=
"count-text"
>
个文件
</span>
</div>
<el-icon
class=
"upload-icon"
><ArrowDown
/></el-icon>
</div>
</
template
>
</el-popover>
</div>
</div>
</template>
<
script
setup
>
import
{
ref
,
watch
,
computed
,
getCurrentInstance
}
from
"vue"
;
import
{
ElMessageBox
,
ElMessage
}
from
"element-plus"
;
import
moment
from
"moment"
;
import
{
useUserStore
}
from
"@/stores/user.js"
;
import
windowConfig
from
"@/window"
;
// 引入需要的图标
import
{
Document
,
Download
,
Delete
}
from
"@element-plus/icons-vue"
;
// 定义组件 props(设置默认值,无需外部传参)
const
props
=
defineProps
({
modelValue
:
{
type
:
Array
,
default
:
()
=>
[],
required
:
true
,
},
label
:
{
type
:
String
,
default
:
"文件上传"
,
},
isInline
:
{
type
:
Boolean
,
default
:
false
,
},
uploadUrl
:
{
type
:
String
,
default
:
()
=>
{
return
windowConfig
.
baseUrl
+
"/api/file/upload"
;
},
},
headers
:
{
type
:
Object
,
default
:
()
=>
({
Authorization
:
sessionStorage
.
getItem
(
"authToken"
)
||
""
,
}),
},
// 是否禁用(预览模式)- 默认值:false
disabled
:
{
type
:
Boolean
,
default
:
false
,
},
// 下载接口前缀 - 默认值:系统配置的baseUrl
downloadBaseUrl
:
{
type
:
String
,
default
:
()
=>
{
return
windowConfig
.
baseUrl
||
""
;
},
},
});
const
emit
=
defineEmits
([
"update:modelValue"
]);
const
selectedIds
=
ref
([]);
const
popoverVisible
=
ref
(
false
);
// 计算属性:获取文件列表(双向绑定)
const
fileList
=
computed
({
get
()
{
return
props
.
modelValue
;
},
set
(
value
)
{
emit
(
"update:modelValue"
,
value
);
},
});
// 格式化日期
const
formatDate
=
(
date
)
=>
{
return
date
?
moment
(
date
).
format
(
"YYYY-MM-DD HH:mm:SS"
)
:
""
;
};
// 文件上传成功处理
const
handleUploadSuccess
=
(
res
)
=>
{
if
(
res
&&
res
.
data
)
{
fileList
.
value
=
[...
fileList
.
value
,
res
.
data
];
ElMessage
.
success
(
"文件上传成功"
);
popoverVisible
.
value
=
false
;
}
};
const
beforeUpload
=
(
file
)
=>
{
// 可添加文件类型、大小等校验逻辑
return
true
;
};
// 选择文件变化
const
handleSelectionChange
=
(
datas
)
=>
{
selectedIds
.
value
=
datas
.
map
((
item
)
=>
item
.
id
);
};
// 下载文件
const
handleDownload
=
(
row
)
=>
{
if
(
!
row
.
id
)
{
ElMessage
.
warning
(
"文件ID不存在,无法下载"
);
return
;
}
if
(
!
props
.
downloadBaseUrl
)
{
ElMessage
.
warning
(
"下载地址配置异常,请联系管理员"
);
return
;
}
const
a
=
document
.
createElement
(
"a"
);
a
.
href
=
`
${
props
.
downloadBaseUrl
}
/api/file/download/
${
row
.
id
}
`
;
a
.
download
=
row
.
originalname
;
document
.
body
.
appendChild
(
a
);
a
.
click
();
a
.
remove
();
};
// 删除单个文件
const
handleDelete
=
(
index
)
=>
{
ElMessageBox
.
confirm
(
"确认删除该项?"
,
"提示"
,
{
confirmButtonText
:
"确认"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
,
})
.
then
(()
=>
{
const
newList
=
[...
fileList
.
value
];
newList
.
splice
(
index
,
1
);
fileList
.
value
=
newList
;
// 删除后关闭popover
popoverVisible
.
value
=
false
;
})
.
catch
(()
=>
{});
};
// 批量删除文件
const
handleMultiDelete
=
()
=>
{
ElMessageBox
.
confirm
(
"确认删除选中数据?"
,
"提示"
,
{
confirmButtonText
:
"确认"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
,
})
.
then
(()
=>
{
const
newList
=
fileList
.
value
.
filter
(
(
item
)
=>
!
selectedIds
.
value
.
includes
(
item
.
id
)
);
fileList
.
value
=
newList
;
selectedIds
.
value
=
[];
})
.
catch
(()
=>
{});
};
// 监听外部文件列表变化
watch
(
()
=>
props
.
modelValue
,
(
newVal
)
=>
{
fileList
.
value
=
newVal
;
},
{
deep
:
true
}
);
// 监听禁用状态变化,关闭popover
watch
(
()
=>
props
.
disabled
,
(
newVal
)
=>
{
if
(
newVal
)
{
popoverVisible
.
value
=
false
;
}
}
);
</
script
>
<
style
scoped
>
.file-uploader-container
{
width
:
100%
;
}
.multi-delete-btn
{
margin-left
:
10px
;
}
.inline
{
display
:
flex
;
align-items
:
center
;
gap
:
10px
;
}
.inline-file-wrapper
{
flex
:
1
;
margin-left
:
10px
;
}
.inline-file
{
display
:
flex
;
align-items
:
center
;
padding
:
3px
12px
;
background
:
#f5f7fa
;
border
:
1px
solid
#e4e7ed
;
border-radius
:
6px
;
cursor
:
pointer
;
transition
:
all
0.2s
ease
;
display
:
flex
;
justify-content
:
space-between
;
}
.inline-file
:hover
{
background
:
#e8f4ff
;
border-color
:
#c6e2ff
;
}
.upload-icon
{
color
:
#409eff
;
font-size
:
16px
;
margin-right
:
8px
;
}
.file-count
{
display
:
flex
;
align-items
:
baseline
;
}
.count-num
{
font-size
:
18px
;
font-weight
:
600
;
color
:
#409eff
;
margin-right
:
4px
;
}
.count-text
{
font-size
:
14px
;
color
:
#606266
;
}
:deep
(
.file-popover
)
{
padding
:
0
;
border-radius
:
8px
;
box-shadow
:
0
4px
12px
rgba
(
0
,
0
,
0
,
0.1
);
}
.file-popover-content
{
padding
:
12px
;
}
.empty-file-tip
{
text-align
:
center
;
padding
:
20px
0
;
color
:
#909399
;
font-size
:
14px
;
}
.file-list
{
max-height
:
300px
;
overflow-y
:
auto
;
}
.file-item
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
padding
:
8px
0
;
border-bottom
:
1px
dashed
#f0f0f0
;
}
.file-item
:last-child
{
border-bottom
:
none
;
}
.file-name
{
display
:
flex
;
align-items
:
center
;
flex
:
1
;
overflow
:
hidden
;
}
.file-icon
{
color
:
#409eff
;
font-size
:
14px
;
margin-right
:
8px
;
}
.name-text
{
font-size
:
14px
;
color
:
#303133
;
white-space
:
nowrap
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
}
.file-actions
{
display
:
flex
;
gap
:
8px
;
}
.download-action
,
.delete-action
{
padding
:
0
;
font-size
:
12px
;
}
:deep
(
.download-action
.el-icon
),
:deep
(
.delete-action
.el-icon
)
{
margin-right
:
4px
;
font-size
:
12px
;
}
.file-table
{
--el-table-header-text-color
:
#303133
;
--el-table-row-hover-bg-color
:
#f5f7fa
;
}
.download-btn
{
cursor
:
pointer
;
color
:
#409eff
;
margin-right
:
10px
;
user-select
:
none
;
}
.download-btn
:hover
{
color
:
#66b1ff
;
}
.delete-btn
{
padding
:
0
;
}
:deep
(
.el-table__header
)
{
font-weight
:
600
;
}
:deep
(
.el-button--link
)
{
padding
:
0
;
}
:deep
(
.file-list
::-webkit-scrollbar
)
{
width
:
6px
;
}
:deep
(
.file-list
::-webkit-scrollbar-track
)
{
background
:
#f1f1f1
;
border-radius
:
3px
;
}
:deep
(
.file-list
::-webkit-scrollbar-thumb
)
{
background
:
#c1c1c1
;
border-radius
:
3px
;
}
:deep
(
.file-list
::-webkit-scrollbar-thumb:hover
)
{
background
:
#a8a8a8
;
}
</
style
>
src/styles/verticalManages.css
View file @
ada7604b
...
...
@@ -201,6 +201,9 @@
padding
:
0
20px
;
height
:
100%
;
}
::v-deep
.el-input
{
width
:
100%
!important
;
}
.add-dialog
.el-tree
{
width
:
100%
;
}
...
...
src/styles/verticalManages.less
View file @
ada7604b
...
...
@@ -208,6 +208,9 @@
}
}
}
::v-deep .el-input{
width: 100% !important;
}
.add-dialog{
.el-tree{
width: 100%;
...
...
src/views/investingManage/construction.vue
View file @
ada7604b
...
...
@@ -64,40 +64,10 @@ const { proxy } = getCurrentInstance();
let
tableData
=
ref
([]);
let
tableColumns
=
ref
([
{
prop
:
"
qc
"
,
label
:
"项目
全称
"
,
prop
:
"
projectName
"
,
label
:
"项目
信息
"
,
showOverflowTooltip
:
true
,
},
{
prop
:
"jc"
,
label
:
"项目简称"
,
showOverflowTooltip
:
true
,
},
{
prop
:
"nbtzglzt"
,
label
:
"内部投资管理主体"
,
showOverflowTooltip
:
true
,
width
:
170
,
},
{
prop
:
"xmscjd"
,
label
:
"项目所处阶段"
,
showOverflowTooltip
:
true
,
width
:
120
,
},
{
prop
:
"gqjg"
,
label
:
"股权结构"
,
showOverflowTooltip
:
true
,
width
:
120
,
},
{
prop
:
"xmzbjze"
,
label
:
"项目资本金总额(亿元)"
,
showOverflowTooltip
:
true
,
width
:
180
,
},
{
prop
:
"operations"
,
...
...
@@ -116,7 +86,7 @@ let pageSize = ref(10);
const
getStatementData
=
()
=>
{
loading
.
value
=
true
;
proxy
.
$post
({
url
:
"/api/project/get
Cgqygl
List"
,
url
:
"/api/project/get
Jsqtzjc
List"
,
data
:
{
page
:
currentPage
.
value
,
pagesize
:
pageSize
.
value
,
...
...
@@ -168,7 +138,7 @@ const deleteStatement = (item) => {
})
.
then
(()
=>
{
proxy
.
$post
({
url
:
"/api/project/delete
Cgqygl
"
,
url
:
"/api/project/delete
Jsqtzjc
"
,
data
:
{
id
:
item
.
id
,
},
...
...
src/views/investingManage/constructionAdd.vue
View file @
ada7604b
...
...
@@ -15,6 +15,7 @@
<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"
>
...
...
@@ -34,435 +35,187 @@
</el-select>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"项目所处阶段"
>
<el-select
v-model=
"formData.xmscjd"
placeholder=
"请选择项目所处阶段"
>
<el-option
v-for=
"item in options?.xmjd"
:key=
"item.key"
:label=
"item.name"
:value=
"item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row
:gutter=
"20"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"全称"
>
<!-- <el-col :span="12">
<el-form-item label="决策总投资 一次填报锁定">
<el-input
v-model=
"formData.
qc
"
placeholder=
"请输入
全称
"
v-model="formData.
jcztz
"
placeholder="请输入
决策总投资 一次填报锁定
"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"简称"
>
<el-input
v-model=
"formData.jc"
placeholder=
"请输入简称"
/>
</el-form-item>
</el-col>
</el-col> -->
</el-row>
<el-row
:gutter=
"20"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"内部投资管理主体"
>
<el-input
v-model=
"formData.nbtzglzt"
placeholder=
"请输入内部投资管理主体"
/>
</el-form-item>
</el-col>
<!-- <el-row :gutter="20">
<el-col :span="12">
<el-form-item
label=
"
股权结构
"
>
<el-form-item label="
资本金内部收益率(%) 一次填报锁定
">
<el-input
v-model=
"formData.
gqjg
"
placeholder=
"请输入
股权结构
"
v-model="formData.
zbjnbsyl
"
placeholder="请输入
资本金内部收益率(%) 一次填报锁定
"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item
title=
"出资情况"
name=
"出资情况"
>
<el-row
:gutter=
"20"
>
<el-col :span="12">
<el-form-item
label-width=
"210"
label=
"项目资本金总额(亿元)"
>
<el-input
v-model
.
number=
"formData.xmzbjze"
placeholder=
"请输入项目资本金总额(亿元)"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label-width=
"210"
label=
"公司资本金应出资总额(亿元)"
>
<el-input
v-model
.
number=
"formData.gszbjyczze"
placeholder=
"请输入公司资本金应出资总额(亿元)"
/>
</el-form-item>
</el-col>
</el-row>
<el-row
:gutter=
"20"
>
<el-col
:span=
"12"
>
<el-form-item
label-width=
"210"
label=
"公司当前应出资额(亿元)"
>
<el-input
v-model
.
number=
"formData.gsdqycze"
placeholder=
"请输入公司当前应出资额(亿元)"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label-width=
"210"
label=
"公司当前已出资额(亿元)"
>
<el-input
v-model
.
number=
"formData.gsdqyjcze"
placeholder=
"请输入公司当前已出资额(亿元)"
/>
</el-form-item>
</el-col>
</el-row>
<el-row
:gutter=
"20"
>
<el-col
:span=
"12"
>
<el-form-item
label-width=
"210"
label=
"公司当前应出未出金额(亿元)"
>
<el-input
v-model
.
number=
"formData.gsdqycwcje"
placeholder=
"请输入公司当前应出未出金额(亿元)"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label-width=
"210"
label=
"公司当前剩余出资额(亿元)"
>
<el-form-item label="预测总投资">
<el-input
v-model
.
number=
"formData.gsdqsycze
"
placeholder=
"请输入
公司当前剩余出资额(亿元)
"
v-model
="formData.ycztz
"
placeholder="请输入
预测总投资
"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item
label
-width=
"210"
label=
"超股比出资情况
"
>
<el-form-item label
="确认总投资
">
<el-input
v-model=
"formData.
cgbczqk
"
placeholder=
"请输入
超股比出资情况
"
v-model="formData.
qrztz
"
placeholder="请输入
确认总投资
"
/>
</el-form-item>
</el-col>
</el-row>
</el-row>
-->
</el-collapse-item>
<!-- 投资(成本)分析会资料 -->
<el-collapse-item
title=
"合同约定权益获取"
name=
"合同约定权益获取"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"24"
>
<el-form-item
label=
"我方权益合同条款约定"
>
<el-input
type=
"textarea"
v-model=
"formData.wfqyhttkyd"
placeholder=
"请输入我方权益合同条款约定(市场、设计、施工、运营权、养护份额等权益)"
:rows=
"3"
/>
</el-form-item>
</el-col>
</el-row>
<el-row
:gutter=
"20"
>
<el-col
:span=
"24"
>
<el-form-item
label=
"权益获取进展"
>
<el-input
type=
"textarea"
v-model=
"formData.qyhqjz"
placeholder=
"请输入权益获取进展"
:rows=
"3"
/>
</el-form-item>
</el-col>
<el-col
:span=
"24"
>
<el-form-item
label=
"权益获取与约定不一致的情况"
>
<el-input
type=
"textarea"
v-model=
"formData.qyhqyyd"
placeholder=
"请输入权益获取与约定不一致的情况"
:rows=
"3"
/>
</el-form-item>
</el-col>
</el-row>
<el-row
:gutter=
"20"
>
<el-col
:span=
"24"
>
<el-form-item
label=
"督办情况"
>
<el-input
type=
"textarea"
v-model=
"formData.dbqk"
placeholder=
"请输入督办情况"
:rows=
"3"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item
title=
"分红情况"
name=
"分红情况"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"利润分配/分红约定"
>
<el-input
v-model=
"formData.lrfp"
placeholder=
"请输入利润分配/分红约定"
:rows=
"2"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"是否达到利润分配条件"
>
<el-radio-group
placeholder=
"请选择是否达到利润分配条件"
v-model=
"formData.sfddlrfptj"
title=
"投资(成本)分析会资料"
name=
"投资(成本)分析会资料"
>
<el-radio
v-for=
"item in options?.sf"
:key=
"item.id"
:id=
"item.name"
:value=
"item.key"
>
{{ item.name }}
</el-radio
>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row
:gutter=
"20"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"累计获取分红(万元)"
>
<el-input
v-model
.
number=
"formData.ljhqfh"
placeholder=
"请输入累计获取分红(万元)"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item
title=
"资金流出"
name=
"资金流出"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"应投入资金(万元)"
>
<el-input
v-model
.
number=
"formData.ytrzj"
placeholder=
"请输入应投入资金(万元)"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"累计投入资金(万元)"
>
<el-input
v-model
.
number=
"formData.ljtrzj"
placeholder=
"请输入累计投入资金(万元)"
/>
</el-form-item>
</el-col>
</el-row>
<el-row
:gutter=
"20"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"尚需投入资金(万元)"
>
<el-input
v-model
.
number=
"formData.sxtrzj"
placeholder=
"请输入尚需投入资金(万元)"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item
title=
"资金流入"
name=
"资金流入"
>
<div
class=
"tab-handle"
>
<el-button
type=
"primary"
@
click=
"add
Pfyjlsqk
"
<el-button
type=
"primary"
@
click=
"add
jsqtzjcTzfxs
"
>
新增
</el-button
>
</div>
<el-table
:data=
"
wtyys
"
:data=
"
jsqtzjcTzfxsList
"
style=
"width: 100%"
empty-text=
"暂无数据"
show-summary
:summary-method=
"sumWtyysColumns"
border
>
<el-table-column
type=
"index"
width=
"60"
label=
"序号"
/>
<el-table-column
prop=
"lx"
label=
"类型"
>
<
template
#
default=
"scope"
>
<el-select
v-model=
"scope.row.lx"
placeholder=
"请选择"
no-data-text=
"暂无数据"
>
<el-option
v-for=
"item in options?.participation_capital"
:key=
"item.key"
:label=
"item.name"
:value=
"item.key"
></el-option>
</el-select>
</
template
>
</el-table-column>
<el-table-column
prop=
"fwsj"
label=
"服务时间"
>
<el-table-column
prop=
"jd"
label=
"时间 "
>
<
template
#
default=
"scope"
>
<el-date-picker
v-model=
"scope.row.
fwsj
"
<
!--
<
el-date-picker
v-model=
"scope.row.
jd
"
type=
"datetime"
format=
"YYYY-MM-DD HH:mm:ss"
value-format=
"YYYY-MM-DD HH:mm:ss"
placeholder=
"请选择"
/>
-->
<el-input
v-model=
"scope.row.jd"
placeholder=
"请按照 xx年xx季度 格式填写"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"
htje"
label=
"合同金额(万元)
"
>
<el-table-column
prop=
"
ycztz"
label=
"当期预测总投资
"
>
<
template
#
default=
"scope"
>
<el-input
v-model
.
number=
"scope.row.htje"
placeholder=
"请输入合同金额(万元)"
type=
"number"
v-model
.
number=
"scope.row.ycztz"
placeholder=
"请输入当期预测总投资"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"ywlr"
label=
"业务利润(万元)"
>
<el-table-column
prop=
"zbjnbsyl"
label=
"资本金内部收益率(%)"
>
<
template
#
default=
"scope"
>
<el-input
v-model
.
number=
"scope.row.
ywlr
"
placeholder=
"请输入
业务利润(万元
)"
v-model
.
number=
"scope.row.
zbjnbsyl
"
placeholder=
"请输入
资本金内部收益率(%
)"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"tzcbfxhzl"
label=
"投资(成本)分析会资料"
>
<
template
#
default=
"scope"
>
<FileUploader
v-model=
"scope.row.tzcbfxhzl"
:isInline=
"true"
></FileUploader>
</
template
>
</el-table-column>
<el-table-column
label=
"操作"
width=
"60"
>
<
template
#
default=
"scope"
>
<el-button
link
type=
"danger"
size=
"small"
@
click=
"delete
Pfyjlsqk
(scope.$index)"
@
click=
"delete
jsqtzjcTzfxs
(scope.$index)"
>
删除
</el-button
>
</
template
>
</el-table-column>
</el-table>
</el-collapse-item>
<!-- 专项检查 -->
<el-collapse-item
title=
"专项检查"
name=
"专项检查"
>
<div
class=
"tab-handle"
>
<el-button
type=
"primary"
@
click=
"addTzfhs"
>
新增
</el-button>
<el-button
type=
"primary"
@
click=
"addJsqtzjcZxjcs"
>
新增
</el-button
>
</div>
<el-table
:data=
"
tzfhs
"
:data=
"
jsqtzjcZxjcsList
"
style=
"width: 100%"
empty-text=
"暂无数据"
show-summary
:summary-method=
"sumTzfhsColumns"
border
>
<el-table-column
type=
"index"
width=
"60"
label=
"序号"
/>
<el-table-column
prop=
"
fhsj"
label=
"分红时间
"
>
<el-table-column
prop=
"
zxjcfl"
label=
"专项检查类型
"
>
<
template
#
default=
"scope"
>
<el-date-picker
v-model=
"scope.row.fhsj"
type=
"datetime"
format=
"YYYY-MM-DD HH:mm:ss"
value-format=
"YYYY-MM-DD HH:mm:ss"
placeholder=
"请选择"
<el-select
v-model=
"scope.row.zxjcfl"
placeholder=
"请选择专项检查类型"
>
<el-option
v-for=
"item in options?.construction_classify"
:key=
"item.key"
:label=
"item.name"
:value=
"item.key"
></el-option>
</el-select>
</
template
>
</el-table-column>
<el-table-column
prop=
"jcjg"
label=
"检查结果"
>
<
template
#
default=
"scope"
>
<el-input
v-model
.
number=
"scope.row.jcjg"
placeholder=
"请输入检查结果"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"
fhje"
label=
"分红金额(万元)
"
>
<el-table-column
prop=
"
zgcsqd"
label=
"整改措施清单
"
>
<
template
#
default=
"scope"
>
<el-input
v-model
.
number=
"scope.row.
fhje
"
placeholder=
"请输入
分红金额
"
v-model
.
number=
"scope.row.
zgcsqd
"
placeholder=
"请输入
整改措施清单
"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"fjcl"
label=
"附件材料"
>
<
template
#
default=
"scope"
>
<FileUploader
v-model=
"scope.row.fjcl"
:isInline=
"true"
></FileUploader>
</
template
>
</el-table-column>
<el-table-column
label=
"操作"
width=
"60"
>
<
template
#
default=
"scope"
>
<el-button
link
type=
"danger"
size=
"small"
@
click=
"delete
Tzfh
s(scope.$index)"
@
click=
"delete
JsqtzjcZxjc
s(scope.$index)"
>
删除
</el-button
>
</
template
>
</el-table-column>
</el-table>
<div
class=
"subtotal"
>
<div
class=
"label"
>
流入小计
</div>
<div
class=
"value"
>
{{ subtotalNum }}(万元)
</div>
</div>
</el-collapse-item>
<el-collapse-item
title=
"净现金流"
name=
"净现金流"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"静态"
>
<el-input
v-model
.
number=
"formData.jt"
placeholder=
"请输入静态"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"折现(3.5%)"
>
<el-input
v-model
.
number=
"formData.zx"
placeholder=
"请输入折现(3.5%)"
/>
</el-form-item>
</el-col>
</el-row>
<el-row
:gutter=
"20"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"联系人"
>
<el-input
v-model=
"formData.lxr"
placeholder=
"请输入联系人"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"联系方式"
>
<el-input
v-model=
"formData.lxfs"
placeholder=
"请输入联系方式"
/>
</el-form-item>
</el-col>
</el-row>
<el-row
:gutter=
"20"
>
<el-col
:span=
"24"
>
<el-form-item
label=
"备注"
>
<el-input
type=
"textarea"
v-model=
"formData.bz"
placeholder=
"请输入备注"
:rows=
"4"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
</el-collapse>
</el-form>
...
...
@@ -474,155 +227,28 @@
</template>
<
script
setup
>
import
{
reactive
,
ref
,
onMounted
,
getCurrentInstance
,
h
,
computed
}
from
"vue"
;
import
{
reactive
,
ref
,
onMounted
,
getCurrentInstance
}
from
"vue"
;
import
{
useRouter
,
useRoute
}
from
"vue-router"
;
import
{
ElMessage
,
ElMessageBox
}
from
"element-plus"
;
import
{
useUserStore
}
from
"@/stores/user.js"
;
import
{
number
}
from
"echarts"
;
import
FileUploader
from
"../../components/FileUploader/index.vue"
;
// 初始化全局变量
const
userStore
=
useUserStore
();
const
router
=
useRouter
();
const
route
=
useRoute
();
const
{
proxy
}
=
getCurrentInstance
();
const
token
=
ref
(
userStore
.
authToken
||
sessionStorage
.
getItem
(
"authToken"
)
||
""
);
// 小记金额
const
subtotalNum
=
computed
(()
=>
{
let
totalHtje
=
tzfhs
.
value
.
reduce
((
sum
,
item
)
=>
{
const
num
=
Number
(
item
.
fhje
)
||
0
;
// 兼容空值/非数字
return
sum
+
num
;
},
0
);
let
totalYwlr
=
wtyys
.
value
.
reduce
((
sum
,
item
)
=>
{
const
num
=
Number
(
item
.
ywlr
)
||
0
;
// 兼容空值/非数字
return
sum
+
num
;
},
0
);
console
.
log
(
totalYwlr
,
"totalYwlr"
);
console
.
log
(
totalHtje
,
"totalHtje"
);
return
(
totalHtje
+
totalYwlr
).
toFixed
(
2
);
});
// 折叠面板默认展开项
const
activeCollapse
=
ref
([
"基本信息"
,
"出资情况"
,
"合同约定权益获取"
,
"分红情况"
,
"资金流入"
,
"净现金流"
,
"资金流出"
,
"分红情况"
,
]);
const
activeCollapse
=
ref
([
"基本信息"
,
"投资(成本)分析会资料"
,
"专项检查"
]);
// 表单数据
const
formData
=
reactive
({
projectName
:
""
,
qc
:
""
,
jc
:
""
,
nbtzglzt
:
""
,
xmscjd
:
""
,
gqjg
:
""
,
xmzbjze
:
""
,
gszbjyczze
:
""
,
gsdqycze
:
""
,
gsdqyjcze
:
""
,
gsdqycwcje
:
""
,
gsdqsycze
:
""
,
cgbczqk
:
""
,
wfqyhttkyd
:
""
,
qyhqjz
:
""
,
qyhqyyd
:
""
,
dbqk
:
""
,
lrfp
:
""
,
sfddlrfptj
:
""
,
ljhqfh
:
""
,
ytrzj
:
""
,
ljtrzj
:
""
,
sxtrzj
:
""
,
jt
:
""
,
zx
:
""
,
lxr
:
""
,
lxfs
:
""
,
bz
:
""
,
projectId
:
""
,
del
:
0
,
//
del字段保留0默认值(删除标记,0为正常)
del
:
0
,
//
删除标记,0为正常
createdAt
:
""
,
updatedAt
:
""
,
});
let
options
=
ref
();
function
sumWtyysColumns
(
param
)
{
const
{
columns
,
data
}
=
param
;
const
sums
=
[];
columns
.
forEach
((
column
,
index
)
=>
{
if
(
index
===
0
)
{
sums
[
index
]
=
h
(
"div"
,
"合计"
);
return
;
}
const
prop
=
column
.
property
;
if
(
prop
===
"lx"
||
prop
===
"fwsj"
||
!
prop
)
{
sums
[
index
]
=
""
;
return
;
}
if
(
prop
===
"htje"
)
{
const
values
=
data
.
map
((
item
)
=>
Number
(
item
.
htje
)
||
0
);
const
total
=
values
.
reduce
((
prev
,
curr
)
=>
prev
+
curr
,
0
);
sums
[
index
]
=
total
.
toFixed
(
2
)
+
"(万元)"
;
return
;
}
if
(
prop
===
"ywlr"
)
{
const
values
=
data
.
map
((
item
)
=>
Number
(
item
.
ywlr
)
||
0
);
const
total
=
values
.
reduce
((
prev
,
curr
)
=>
prev
+
curr
,
0
);
sums
[
index
]
=
total
.
toFixed
(
2
)
+
"(万元)"
;
return
;
}
sums
[
index
]
=
""
;
});
return
sums
;
}
function
sumTzfhsColumns
(
param
)
{
const
{
columns
,
data
}
=
param
;
const
sums
=
[];
columns
.
forEach
((
column
,
index
)
=>
{
if
(
index
===
0
)
{
sums
[
index
]
=
h
(
"div"
,
"合计"
);
return
;
}
const
prop
=
column
.
property
;
if
(
prop
===
"fhsj"
||
!
prop
)
{
sums
[
index
]
=
""
;
return
;
}
// 分红金额合计
if
(
prop
===
"fhje"
)
{
const
values
=
data
.
map
((
item
)
=>
Number
(
item
.
fhje
)
||
0
);
const
total
=
values
.
reduce
((
prev
,
curr
)
=>
prev
+
curr
,
0
);
sums
[
index
]
=
total
.
toFixed
(
2
)
+
"(万元)"
;
return
;
}
sums
[
index
]
=
""
;
});
return
sums
;
}
// 加载状态
const
loading
=
ref
(
false
);
// 是否预览模式
...
...
@@ -632,36 +258,54 @@ const projectList = ref([]);
// 当前编辑的记录ID
const
rcCgqyglId
=
ref
(
route
.
query
.
id
||
""
);
let
wtyys
=
ref
([]);
const
addPfyjlsqk
=
()
=>
{
wtyys
.
value
.
push
({});
// 投资(成本)分析会资料列表
const
jsqtzjcTzfxsList
=
ref
([]);
// 专项检查列表
const
jsqtzjcZxjcsList
=
ref
([]);
// ========== 投资(成本)分析会资料 操作方法 ==========
const
addjsqtzjcTzfxs
=
()
=>
{
jsqtzjcTzfxsList
.
value
.
push
({
jd
:
""
,
ycztz
:
""
,
zbjnbsyl
:
""
,
jsqtzjcTzfxs
:
[],
});
};
const
deletePfyjlsqk
=
(
index
)
=>
{
const
deletejsqtzjcTzfxs
=
(
index
)
=>
{
ElMessageBox
.
confirm
(
"确认删除该项?"
,
"提示"
,
{
confirmButtonText
:
"确认"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
,
}).
then
(()
=>
{
wtyys
.
value
.
splice
(
index
,
1
);
jsqtzjcTzfxsList
.
value
.
splice
(
index
,
1
);
ElMessage
.
success
(
"删除成功"
);
});
};
let
tzfhs
=
ref
([]);
// 新增
const
addTzfhs
=
()
=>
{
tzfhs
.
value
.
push
({});
// ========== 专项检查 操作方法 ==========
const
addJsqtzjcZxjcs
=
()
=>
{
jsqtzjcZxjcsList
.
value
.
push
({
zxjcfl
:
""
,
jcjg
:
""
,
zgcsqd
:
""
,
fjcl
:
[],
});
};
// 删除
const
delete
Tzfh
s
=
(
index
)
=>
{
const
delete
JsqtzjcZxjc
s
=
(
index
)
=>
{
ElMessageBox
.
confirm
(
"确认删除该项?"
,
"提示"
,
{
confirmButtonText
:
"确认"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
,
}).
then
(()
=>
{
tzfhs
.
value
.
splice
(
index
,
1
);
jsqtzjcZxjcsList
.
value
.
splice
(
index
,
1
);
ElMessage
.
success
(
"删除成功"
);
});
};
// ========== 通用方法 ==========
// 获取项目列表
const
getProjectData
=
()
=>
{
proxy
.
$post
({
...
...
@@ -690,25 +334,20 @@ const changeProject = (val) => {
};
// 获取单条记录详情(编辑/预览)
const
get
RcCgqygl
Detail
=
()
=>
{
const
get
Jsqtzjc
Detail
=
()
=>
{
if
(
!
rcCgqyglId
.
value
)
return
;
loading
.
value
=
true
;
proxy
.
$post
({
url
:
"/api/project/get
Cgqygl
"
,
url
:
"/api/project/get
JsqtzjcInfo
"
,
data
:
{
id
:
rcCgqyglId
.
value
},
callback
:
(
data
)
=>
{
loading
.
value
=
false
;
Object
.
assign
(
formData
,
{
...
data
,
});
if
(
data
.
wtyys
)
{
Object
.
assign
(
wtyys
.
value
,
data
.
wtyys
);
}
// 新增:加载
if
(
data
.
tzfhs
)
{
Object
.
assign
(
tzfhs
.
value
,
data
.
tzfhs
);
}
// 赋值基础表单数据
Object
.
assign
(
formData
,
data
);
// 赋值列表数据
jsqtzjcTzfxsList
.
value
=
data
.
jsqtzjcTzfxs
||
[];
jsqtzjcZxjcsList
.
value
=
data
.
jsqtzjcZxjcs
||
[];
},
errorCallback
:
()
=>
{
loading
.
value
=
false
;
...
...
@@ -717,6 +356,7 @@ const getRcCgqyglDetail = () => {
});
};
// 返回上一页
const
backClick
=
()
=>
{
router
.
back
(
-
1
);
};
...
...
@@ -732,43 +372,53 @@ const saveClick = () => {
loading
.
value
=
true
;
// 区分新增/编辑
const
url
=
rcCgqyglId
.
value
?
"/api/project/update
Cgqygl
"
:
"/api/project/create
Cgqygl
"
;
?
"/api/project/update
Jsqtzjc
"
:
"/api/project/create
Jsqtzjc
"
;
//
处理空数字字段:空值转为null,避免提交空字符串
//
组装提交数据
const
submitData
=
{
...
formData
,
projectId
:
formData
.
projectId
+
""
,
wtyys
:
wtyys
.
value
,
tzfhs
:
tzfhs
.
value
,
projectId
:
formData
.
projectId
+
""
,
// 确保为字符串类型
jsqtzjcTzfxs
:
jsqtzjcTzfxsList
.
value
,
jsqtzjcZxjcs
:
jsqtzjcZxjcsList
.
value
,
};
proxy
.
$post
({
url
:
url
,
data
:
submitData
,
callback
:
(
res
)
=>
{
callback
:
()
=>
{
loading
.
value
=
false
;
ElMessage
.
success
(
rcCgqyglId
.
value
?
"编辑成功"
:
"新增成功"
);
router
.
back
(
-
1
);
},
errorCallback
:
()
=>
{
loading
.
value
=
false
;
ElMessage
.
error
(
"保存失败,请重试"
);
},
});
};
let
options
=
ref
();
// 页面初始化
onMounted
(()
=>
{
// 获取项目列表
getProjectData
();
options
.
value
=
JSON
.
parse
(
sessionStorage
.
getItem
(
"resourceData"
));
// 如果有ID则加载详情
if
(
rcCgqyglId
.
value
)
{
get
RcCgqygl
Detail
();
get
Jsqtzjc
Detail
();
}
});
</
script
>
<
style
scoped
lang=
"less"
>
@import "@/styles/verticalManages.less";
// @import "@/styles/manage.less";
.tab-handle {
margin-bottom: 10px;
text-align: left;
}
.subtotal {
background-color: #f5f7fa;
...
...
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