明树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
485bc38d
Commit
485bc38d
authored
Jan 21, 2026
by
zhanghan
Browse files
Options
Browse Files
Download
Plain Diff
建设期投资检查开发完毕
parents
ada7604b
33a92c02
Pipeline
#106419
passed with stage
in 17 seconds
Changes
6
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
269 additions
and
77 deletions
+269
-77
tableFileHandle.js
src/common/tableFileHandle.js
+93
-0
addControl.vue
src/views/investingManage/addControl.vue
+1
-1
addRisk.vue
src/views/investingManage/addRisk.vue
+171
-7
addStatement.vue
src/views/investingManage/addStatement.vue
+1
-0
majorRisk.vue
src/views/investingManage/majorRisk.vue
+1
-1
templateManage.vue
src/views/projectManage/templateManage.vue
+2
-68
No files found.
src/common/tableFileHandle.js
0 → 100644
View file @
485bc38d
import
*
as
XLSX
from
"xlsx"
;
// 导入excel文件显示到前端页面
const
importTableFile
=
async
(
file
)
=>
{
const
data
=
await
readFile
(
file
.
raw
);
// 使用 xlsx 解析
let
workbook
=
XLSX
.
read
(
data
,
{
type
:
'array'
,
cellDates
:
true
,
cellStyles
:
true
});
console
.
log
(
workbook
);
};
const
readFile
=
(
file
)
=>
{
return
new
Promise
((
resolve
,
reject
)
=>
{
const
reader
=
new
FileReader
();
reader
.
onload
=
(
e
)
=>
resolve
(
e
.
target
.
result
);
reader
.
onerror
=
reject
;
reader
.
readAsArrayBuffer
(
file
);
});
};
// 导出页面数据,生成excel文件
const
exportTableFile
=
(
tableData
,
tableColumns
,
title
,
fileName
)
=>
{
const
wb
=
XLSX
.
utils
.
book_new
()
// 2. 准备数据
let
wsData
=
[[
title
],
[]]
// 添加表头
if
(
tableColumns
&&
tableColumns
.
length
>
0
)
{
const
headerRow
=
tableColumns
.
map
(
h
=>
h
.
label
||
h
)
wsData
.
push
(
headerRow
)
}
// 添加数据行
tableData
.
forEach
(
item
=>
{
if
(
tableColumns
)
{
// 按表头配置提取数据
const
row
=
tableColumns
.
map
(
header
=>
{
const
value
=
getNestedValue
(
item
,
header
.
prop
||
header
)
return
formatCellValue
(
value
,
header
.
formatter
)
})
wsData
.
push
(
row
)
}
else
{
// 如果没有表头配置,直接使用对象值
const
row
=
Object
.
values
(
item
)
wsData
.
push
(
row
)
}
})
// 3. 创建工作表
const
ws
=
XLSX
.
utils
.
aoa_to_sheet
(
wsData
)
// 4. 设置列宽(可选)
if
(
tableColumns
)
{
const
colWidths
=
tableColumns
.
map
(
header
=>
({
wch
:
header
.
width
||
Math
.
max
(
(
header
.
label
||
header
).
length
,
...
tableData
.
map
(
item
=>
{
const
value
=
getNestedValue
(
item
,
header
.
prop
||
header
)
return
String
(
value
||
''
).
length
})
)
*
2
}))
ws
[
'!cols'
]
=
colWidths
}
// 合并标题单元格
ws
[
'!merges'
]
=
[
XLSX
.
utils
.
decode_range
(
'A1:Q1'
)
// 合并第一行的 A-E 列
]
// 5. 将工作表添加到工作簿
XLSX
.
utils
.
book_append_sheet
(
wb
,
ws
,
'Sheet1'
)
// 6. 生成 Excel 文件并下载
XLSX
.
writeFile
(
wb
,
fileName
+
".xlsx"
);
};
// 辅助函数:获取嵌套对象的值
const
getNestedValue
=
(
obj
,
path
)
=>
{
return
path
.
split
(
'.'
).
reduce
((
prev
,
curr
)
=>
{
return
prev
?
prev
[
curr
]
:
null
},
obj
)
}
// 辅助函数:格式化单元格值
const
formatCellValue
=
(
value
,
formatter
)
=>
{
if
(
formatter
&&
typeof
formatter
===
'function'
)
{
return
formatter
(
value
)
}
return
value
}
export
{
importTableFile
,
exportTableFile
}
\ No newline at end of file
src/views/investingManage/addControl.vue
View file @
485bc38d
...
@@ -235,7 +235,7 @@
...
@@ -235,7 +235,7 @@
v-model=
"scope.row.yjwcsj"
v-model=
"scope.row.yjwcsj"
type=
"datetime"
type=
"datetime"
placeholder=
"请选择"
placeholder=
"请选择"
value-format=
"YYYY-MM-DD HH:mm:
SS
"
value-format=
"YYYY-MM-DD HH:mm:
ss
"
/>
/>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
...
...
src/views/investingManage/addRisk.vue
View file @
485bc38d
...
@@ -84,6 +84,135 @@
...
@@ -84,6 +84,135 @@
/>
/>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
<el-col
:span=
"8"
>
<el-form-item
label=
"项目类型"
label-width=
"180"
>
<el-select
v-model=
"formData.xmlx"
placeholder=
"请选择"
no-data-text=
"暂无数据"
>
<el-option
v-for=
"item in xmlxList"
:key=
"item.key"
:label=
"item.name"
:value=
"item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col
:span=
"8"
>
<el-form-item
label=
"本集团股比(%)"
label-width=
"190"
>
<el-input-number
v-model=
"formData.bjtgb"
:min=
"0"
:max=
"99999999999.99999999"
controls-position=
"right"
/>
</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=
"风险处置情况"
:label-width=
"100"
></el-form-item>
<div
class=
"tab-handle"
>
<el-button
type=
"primary"
size=
"small"
@
click=
"addFxczqk"
>
新增
</el-button>
</div>
<el-table
:data=
"fxczqkData"
style=
"width: 100%"
empty-text=
"暂无数据"
border
>
<el-table-column
type=
"index"
width=
"60"
/>
<el-table-column
prop=
"nd"
label=
"年度"
width=
"260"
>
<
template
#
default=
"scope"
>
<el-date-picker
v-model=
"scope.row.nd"
type=
"month"
placeholder=
"请选择"
value-format=
"YYYY-MM"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"mbfj"
label=
"目标分解"
width=
"240"
>
<
template
#
default=
"scope"
>
<el-input
v-model=
"scope.row.mbfj"
type=
"textarea"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"jzqk"
label=
"进展情况"
width=
"240"
>
<
template
#
default=
"scope"
>
<el-input
v-model=
"scope.row.jzqk"
type=
"textarea"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"fxdj"
label=
"风险等级"
width=
"240"
>
<
template
#
default=
"scope"
>
<el-input
v-model=
"scope.row.fxdj"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"fxfl"
label=
"风险分类"
width=
"240"
>
<
template
#
default=
"scope"
>
<el-input
v-model=
"scope.row.fxfl"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"fxgk"
label=
"风险概况"
width=
"240"
>
<
template
#
default=
"scope"
>
<el-input
v-model=
"scope.row.fxgk"
type=
"textarea"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"kzcs"
label=
"控制措施"
width=
"240"
>
<
template
#
default=
"scope"
>
<el-input
v-model=
"scope.row.kzcs"
type=
"textarea"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"czjz"
label=
"处置进展"
width=
"240"
>
<
template
#
default=
"scope"
>
<el-input
v-model=
"scope.row.czjz"
type=
"textarea"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"yjzgwcsj"
label=
"预计整改完成时间"
width=
"260"
>
<
template
#
default=
"scope"
>
<el-date-picker
v-model=
"scope.row.yjzgwcsj"
type=
"datetime"
placeholder=
"请选择"
value-format=
"YYYY-MM-DD HH:mm:ss"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"fxsjje"
label=
"风险涉及金额"
width=
"260"
>
<
template
#
default=
"scope"
>
<el-input-number
v-model=
"scope.row.fxsjje"
:min=
"0"
:max=
"99999999999.99999999"
controls-position=
"right"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"cxgl"
label=
"出险概率"
width=
"240"
>
<
template
#
default=
"scope"
>
<el-input
v-model=
"scope.row.cxgl"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"fxfxfs"
label=
"风险发现方式"
width=
"240"
>
<
template
#
default=
"scope"
>
<el-input
v-model=
"scope.row.fxfxfs"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"操作"
width=
"60"
fixed=
"right"
>
<
template
#
default=
"scope"
>
<el-button
link
type=
"danger"
size=
"small"
@
click=
"deleteFxczqk(scope.$index)"
>
删除
</el-button>
</
template
>
</el-table-column>
</el-table>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"可能发生的潜在风险"
label-width=
"140"
>
<el-input
v-model=
"formData.knfsqzfx"
type=
"textarea"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"是否当期新增"
>
<el-radio-group
v-model=
"formData.sfdqxz"
>
<el-radio
:value=
"1"
>
是
</el-radio>
<el-radio
:value=
"2"
>
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"责任人"
label-width=
"140"
>
<el-input
v-model=
"formData.zrr"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"联系方式"
>
<el-input
v-model=
"formData.lxfs"
/>
</el-form-item>
</el-col>
</el-row>
</el-row>
</el-collapse-item>
</el-collapse-item>
</el-collapse>
</el-collapse>
...
@@ -107,7 +236,7 @@
...
@@ -107,7 +236,7 @@
token
.
value
=
userStore
.
authToken
||
sessionStorage
.
getItem
(
"authToken"
)
||
""
;
token
.
value
=
userStore
.
authToken
||
sessionStorage
.
getItem
(
"authToken"
)
||
""
;
const
activeCollapse
=
reactive
([
const
activeCollapse
=
reactive
([
"基本信息"
"基本信息"
,
"已发现或暴露的风险"
]);
]);
let
formData
=
reactive
({});
let
formData
=
reactive
({});
let
loading
=
ref
(
false
);
let
loading
=
ref
(
false
);
...
@@ -116,13 +245,23 @@
...
@@ -116,13 +245,23 @@
const
getRiskInfo
=
()
=>
{
const
getRiskInfo
=
()
=>
{
loading
.
value
=
true
;
loading
.
value
=
true
;
proxy
.
$post
({
proxy
.
$post
({
url
:
"/api/project/get
Tzkz
Info"
,
url
:
"/api/project/get
Zdfx
Info"
,
data
:
{
data
:
{
id
:
riskId
id
:
riskId
},
},
callback
:
(
res
)
=>
{
callback
:
(
res
)
=>
{
loading
.
value
=
false
;
loading
.
value
=
false
;
Object
.
assign
(
formData
,
res
);
Object
.
assign
(
formData
,
{
...
res
,
jnw
:
res
.
jnw
?
res
.
jnw
.
toString
()
:
undefined
,
sjnzjjw
:
res
.
sjnzjjw
?
res
.
sjnzjjw
.
toString
()
:
undefined
,
dsjngjjw
:
res
.
dsjngjjw
?
res
.
dsjngjjw
.
toString
()
:
undefined
,
xmlx
:
res
.
xmlx
?
res
.
xmlx
.
toString
()
:
undefined
,
});
console
.
log
(
formData
);
szjList
.
value
=
jnwList
.
filter
(
item
=>
item
.
key
==
res
.
jnw
)[
0
]?.
children
||
[];
dsgjList
.
value
=
szjList
.
value
.
filter
(
item
=>
item
.
key
==
res
.
sjnzjjw
)[
0
]?.
children
||
[];
Object
.
assign
(
fxczqkData
.
value
,
res
.
zdfxczs
);
}
}
});
});
};
};
...
@@ -146,11 +285,16 @@
...
@@ -146,11 +285,16 @@
let
szjList
=
ref
([]);
// 省(境内)/洲际(境外) // 级联
let
szjList
=
ref
([]);
// 省(境内)/洲际(境外) // 级联
let
dsgjList
=
ref
([]);
// 地市(境内)/国家(境外) // 级联
let
dsgjList
=
ref
([]);
// 地市(境内)/国家(境外) // 级联
let
tzbkList
=
ref
([]);
// 投资板块
let
tzbkList
=
ref
([]);
// 投资板块
let
tzbkProps
=
{
label
:
"name"
};
let
xmlxList
=
ref
([]);
//项目类型
onMounted
(()
=>
{
onMounted
(()
=>
{
getProjectData
();
getProjectData
();
let
resourceData
=
JSON
.
parse
(
sessionStorage
.
getItem
(
"resourceData"
));
let
resourceData
=
JSON
.
parse
(
sessionStorage
.
getItem
(
"resourceData"
));
jnwList
=
resourceData
.
dqlx
;
jnwList
=
resourceData
.
dqlx
;
tzbkList
=
resourceData
.
tzbk
;
tzbkList
=
resourceData
.
tzbk
;
xmlxList
=
resourceData
[
"zdfx-type"
];
if
(
riskId
)
{
if
(
riskId
)
{
getRiskInfo
();
getRiskInfo
();
}
}
...
@@ -160,7 +304,6 @@
...
@@ -160,7 +304,6 @@
let
selectData
=
jnwList
.
filter
(
item
=>
item
.
key
==
val
);
let
selectData
=
jnwList
.
filter
(
item
=>
item
.
key
==
val
);
szjList
.
value
=
selectData
[
0
]
&&
selectData
[
0
].
children
||
[];
szjList
.
value
=
selectData
[
0
]
&&
selectData
[
0
].
children
||
[];
dsgjList
.
value
=
[];
dsgjList
.
value
=
[];
qxgjList
.
value
=
[];
delete
formData
.
sjnzjjw
;
delete
formData
.
sjnzjjw
;
delete
formData
.
dsjngjjw
;
delete
formData
.
dsjngjjw
;
}
}
...
@@ -169,10 +312,24 @@
...
@@ -169,10 +312,24 @@
if
(
val
||
val
===
0
)
{
if
(
val
||
val
===
0
)
{
let
selectData
=
szjList
.
value
.
filter
(
item
=>
item
.
key
==
val
);
let
selectData
=
szjList
.
value
.
filter
(
item
=>
item
.
key
==
val
);
dsgjList
.
value
=
selectData
[
0
]
&&
selectData
[
0
].
children
||
[];
dsgjList
.
value
=
selectData
[
0
]
&&
selectData
[
0
].
children
||
[];
qxgjList
.
value
=
[];
delete
formData
.
dsjngjjw
;
delete
formData
.
dsjngjjw
;
}
}
}
}
// 风险处置情况
let
fxczqkData
=
ref
([]);
const
addFxczqk
=
()
=>
{
fxczqkData
.
value
.
push
({});
};
const
deleteFxczqk
=
(
index
)
=>
{
ElMessageBox
.
confirm
(
"确认删除该项?"
,
"提示"
,{
confirmButtonText
:
'确认'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
,
}).
then
(()
=>
{
fxczqkData
.
value
.
splice
(
index
,
1
);
})
}
const
backClick
=
()
=>
{
const
backClick
=
()
=>
{
router
.
back
(
-
1
)
router
.
back
(
-
1
)
}
}
...
@@ -184,11 +341,18 @@
...
@@ -184,11 +341,18 @@
proxy
.
$post
({
proxy
.
$post
({
url
:
"/api/project/"
+
url
,
url
:
"/api/project/"
+
url
,
data
:
{
data
:
{
...
formData
...
formData
,
zdfxczs
:
fxczqkData
.
value
},
},
callback
:
(
data
)
=>
{
callback
:
(
data
)
=>
{
router
.
back
(
-
1
)
router
.
back
(
-
1
)
}
}
});
});
}
}
</
script
>
</
script
>
\ No newline at end of file
<
style
lang=
"less"
>
@import "@/styles/manage.less";
.add-project-header{
margin-bottom: 10px;
}
</
style
>
\ No newline at end of file
src/views/investingManage/addStatement.vue
View file @
485bc38d
...
@@ -208,6 +208,7 @@
...
@@ -208,6 +208,7 @@
v-model=
"scope.row.lssj"
v-model=
"scope.row.lssj"
type=
"datetime"
type=
"datetime"
placeholder=
"请选择"
placeholder=
"请选择"
value-format=
"YYYY-MM-DD HH:mm:ss"
/>
/>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
...
...
src/views/investingManage/majorRisk.vue
View file @
485bc38d
...
@@ -101,7 +101,7 @@
...
@@ -101,7 +101,7 @@
router
.
push
({
router
.
push
({
name
:
"addRisk"
,
name
:
"addRisk"
,
query
:
{
query
:
{
control
Id
:
item
.
id
risk
Id
:
item
.
id
}
}
});
});
};
};
...
...
src/views/projectManage/templateManage.vue
View file @
485bc38d
...
@@ -31,7 +31,7 @@
...
@@ -31,7 +31,7 @@
<
script
setup
>
<
script
setup
>
import
{
reactive
,
ref
}
from
"vue"
;
import
{
reactive
,
ref
}
from
"vue"
;
import
*
as
XLSX
from
"xlsx
"
;
import
{
exportTableFile
}
from
"../../common/tableFileHandle
"
;
const
tableColumns
=
reactive
([
const
tableColumns
=
reactive
([
{
{
prop
:
"projectName"
,
prop
:
"projectName"
,
...
@@ -116,74 +116,8 @@
...
@@ -116,74 +116,8 @@
}).
catch
(()
=>
{});
}).
catch
(()
=>
{});
};
};
const
exportData
=
()
=>
{
const
exportData
=
()
=>
{
// 1. 创建工作簿
exportTableFile
(
tableData
.
value
,
tableColumns
,
"投资项目批复意见落实情况统计表"
,
"导出文件"
)
const
wb
=
XLSX
.
utils
.
book_new
()
// 2. 准备数据
let
wsData
=
[[
"投资项目批复意见落实情况统计表"
],
[]]
// 添加表头
if
(
tableColumns
&&
tableColumns
.
length
>
0
)
{
const
headerRow
=
tableColumns
.
map
(
h
=>
h
.
label
||
h
)
wsData
.
push
(
headerRow
)
}
// 添加数据行
tableData
.
value
.
forEach
(
item
=>
{
if
(
tableColumns
)
{
// 按表头配置提取数据
const
row
=
tableColumns
.
map
(
header
=>
{
const
value
=
getNestedValue
(
item
,
header
.
prop
||
header
)
return
formatCellValue
(
value
,
header
.
formatter
)
})
wsData
.
push
(
row
)
}
else
{
// 如果没有表头配置,直接使用对象值
const
row
=
Object
.
values
(
item
)
wsData
.
push
(
row
)
}
})
// 3. 创建工作表
const
ws
=
XLSX
.
utils
.
aoa_to_sheet
(
wsData
)
// 4. 设置列宽(可选)
if
(
tableColumns
)
{
const
colWidths
=
tableColumns
.
map
(
header
=>
({
wch
:
header
.
width
||
Math
.
max
(
(
header
.
label
||
header
).
length
,
...
tableData
.
value
.
map
(
item
=>
{
const
value
=
getNestedValue
(
item
,
header
.
prop
||
header
)
return
String
(
value
||
''
).
length
})
)
*
2
}))
ws
[
'!cols'
]
=
colWidths
}
// 合并标题单元格
ws
[
'!merges'
]
=
[
XLSX
.
utils
.
decode_range
(
'A1:Q1'
)
// 合并第一行的 A-E 列
]
// 5. 将工作表添加到工作簿
XLSX
.
utils
.
book_append_sheet
(
wb
,
ws
,
'Sheet1'
)
// 6. 生成 Excel 文件并下载
XLSX
.
writeFile
(
wb
,
"导出文件.xlsx"
);
};
};
// 辅助函数:获取嵌套对象的值
function
getNestedValue
(
obj
,
path
)
{
return
path
.
split
(
'.'
).
reduce
((
prev
,
curr
)
=>
{
return
prev
?
prev
[
curr
]
:
null
},
obj
)
}
// 辅助函数:格式化单元格值
function
formatCellValue
(
value
,
formatter
)
{
if
(
formatter
&&
typeof
formatter
===
'function'
)
{
return
formatter
(
value
)
}
return
value
}
</
script
>
</
script
>
<
style
lang=
"less"
>
<
style
lang=
"less"
>
...
...
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