明树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
918db535
Commit
918db535
authored
Mar 06, 2026
by
zhanghan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
代码补全
parent
f71a1732
Pipeline
#108022
passed with stage
in 20 seconds
Changes
7
Pipelines
1
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
2165 additions
and
1146 deletions
+2165
-1146
FinancialTable.vue
src/components/FinancialTable.vue
+16
-19
verticalManages.css
src/styles/verticalManages.css
+27
-2
verticalManages.less
src/styles/verticalManages.less
+276
-238
decisionAdd.vue
src/views/investingManage/decisionAdd.vue
+1551
-642
quitAdd.vue
src/views/investingManage/quitAdd.vue
+21
-10
projectAllPage.vue
src/views/projectManage/projectAllPage.vue
+215
-178
departManage.vue
src/views/systemManage/departManage.vue
+59
-57
No files found.
src/components/FinancialTable.vue
View file @
918db535
...
@@ -15,21 +15,31 @@
...
@@ -15,21 +15,31 @@
prop=
"serialNumber"
prop=
"serialNumber"
label=
"序号"
label=
"序号"
width=
"80"
width=
"80"
fixed=
"left"
align=
"center"
align=
"center"
/>
/>
<!-- 指标项列(层级缩进):保留原逻辑 -->
<!-- 指标项列(层级缩进):保留原逻辑 -->
<el-table-column
<el-table-column
prop=
"indicatorName"
prop=
"indicatorName"
label=
"名称"
label=
"名称"
fixed=
"left"
align=
"left"
align=
"left"
min-width=
"260"
min-width=
"260"
>
>
<template
#
default=
"
{ row }">
<template
#
default=
"
{ row }">
<div
style=
"text-align: left"
>
{{
row
.
indicatorName
}}
</div>
<div
:style=
"
{
textIndent: row.level ? `${row.level * 20}px` : '0px',
textAlign: 'left',
}"
>
{{
row
.
indicatorName
}}
</div>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
<!-- 合计列:文本行隐藏合计值,不显示0.00 → 从内部数据取值 -->
<!-- 合计列:文本行隐藏合计值,不显示0.00 → 从内部数据取值 -->
<el-table-column
label=
"合计"
width=
"140"
align=
"right"
>
<el-table-column
fixed=
"left"
label=
"合计"
width=
"140"
align=
"right"
>
<
template
#
default=
"{ row }"
>
<
template
#
default=
"{ row }"
>
<span
v-if=
"!row.noTotal"
>
<span
v-if=
"!row.noTotal"
>
{{
row
.
total
?
Number
(
row
.
total
).
toFixed
(
2
)
:
"0.00"
}}
万元
{{
row
.
total
?
Number
(
row
.
total
).
toFixed
(
2
)
:
"0.00"
}}
万元
...
@@ -56,7 +66,6 @@
...
@@ -56,7 +66,6 @@
align="center"
align="center"
>
>
<template
#
default=
"
{ row }">
<template
#
default=
"
{ row }">
<!-- 1. 文本行:多行文本输入框 -->
<el-input
<el-input
v-if=
"row.isTextRow"
v-if=
"row.isTextRow"
v-model=
"row[timeItem.prop]"
v-model=
"row[timeItem.prop]"
...
@@ -283,13 +292,15 @@ const handleTableData = (sourceIndicatorList, sourceTableData) => {
...
@@ -283,13 +292,15 @@ const handleTableData = (sourceIndicatorList, sourceTableData) => {
const
newData
=
[];
const
newData
=
[];
sourceIndicatorList
.
forEach
((
item
,
index
)
=>
{
sourceIndicatorList
.
forEach
((
item
,
index
)
=>
{
const
{
name
,
isTextRow
=
false
,
noTotal
=
false
}
=
item
;
const
{
name
,
isTextRow
=
false
,
noTotal
=
false
}
=
item
;
const
level
=
item
?.
level
||
0
;
const
serialNumber
=
item
?.
serialNumber
||
index
+
1
;
// 深拷贝源数据行
// 深拷贝源数据行
const
originRow
=
const
originRow
=
sourceTableData
.
find
((
row
)
=>
row
.
indicatorName
===
name
)
||
{};
sourceTableData
.
find
((
row
)
=>
row
.
indicatorName
===
name
)
||
{};
const
rowData
=
JSON
.
parse
(
const
rowData
=
JSON
.
parse
(
JSON
.
stringify
({
JSON
.
stringify
({
serialNumber
:
index
+
1
,
serialNumber
,
level
:
0
,
level
,
indicatorName
:
name
,
indicatorName
:
name
,
isTextRow
,
isTextRow
,
noTotal
,
noTotal
,
...
@@ -333,20 +344,6 @@ watch(
...
@@ -333,20 +344,6 @@ watch(
{
deep
:
true
,
immediate
:
true
},
{
deep
:
true
,
immediate
:
true
},
);
);
// 监听时间配置变化:更新内部数据
watch
(
()
=>
validDynamicTimeList
.
value
,
()
=>
{
if
(
!
validConfig
.
value
||
tableDataRef
.
value
.
length
===
0
)
return
;
tableDataRef
.
value
.
forEach
((
row
)
=>
{
initRowTimeField
(
row
);
row
.
total
=
calculateRowTotal
(
row
);
});
emitDataChange
(
tableDataRef
.
value
);
},
{
deep
:
true
,
immediate
:
true
},
);
// 10. 数字行输入回调(逻辑不变)
// 10. 数字行输入回调(逻辑不变)
const
handleFinancialChange
=
(
currentRow
)
=>
{
const
handleFinancialChange
=
(
currentRow
)
=>
{
if
(
props
.
isPreview
||
!
currentRow
||
currentRow
.
noTotal
)
return
;
if
(
props
.
isPreview
||
!
currentRow
||
currentRow
.
noTotal
)
return
;
...
...
src/styles/verticalManages.css
View file @
918db535
...
@@ -181,7 +181,7 @@
...
@@ -181,7 +181,7 @@
}
}
::v-deep
.add-project-content
.tab-content
.upload-file-wrap
.delete-btn
{
::v-deep
.add-project-content
.tab-content
.upload-file-wrap
.delete-btn
{
cursor
:
pointer
;
cursor
:
pointer
;
color
:
#
F56C6C
;
color
:
#
f56c6c
;
}
}
::v-deep
.add-project-content
.tab-content
.el-select__wrapper
.el-select__selection.is-near
{
::v-deep
.add-project-content
.tab-content
.el-select__wrapper
.el-select__selection.is-near
{
max-height
:
120px
;
max-height
:
120px
;
...
@@ -254,12 +254,18 @@
...
@@ -254,12 +254,18 @@
}
}
.add-project-header
{
.add-project-header
{
margin-bottom
:
10px
;
margin-bottom
:
10px
;
padding-left
:
24px
;
}
.add-project-header
.header-left
:hover
{
color
:
#409eff
;
cursor
:
pointer
;
}
}
::v-deep
.el-form-item
{
::v-deep
.el-form-item
{
display
:
block
;
display
:
block
;
}
}
::v-deep
.el-form-item
.el-form-item__label
{
::v-deep
.el-form-item
.el-form-item__label
{
width
:
auto
!important
;
width
:
auto
!important
;
color
:
#333
;
}
}
.tab-handle
{
.tab-handle
{
margin-bottom
:
10px
;
margin-bottom
:
10px
;
...
@@ -280,9 +286,25 @@
...
@@ -280,9 +286,25 @@
align-items
:
center
;
align-items
:
center
;
margin-bottom
:
24px
;
margin-bottom
:
24px
;
}
}
::v-deep
.el-collapse-item__title
{
::v-deep
.el-collapse-item
.el-collapse-item__title
{
color
:
#333
;
font-size
:
16px
;
flex
:
auto
;
flex
:
auto
;
text-align
:
left
;
text-align
:
left
;
padding-left
:
16px
;
position
:
relative
;
}
::v-deep
.el-collapse-item
.el-collapse-item__title
::after
{
position
:
absolute
;
content
:
""
;
left
:
0
;
top
:
15px
;
width
:
2px
;
height
:
19px
;
background-color
:
#409eff
;
}
::v-deep
.el-collapse-item
.el-icon
{
font-size
:
16px
;
}
}
:deep
(
.el-table
)
{
:deep
(
.el-table
)
{
--el-table-border-color
:
#ebeef5
;
--el-table-border-color
:
#ebeef5
;
...
@@ -291,3 +313,6 @@
...
@@ -291,3 +313,6 @@
:deep
(
.el-upload
)
{
:deep
(
.el-upload
)
{
width
:
100%
;
width
:
100%
;
}
}
::v-deep
.el-collapse-item__content
{
padding-bottom
:
0
;
}
src/styles/verticalManages.less
View file @
918db535
This diff is collapsed.
Click to expand it.
src/views/investingManage/decisionAdd.vue
View file @
918db535
This diff is collapsed.
Click to expand it.
src/views/investingManage/quitAdd.vue
View file @
918db535
...
@@ -19,12 +19,7 @@
...
@@ -19,12 +19,7 @@
<el-collapse-item
title=
"选择类型"
name=
"选择类型"
>
<el-collapse-item
title=
"选择类型"
name=
"选择类型"
>
<el-row
:gutter=
"20"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"8"
>
<el-col
:span=
"8"
>
<el-form-item
label=
"请选择登记类型"
>
<el-form-item
label=
"请选择登记类型"
required
>
<!-- <CommonSelector
:radio="true"
v-model="formData.djlx"
dictName="xmtc_djlx"
/> -->
<el-radio-group
v-model=
"formData.djlx"
>
<el-radio-group
v-model=
"formData.djlx"
>
<el-radio
value=
"1"
>
中止
</el-radio>
<el-radio
value=
"1"
>
中止
</el-radio>
<el-radio
value=
"2"
>
重启
</el-radio>
<el-radio
value=
"2"
>
重启
</el-radio>
...
@@ -276,7 +271,11 @@
...
@@ -276,7 +271,11 @@
</el-col>
</el-col>
</el-row>
</el-row>
</el-collapse-item>
</el-collapse-item>
<el-collapse-item
title=
"项目中止内容"
name=
"项目中止内容"
>
<el-collapse-item
v-if=
"formData.djlx == 1"
title=
"项目中止内容"
name=
"项目中止内容"
>
<el-row
:gutter=
"20"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"24"
>
<el-col
:span=
"24"
>
<el-form-item
label=
"中止原因"
>
<el-form-item
label=
"中止原因"
>
...
@@ -327,7 +326,11 @@
...
@@ -327,7 +326,11 @@
</el-col>
</el-col>
</el-row>
</el-row>
</el-collapse-item>
</el-collapse-item>
<el-collapse-item
title=
"项目重启内容"
name=
"项目重启内容"
>
<el-collapse-item
v-if=
"formData.djlx == 2"
title=
"项目重启内容"
name=
"项目重启内容"
>
<el-row
:gutter=
"20"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"24"
>
<el-col
:span=
"24"
>
<el-form-item
label=
"中止原因"
>
<el-form-item
label=
"中止原因"
>
...
@@ -378,7 +381,11 @@
...
@@ -378,7 +381,11 @@
</el-col>
</el-col>
</el-row>
</el-row>
</el-collapse-item>
</el-collapse-item>
<el-collapse-item
title=
"项目终止内容"
name=
"项目终止内容"
>
<el-collapse-item
v-if=
"formData.djlx == 3"
title=
"项目终止内容"
name=
"项目终止内容"
>
<el-row
:gutter=
"20"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"24"
>
<el-col
:span=
"24"
>
<el-form-item
label=
"中止原因"
>
<el-form-item
label=
"中止原因"
>
...
@@ -429,7 +436,11 @@
...
@@ -429,7 +436,11 @@
</el-col>
</el-col>
</el-row>
</el-row>
</el-collapse-item>
</el-collapse-item>
<el-collapse-item
title=
"项目退出内容"
name=
"项目退出内容"
>
<el-collapse-item
v-if=
"formData.djlx == 4"
title=
"项目退出内容"
name=
"项目退出内容"
>
<el-row
:gutter=
"20"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"24"
>
<el-col
:span=
"24"
>
<el-form-item
label=
"中止原因"
>
<el-form-item
label=
"中止原因"
>
...
...
src/views/projectManage/projectAllPage.vue
View file @
918db535
This diff is collapsed.
Click to expand it.
src/views/systemManage/departManage.vue
View file @
918db535
...
@@ -2,14 +2,16 @@
...
@@ -2,14 +2,16 @@
<div
class=
"depart-manage"
v-loading=
"loading"
>
<div
class=
"depart-manage"
v-loading=
"loading"
>
<div
class=
"manage-left"
>
<div
class=
"manage-left"
>
<div
class=
"handle-btn"
>
<div
class=
"handle-btn"
>
<el-button
type=
"primary"
size=
"small"
@
click=
"handleAdd"
>
新增
</el-button>
<el-button
type=
"primary"
size=
"small"
@
click=
"handleAdd"
>
新增
</el-button
>
</div>
</div>
<div
class=
"tree-content"
>
<div
class=
"tree-content"
>
<el-tree
<el-tree
:data=
"treeData"
:data=
"treeData"
node-key=
"id"
node-key=
"id"
default-expand-all
default-expand-all
:props=
"
{
label: 'name'
}"
:props=
"
{
label: 'name'
}"
@node-click="handleNodeClick"
@node-click="handleNodeClick"
>
>
<template
#
default=
"
{ node, data }">
<template
#
default=
"
{ node, data }">
...
@@ -45,8 +47,12 @@
...
@@ -45,8 +47,12 @@
<div
class=
"search-container"
>
<div
class=
"search-container"
>
<el-form
:inline=
"true"
:model=
"searchForm"
>
<el-form
:inline=
"true"
:model=
"searchForm"
>
<el-form-item
label=
"关键字查询"
>
<el-form-item
label=
"关键字查询"
>
<el-input
v-model=
"searchForm.name"
:style=
"{width: '220px'}"
clearable
<el-input
placeholder=
"请输入用户姓名"
@
keydown
.
enter=
"handleSearch"
v-model=
"searchForm.name"
:style=
"{ width: '220px' }"
clearable
placeholder=
"请输入用户姓名"
@
keydown
.
enter=
"handleSearch"
/>
/>
</el-form-item>
</el-form-item>
<el-form-item>
<el-form-item>
...
@@ -78,18 +84,24 @@
...
@@ -78,18 +84,24 @@
:title=
"dialogTitle"
:title=
"dialogTitle"
width=
"400px"
width=
"400px"
@
close=
"cancelDepartForm"
@
close=
"cancelDepartForm"
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
>
>
<el-form
:model=
"departFormData"
ref=
"departForm"
:rules=
"departRules"
label-width=
"100"
>
<el-form
:model=
"departFormData"
ref=
"departForm"
:rules=
"departRules"
label-width=
"100"
>
<el-form-item
label=
"项目名称"
prop=
"name"
>
<el-form-item
label=
"项目名称"
prop=
"name"
>
<el-input
v-model=
"departFormData.name"
/>
<el-input
v-model=
"departFormData.name"
/>
</el-form-item>
</el-form-item>
</el-form>
</el-form>
<
template
#
footer
>
<
template
#
footer
>
<div
class=
"dialog-footer"
>
<div
class=
"dialog-footer"
>
<el-button
@
click=
"cancelDepartForm"
>
取消
</el-button>
<el-button
@
click=
"cancelDepartForm"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"saveDepartForm"
>
保存
</el-button>
<el-button
type=
"primary"
@
click=
"saveDepartForm"
>
保存
</el-button>
</div>
</div>
</
template
>
</
template
>
</el-dialog>
</el-dialog>
</div>
</div>
...
@@ -113,9 +125,7 @@ let departFormData = ref({});
...
@@ -113,9 +125,7 @@ let departFormData = ref({});
const
departForm
=
ref
();
const
departForm
=
ref
();
// 表单验证规则
// 表单验证规则
const
departRules
=
{
const
departRules
=
{
name
:
[
name
:
[{
required
:
true
,
message
:
"请输入部门名称"
,
trigger
:
"blur"
}],
{
required
:
true
,
message
:
"请输入部门名称"
,
trigger
:
"blur"
}
]
};
};
// 新增部门
// 新增部门
const
handleAdd
=
()
=>
{
const
handleAdd
=
()
=>
{
...
@@ -127,37 +137,36 @@ const handleAddChild = (data) => {
...
@@ -127,37 +137,36 @@ const handleAddChild = (data) => {
dialogTitle
.
value
=
"新增子部门"
;
dialogTitle
.
value
=
"新增子部门"
;
departFormData
.
value
.
parentId
=
data
.
id
;
departFormData
.
value
.
parentId
=
data
.
id
;
dialogVisible
.
value
=
true
;
dialogVisible
.
value
=
true
;
}
}
;
const
handleEdit
=
(
data
)
=>
{
const
handleEdit
=
(
data
)
=>
{
departFormData
.
value
=
{
...
data
};
departFormData
.
value
=
{
...
data
};
dialogTitle
.
value
=
"编辑部门"
;
dialogTitle
.
value
=
"编辑部门"
;
dialogVisible
.
value
=
true
;
dialogVisible
.
value
=
true
;
}
}
;
const
handleDelete
=
(
data
)
=>
{
const
handleDelete
=
(
data
)
=>
{
ElMessageBox
.
confirm
(
`确定删除
${
data
.
name
}
?`
,
"提示"
,
{
ElMessageBox
.
confirm
(
`确定删除
${
data
.
name
}
?`
,
"提示"
,
{
confirmButtonText
:
"确定"
,
confirmButtonText
:
"确定"
,
cancelButtonText
:
"取消"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
,
type
:
"warning"
,
}).
then
(()
=>
{
}).
then
(()
=>
{
proxy
.
$post
({
proxy
.
$post
({
url
:
"/api/user/depart/deleteDepart"
,
url
:
"/api/user/depart/deleteDepart"
,
data
:
{
id
:
data
.
id
},
data
:
{
id
:
data
.
id
},
callback
:
(
data
)
=>
{
callback
:
(
data
)
=>
{
ElMessage
.
success
(
"删除成功"
);
ElMessage
.
success
(
"删除成功"
);
loadTreeData
();
loadTreeData
();
},
},
error
:
(
err
)
=>
{
error
:
(
err
)
=>
{
ElMessage
.
error
(
"删除失败:"
,
err
);
ElMessage
.
error
(
"删除失败:"
,
err
);
},
},
});
});
});
}
});
};
const
saveDepartForm
=
()
=>
{
const
saveDepartForm
=
()
=>
{
departForm
.
value
.
validate
(
valid
=>
{
departForm
.
value
.
validate
(
(
valid
)
=>
{
if
(
valid
)
{
if
(
valid
)
{
let
url
=
departFormData
.
value
.
id
?
"updateDepart"
:
"createDepart"
let
url
=
departFormData
.
value
.
id
?
"updateDepart"
:
"createDepart"
;
proxy
.
$post
({
proxy
.
$post
({
url
:
"/api/user/depart/"
+
url
,
url
:
"/api/user/depart/"
+
url
,
data
:
departFormData
.
value
,
data
:
departFormData
.
value
,
...
@@ -171,7 +180,7 @@ const saveDepartForm = () => {
...
@@ -171,7 +180,7 @@ const saveDepartForm = () => {
},
},
});
});
}
}
})
})
;
};
};
const
cancelDepartForm
=
()
=>
{
const
cancelDepartForm
=
()
=>
{
departForm
.
value
.
resetFields
();
departForm
.
value
.
resetFields
();
...
@@ -179,10 +188,6 @@ const cancelDepartForm = () => {
...
@@ -179,10 +188,6 @@ const cancelDepartForm = () => {
dialogVisible
.
value
=
false
;
dialogVisible
.
value
=
false
;
};
};
// 处理树节点点击事件
// 处理树节点点击事件
const
handleNodeClick
=
(
data
,
node
,
element
)
=>
{
const
handleNodeClick
=
(
data
,
node
,
element
)
=>
{
selectedNode
.
value
=
data
;
selectedNode
.
value
=
data
;
...
@@ -210,7 +215,6 @@ const loadTreeData = () => {
...
@@ -210,7 +215,6 @@ const loadTreeData = () => {
});
});
};
};
// 人员信息
// 人员信息
const
handleUserData
=
()
=>
{
const
handleUserData
=
()
=>
{
userLoading
.
value
=
true
;
userLoading
.
value
=
true
;
...
@@ -299,15 +303,13 @@ const handleCurrentPageChange = (page) => {
...
@@ -299,15 +303,13 @@ const handleCurrentPageChange = (page) => {
handleUserData
();
handleUserData
();
};
};
onMounted
(()
=>
{
onMounted
(()
=>
{
loadTreeData
();
loadTreeData
();
});
});
</
script
>
</
script
>
<
style
scoped
lang=
"less"
>
<
style
scoped
lang=
"less"
>
@import "@/styles/manage.less";
@import "@/styles/manage.less";
.depart-manage {
.depart-manage {
padding: 20px;
padding: 20px;
background: rgba(157, 188, 218, 0.1);
background: rgba(157, 188, 218, 0.1);
...
@@ -325,7 +327,7 @@ onMounted(() => {
...
@@ -325,7 +327,7 @@ onMounted(() => {
display: flex;
display: flex;
flex-direction: column;
flex-direction: column;
}
}
.handle-btn{
.handle-btn
{
display: flex;
display: flex;
justify-content: flex-end;
justify-content: flex-end;
}
}
...
@@ -343,24 +345,24 @@ onMounted(() => {
...
@@ -343,24 +345,24 @@ onMounted(() => {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
display: flex;
display: flex;
flex-direction: column;
flex-direction: column;
.search-container{
.search-container
{
padding: 0 20px;
padding: 0 20px;
}
}
.common-table{
.common-table {
flex: 1;
height: 0;
display: flex;
flex-direction: column;
.table-container {
flex: 1;
flex: 1;
height: 0;
height: 0;
display: flex;
display: flex;
flex-direction: column;
flex-direction: column;
.table-container{
.el-table {
flex: 1;
flex: 1;
height: 0;
height: 0;
display: flex;
flex-direction: column;
.el-table{
flex: 1;
height: 0;
}
}
}
}
}
}
}
}
}
}
...
...
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