Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Administrator
/
project_progress
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit 4fc8e264
authored
Feb 20, 2025
by
bingobo
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
辽宁一版发版
1 parent
7ba7408a
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
1731 additions
and
344 deletions
dist.zip
public/js/system.config.js
src/api/indexzc.js
src/views/assessChecks/auxiliarySelection.vue
src/views/assessChecks/checkCompliance.vue
src/views/assessZC/checkCompliance.vue
src/views/assessZC/confirmRelease.vue
src/views/assessZC/projectView.vue
src/views/layout/index.vue
src/views/layout/mainLayout.vue
dist.zip
deleted
100644 → 0
View file @
7ba7408
The file could not be displayed because it is too large.
public/js/system.config.js
View file @
4fc8e26
...
...
@@ -7,6 +7,6 @@ const SystemConfig = {
//TODO VUE_APP_BASE_URL: "http://25.66.210.41/tools",
VUE_APP_BASE_URL
:
"http://192.168.0.113:18088/tools"
,
//TODO VUE_APP_ZJ_IFRAME: "http://25.66.210.41/arch"
// VUE_APP_ZJ_IFRAME: "http://192.168.0.113
:18088
/arch"
// VUE_APP_ZJ_IFRAME: "http://192.168.0.113/arch"
VUE_APP_ZJ_IFRAME
:
"http://localhost:30478/arch"
};
src/api/indexzc.js
View file @
4fc8e26
...
...
@@ -10,6 +10,36 @@ import { get, post, download } from '@/utils/http'
export
function
evalBatchInfo
(
params
)
{
return
post
(
`
${
ARCH_EVALUATION
}
/postEvalBatchInfoZc/`
,
params
)
}
// 获取里程碑数据列表
export
function
milestonesGetList
(
params
)
{
// milestones/getList
return
get
(
`
${
ARCH_EVALUATION
}
/milestones/getList`
,
params
)
}
// 获取流程列表
export
function
getMessageListApi
(
params
)
{
// messageReminder/getIPageList
return
post
(
`
${
ARCH_EVALUATION
}
/messageReminder/getIPageList`
,
params
)
}
// 一键已读 已读单条msg
export
function
updateMessageApi
(
params
)
{
// messageReminder/batchUpdate
return
post
(
`
${
ARCH_EVALUATION
}
/messageReminder/batchUpdate`
,
params
)
}
// 一键已读 已读所有msg
export
function
readWholwMsg
()
{
return
get
(
`
${
ARCH_EVALUATION
}
/messageReminder/batchRead`
)
}
// 获取流程列表
// export function evalBatchInfo(params) {
// return post(`${ARCH_EVALUATION}/postEvalBatchInfoZc/`, params)
// }
//专家库
export
function
expertInfo
(
params
)
{
return
post
(
`
${
ARCH_EVALUATION
}
/expertInfo/`
,
params
)
...
...
src/views/assessChecks/auxiliarySelection.vue
View file @
4fc8e26
...
...
@@ -1105,8 +1105,7 @@ export default {
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
,
})
.
then
(
async
()
=>
{
}).
then
(
async
()
=>
{
let
res
=
await
delEvalBatchInfo
(
this
.
checkedList
[
0
])
if
(
res
.
code
==
200
)
{
this
.
$message
({
...
...
@@ -1121,8 +1120,7 @@ export default {
})
this
.
resetForm
()
}
})
.
catch
(()
=>
{
}).
catch
(()
=>
{
this
.
$message
({
type
:
'info'
,
message
:
'已取消删除'
,
...
...
src/views/assessChecks/checkCompliance.vue
View file @
4fc8e26
...
...
@@ -10,7 +10,13 @@
<div
class=
"top"
:class=
"dialogFullScreen ? 'noShow' : ''"
>
<el-button
type=
"primary"
class=
"working"
style=
"position: absolute; left: -170px"
@
click=
"showMilestoneDialog"
>
里程碑
</el-button
>
<el-button
type=
"primary"
style=
"position: absolute; left: -80px"
@
click=
"working('work')"
>
智能分析
</el-button>
<el-steps
:active=
"active"
align-center
finish-status=
"success"
>
...
...
@@ -231,12 +237,193 @@
>
<div
v-html=
"wtmx"
class=
"dialogscroll"
></div>
</el-dialog>
<el-dialog
:visible
.
sync=
"showMilestone"
title=
"项目里程碑"
width=
"90%"
:modal-append-to-body=
"false"
:append-to-body=
"false"
>
<div
style=
"height: 65vh; display: flex; flex-direction: row; gap: 10px"
>
<div
style=
"flex: 1"
>
<el-card
style=
"height: 100%"
>
<div
style=
"background-color: #0d867f; color: #fff; font-size: 18px"
>
项目计划里程碑
</div>
<div
class=
"time_line_wrap"
>
<div
v-for=
"(item, index) in timeLineDataList1"
:key=
"index"
style=
"display: flex; flex-direction: row; width: 100%"
>
<div
class=
"time_item_left"
>
<div>
{{
item
.
milestoneName
}}
</div>
</div>
<div
class=
"time_item_center"
>
<!-- status: 1 完成 ,2 异常 , 3 未到达 -->
<div
v-if=
"compareTime(item.milestoneTime)"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #54aeed',
background: '#54aeed',
}"
>
</div>
<div
v-if=
"!compareTime(item.milestoneTime)"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #8a8a8a',
background: '#8a8a8a',
}"
>
</div>
<div
v-if=
"item.milestoneTime == null"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #eba84b',
background: '#eba84b',
}"
>
</div>
<!--
<div
v-if=
"item.status == 1"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #54aeed',
background: '#54aeed',
}"
>
</div>
<div
v-if=
"item.status == 2"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #eba84b',
background: '#eba84b',
}"
>
</div>
<div
v-if=
"item.status == 3"
class=
"time_item_dot"
:style=
"
{ border: '2px solid #8a8a8a' }"
>
</div>
-->
<!-- 线条颜色逻辑: 判断当前节点的下一个节点的状态,如果status === 3,未到达,则当前节点的线条为#8a8a8a,否则当前节点线条为#54aeed -->
<div
v-if=
"index
< timeLineDataList1
.
length
-
1
"
class=
"time_item_line"
:style=
"
{
borderLeftColor: !compareTime(
timeLineDataList1[index + 1].milestoneTime
)
? '#8a8a8a'
: '#54aeed',
}"
>
</div>
</div>
<div
class=
"time_item_right"
>
<div>
{{
item
.
milestoneTime
}}
</div>
</div>
</div>
</div>
</el-card>
</div>
<div
style=
"flex: 1"
>
<el-card
style=
"height: 100%"
>
<div
style=
"background-color: #0d867f; color: #fff; font-size: 18px"
>
项目实际里程碑
</div>
<div
class=
"time_line_wrap"
>
<div
v-for=
"(item, index) in timeLineDataList2"
:key=
"index"
style=
"display: flex; flex-direction: row; width: 100%"
>
<div
class=
"time_item_left"
>
<div>
{{
item
.
milestoneName
}}
</div>
</div>
<div
class=
"time_item_center"
>
<!-- status: 1 完成 ,2 异常 , 3 未到达 -->
<div
v-if=
"compareTime(item.milestoneTime)"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #54aeed',
background: '#54aeed',
}"
>
</div>
<div
v-if=
"!compareTime(item.milestoneTime)"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #8a8a8a',
background: '#8a8a8a',
}"
>
</div>
<div
v-if=
"item.milestoneTime == null"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #eba84b',
background: '#eba84b',
}"
>
</div>
<!--
<div
v-if=
"item.status == 1"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #54aeed',
background: '#54aeed',
}"
>
</div>
<div
v-if=
"item.status == 2"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #eba84b',
background: '#eba84b',
}"
>
</div>
<div
v-if=
"item.status == 3"
class=
"time_item_dot"
:style=
"
{ border: '2px solid #8a8a8a' }"
>
</div>
-->
<!-- 线条颜色逻辑: 判断当前节点的下一个节点的状态,如果status === 3,未到达,则当前节点的线条为#8a8a8a,否则当前节点线条为#54aeed -->
<div
v-if=
"index
< timeLineDataList2
.
length
-
1
"
class=
"time_item_line"
:style=
"
{
borderLeftColor: !compareTime(
timeLineDataList2[index + 1].milestoneTime
)
? '#8a8a8a'
: '#54aeed',
}"
>
</div>
</div>
<div
class=
"time_item_right"
>
<div>
{{
item
.
milestoneTime
}}
</div>
</div>
</div>
</div>
</el-card>
</div>
</div>
</el-dialog>
</div>
</
template
>
<
script
>
// import{kkk}from "@/static/web/viewer.mjs"
import
{
milestonesGetList
,
}
from
"@/api/indexzc"
;
import
{
selWtqdFZ
,
selFile
,
downloadObject
,
...
...
@@ -252,6 +439,36 @@ import { Loading } from 'element-ui';
export
default
{
data
()
{
return
{
timeLineDataList1
:
[
// {
// milestoneTime: "2021-10",
// milestoneName: "中标日期",
// status: 1,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "合同生效日期",
// status: 1,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "启动计划开始日期",
// status: 2,
// },
],
timeLineDataList2
:
[
// {
// milestoneTime: "2021-10",
// milestoneName: "启动实际结束日期",
// status: 1,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "系统开发实际结束日期",
// status: 1,
// },
],
showMilestone
:
false
,
resimg
:
''
,
dialogFullScreen
:
false
,
valuesel
:
''
,
...
...
@@ -311,11 +528,113 @@ export default {
}
},
mounted
()
{
this
.
getMilestonesList
();
this
.
clqparams
=
JSON
.
parse
(
this
.
$route
.
query
.
clqparams
)
this
.
projectName
=
this
.
$route
.
query
.
projectName
this
.
init
(
this
.
clqparams
)
},
methods
:
{
compareTime
(
time
)
{
const
date
=
new
Date
(
time
).
setHours
(
0
,
0
,
0
,
0
);
const
today
=
new
Date
().
setHours
(
0
,
0
,
0
,
0
);
return
date
<=
today
;
// 头一天或者当天
},
async
getMilestonesList
()
{
const
{
projectId
,
contractNumber
}
=
JSON
.
parse
(
this
.
$route
.
query
.
clqparams
);
const
params
=
{
projectCode
:
projectId
,
contractNumber
:
contractNumber
// projectCode: "7322XT23005C", // projectId
// contractNumber: "SGLNXT00DKXX2310552", // contractNumber
};
const
res
=
await
milestonesGetList
(
params
);
if
(
res
.
data
.
code
===
200
)
{
// const mockdata = {
// code: 200,
// msg: "操作成功!",
// data: {
// dataList2: [
// {
// milestoneName: "启动实际结束日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "成果评审实际结束日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "试运行验收实际结束日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "结算实际结束日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "决算实际结束日期",
// milestoneTime: "2025-12-31",
// },
// {
// milestoneName: "转资实际结束日期",
// milestoneTime: "2025-12-31",
// },
// ],
// dataList1: [
// {
// milestoneName: "中标日期",
// milestoneTime: "2023-11-10",
// },
// {
// milestoneName: "合同生效日期",
// milestoneTime: "2023-12-06",
// },
// {
// milestoneName: "启动计划开始日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "成果评审计划开始日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "竣工验收计划开始日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "结算计划开始日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "决算计划开始日期",
// milestoneTime: "2025-12-31",
// },
// {
// milestoneName: "转资计划开始日期",
// milestoneTime: "2025-12-31",
// },
// ],
// },
// failed: false,
// };
const
{
dataList1
,
dataList2
}
=
res
.
data
.
data
;
dataList1
.
forEach
((
item
,
index
)
=>
{
item
[
"key"
]
=
index
+
1
;
});
dataList2
.
forEach
((
item
,
index
)
=>
{
item
[
"key"
]
=
index
+
1
;
});
console
.
log
(
66666
,
dataList1
,
dataList2
);
this
.
timeLineDataList1
=
dataList1
;
this
.
timeLineDataList2
=
dataList2
;
}
else
{
this
.
$message
.
error
(
res
.
data
.
msg
)
}
},
showMilestoneDialog
()
{
this
.
showMilestone
=
true
;
},
zhanshi
()
{
this
.
dialogzhanshi
=
true
},
...
...
@@ -832,6 +1151,49 @@ export default {
}
</
script
>
<
style
lang=
"scss"
>
.time_line_wrap
{
display
:
flex
;
flex-direction
:
column
;
align-items
:
center
;
position
:
relative
;
padding
:
20px
10px
;
}
.time_item_left
{
margin-bottom
:
24px
;
margin-top
:
1px
;
flex
:
60
;
text-align
:
end
;
}
.time_item_center
{
display
:
flex
;
flex-direction
:
column
;
align-items
:
center
;
padding
:
0
12px
;
}
.time_item_right
{
margin-bottom
:
24px
;
margin-top
:
2px
;
flex
:
40
;
text-align
:
left
;
}
.time_item_line
{
position
:
relative
;
height
:
calc
(
100%
-
18px
);
min-height
:
20px
;
border-left-width
:
2px
;
//
border-left-color
:
#f2f2f3
;
border-left-style
:
solid
;
}
.time_item_dot
{
//
border
:
2px
solid
#babbc0
;
border-radius
:
50%
;
width
:
18px
;
height
:
18px
;
flex-shrink
:
0
;
}
</
style
>
<
style
lang=
"scss"
scoped
>
.main
{
font-size
:
14px
;
...
...
src/views/assessZC/checkCompliance.vue
View file @
4fc8e26
...
...
@@ -10,9 +10,16 @@
<div
class=
"top"
:class=
"dialogFullScreen ? 'noShow' : ''"
>
<el-button
type=
"primary"
class=
"working"
style=
"position: absolute; left: -170px"
@
click=
"showMilestoneDialog"
>
里程碑
</el-button
>
<el-button
type=
"primary"
style=
"position: absolute; left: -80px"
@
click=
"working('work')"
>
智能分析
</el-button>
>
智能分析
</el-button
>
<el-steps
:active=
"active"
align-center
finish-status=
"success"
>
<el-step
v-for=
"item in tabList"
...
...
@@ -25,8 +32,7 @@
<div
class=
"content"
>
<div
class=
"left flex-column"
>
<p
class=
"tableTitle"
>
检查内容
检查内容
<i
class=
"el-icon-full-screen"
@
click=
"zoomViewDialog"
></i>
</p>
<el-tabs
v-model=
"activeName"
@
tab-click=
"handleClick"
>
<el-tab-pane
...
...
@@ -52,38 +58,86 @@
</el-select>
</div>
<!--
<div
class=
"pdf-container"
v-if=
"blobType === 'pdf' || (blobType === 'doc' && options.length > 0)"
>
<div
class=
"pdf-controls"
>
<el-button
type=
"primary"
@
click=
"downloadPdf"
>
下载 PDF
</el-button>
<el-button
type=
"warning"
@
click=
"zoomIn"
>
放大
</el-button>
</div>
<iframe
ref=
"pdfIframe"
:key=
"iframeUrl"
:src=
"iframeUrl"
frameborder=
"0"
:class=
"dialogFullScreen ? 'iframeDivBig' : 'iframeDiv'"
></iframe>
</div>
-->
<iframe
v-if=
"blobType == 'pdf' || (blobType == 'doc' && options.length > 0)"
v-if=
"
blobType == 'pdf' || (blobType == 'doc' && options.length > 0)
"
:key=
"iframeUrl"
:src=
"iframeUrl"
frameborder=
"0"
:class=
"dialogFullScreen ? 'iframeDivBig' : 'iframeDiv'"
></iframe>
<div
v-else-if=
"blobType == 'png' || blobType == 'jpg'"
class=
"blobImg"
>
<div
v-else-if=
"blobType == 'png' || blobType == 'jpg'"
class=
"blobImg"
>
<img
:src=
"iframeUrl"
alt=
""
/>
</div>
<div
class=
"docDiv"
v-else-if=
"blobType == 'docx' && options.length > 0"
>
<div
class=
"docDiv"
v-else-if=
"blobType == 'docx' && options.length > 0"
>
<div
:ref=
"`word`"
:id=
"`word$
{item.typeCode}`">
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
<div
class=
"right flex-column"
>
<p
class=
"tableTitle"
>
检查项
<i
class=
"el-icon-full-screen"
@
click=
"dialogFullScreen = !dialogFullScreen"
></i></p>
<p
class=
"tableTitle"
>
检查项
<i
class=
"el-icon-full-screen"
@
click=
"dialogFullScreen = !dialogFullScreen"
></i>
</p>
<div
:class=
"dialogFullScreen ? 'rightscollBig' : 'rightscoll'"
>
<div
class=
"rightContent"
v-for=
"item in questionList"
:key=
"item.questionId"
>
<h3>
{{
item
.
questionId
}}
.
{{
item
.
quesCheckItem
}}
<el-tooltip
class=
"item"
effect=
"dark"
:content=
"item.checkDesc"
placement=
"right-end"
>
<i
class=
"el-icon-info"
></i></el-tooltip>
</h3>
<div
class=
"rightContent"
v-for=
"item in questionList"
:key=
"item.questionId"
>
<h3>
{{
item
.
questionId
}}
.
{{
item
.
quesCheckItem
}}
<el-tooltip
v-if=
"item.checkDesc !== ''"
class=
"item"
effect=
"dark"
:content=
"item.checkDesc"
placement=
"right-end"
>
<i
class=
"el-icon-info"
></i
></el-tooltip>
</h3>
<p
class=
"msg"
>
<!--
{{
item
.
checkDesc
}}
-->
<el-button
type=
"primary"
v-if=
"item.checkDesc == '可研中的需求内容应与业务需求报告中的需求匹配' && wtmx"
@
click=
"zhanshi()"
v-if=
"
item.checkDesc ==
'可研中的需求内容应与业务需求报告中的需求匹配' && wtmx
"
@
click=
"zanShi()"
>
匹配展示
</el-button
>
</p>
<div
class=
"quesznfx"
v-if=
"item.znfxList && item.znfxList.length > 0"
>
<div
class=
"quesznfx"
v-if=
"item.znfxList && item.znfxList.length > 0"
>
<p
class=
"tips"
>
智能分析:
</p>
<!--
<p>
{{
item
.
znfxList
[
0
].
projectStage
}}
</p>
-->
...
...
@@ -115,9 +169,16 @@
</span>
</span>
</div>
<div
class=
"quesznfx"
v-if=
"item.fzfxList && item.fzfxList.length > 0"
>
<div
class=
"quesznfx"
v-if=
"item.fzfxList && item.fzfxList.length > 0"
>
<p
class=
"tips"
>
辅助分析:
</p>
<div
v-for=
"(itemfz, index) in item.fzfxList"
:key=
"index"
class=
"inputDiv"
>
<div
v-for=
"(itemfz, index) in item.fzfxList"
:key=
"index"
class=
"inputDiv"
>
<el-input
type=
"textarea"
:autosize=
"
{ minRows: 1, maxRows: 4 }"
...
...
@@ -135,7 +196,11 @@
</div>
<div
class=
"question"
>
<p
class=
"tips"
>
问题描述:
</p>
<div
v-for=
"(items, index) in item.evalList"
:key=
"index"
class=
"inputDiv"
>
<div
v-for=
"(items, index) in item.evalList"
:key=
"index"
class=
"inputDiv"
>
<el-input
type=
"textarea"
:autosize=
"
{ minRows: 1, maxRows: 4 }"
...
...
@@ -144,7 +209,9 @@
:disabled="items.disabled"
>
</el-input
><el-button
@
click=
"delInput(item, index)"
type=
"primary"
>
删除
</el-button>
><el-button
@
click=
"delInput(item, index)"
type=
"primary"
>
删除
</el-button
>
<el-upload
class=
"upload_box"
...
...
@@ -154,7 +221,7 @@
:on-change="handleEditChange"
:http-request="
(res) => {
return fileupdate(res, items)
return fileupdate(res, items)
;
}
"
:before-upload="beforeAvatarUpload"
...
...
@@ -166,12 +233,21 @@
action=""
>
<!-- 加号标识 -->
<el-button
class=
"upload_btn"
slot=
"trigger"
size=
"small"
type=
"primary"
>
<el-button
class=
"upload_btn"
slot=
"trigger"
size=
"small"
type=
"primary"
>
上传截图
</el-button>
<!-- 上传后显示 -->
<div
slot=
"file"
slot-scope=
"
{ file }">
<img
class=
"el-upload-list__item-thumbnail"
:src=
"file.url"
alt=
""
/>
<img
class=
"el-upload-list__item-thumbnail"
:src=
"file.url"
alt=
""
/>
<span
class=
"el-upload-list__item-actions"
>
<!-- 图片放大 -->
<span
...
...
@@ -217,12 +293,12 @@
</div>
</div>
<p
class=
"Btn"
>
<span
@
click=
"cancel()"
>
取消
</span><span
@
click=
"save('3', active)"
>
保存
</span>
<span
@
click=
"cancel()"
>
取消
</span
><span
@
click=
"save('3', active)"
>
保存
</span>
<span
@
click=
"submitNexts()"
>
提交
</span>
</p>
</div>
</div>
<el-dialog
:visible
.
sync=
"dialogzhanshi"
title=
"匹配展示"
...
...
@@ -232,13 +308,250 @@
>
<div
v-html=
"wtmx"
class=
"dialogscroll"
></div>
</el-dialog>
<el-dialog
:visible
.
sync=
"showZoomViewDialog"
title=
"检查内容"
width=
"90%"
:modal-append-to-body=
"true"
:append-to-body=
"true"
:fullscreen=
"true"
>
<!-- TODO -->
<el-tabs
v-model=
"activeName"
@
tab-click=
"handleClick"
>
<el-tab-pane
v-for=
"item in tabListKY"
:key=
"item.typeText"
:label=
"item.typeText"
:name=
"item.typeCode"
>
<div
class=
"opt"
v-show=
"options.length > 0"
>
<el-select
v-model=
"valuesel"
clearable
placeholder=
"请选择"
@
change=
"(val) => changexm(val, item.typeCode)"
>
<el-option
v-for=
"(item, index) in options"
:key=
"item.name"
:label=
"item.name"
:value=
"index"
>
</el-option>
</el-select>
</div>
<iframe
v-if=
"
blobType == 'pdf' || (blobType == 'doc' && options.length > 0)
"
:key=
"iframeUrl"
:src=
"iframeUrl"
frameborder=
"0"
:class=
"dialogFullScreen ? 'iframeDivBig' : 'iframeDiv'"
></iframe>
<div
v-else-if=
"blobType == 'png' || blobType == 'jpg'"
class=
"blobImg"
>
<img
:src=
"iframeUrl"
alt=
""
/>
</div>
<div
class=
"docDiv"
v-else-if=
"blobType == 'docx' && options.length > 0"
>
<div
:ref=
"`word`"
:id=
"`word$
{item.typeCode}`">
</div>
</div>
</el-tab-pane>
</el-tabs>
<!-- TODO -->
</el-dialog>
<el-dialog
:visible
.
sync=
"showMilestone"
title=
"项目里程碑"
width=
"90%"
:modal-append-to-body=
"false"
:append-to-body=
"false"
>
<div
style=
"height: 65vh; display: flex; flex-direction: row; gap: 10px"
>
<div
style=
"flex: 1"
>
<el-card
style=
"height: 100%"
>
<div
style=
"background-color: #0d867f; color: #fff; font-size: 18px"
>
项目计划里程碑
</div>
<div
class=
"time_line_wrap"
>
<div
v-for=
"(item, index) in timeLineDataList1"
:key=
"index"
style=
"display: flex; flex-direction: row; width: 100%"
>
<div
class=
"time_item_left"
>
<div>
{{
item
.
milestoneName
}}
</div>
</div>
<div
class=
"time_item_center"
>
<!-- status: 1 完成 ,2 异常 , 3 未到达 -->
<div
v-if=
"compareTime(item.milestoneTime)"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #54aeed',
background: '#54aeed',
}"
>
</div>
<div
v-if=
"!compareTime(item.milestoneTime)"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #8a8a8a',
background: '#8a8a8a',
}"
>
</div>
<div
v-if=
"item.milestoneTime == null"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #eba84b',
background: '#eba84b',
}"
>
</div>
<!--
<div
v-if=
"item.status == 1"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #54aeed',
background: '#54aeed',
}"
>
</div>
<div
v-if=
"item.status == 2"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #eba84b',
background: '#eba84b',
}"
>
</div>
<div
v-if=
"item.status == 3"
class=
"time_item_dot"
:style=
"
{ border: '2px solid #8a8a8a' }"
>
</div>
-->
<!-- 线条颜色逻辑: 判断当前节点的下一个节点的状态,如果status === 3,未到达,则当前节点的线条为#8a8a8a,否则当前节点线条为#54aeed -->
<div
v-if=
"index
< timeLineDataList1
.
length
-
1
"
class=
"time_item_line"
:style=
"
{
borderLeftColor: !compareTime(
timeLineDataList1[index + 1].milestoneTime
)
? '#8a8a8a'
: '#54aeed',
}"
>
</div>
</div>
<div
class=
"time_item_right"
>
<div>
{{
item
.
milestoneTime
}}
</div>
</div>
</div>
</div>
</el-card>
</div>
<div
style=
"flex: 1"
>
<el-card
style=
"height: 100%"
>
<div
style=
"background-color: #0d867f; color: #fff; font-size: 18px"
>
项目实际里程碑
</div>
<div
class=
"time_line_wrap"
>
<div
v-for=
"(item, index) in timeLineDataList2"
:key=
"index"
style=
"display: flex; flex-direction: row; width: 100%"
>
<div
class=
"time_item_left"
>
<div>
{{
item
.
milestoneName
}}
</div>
</div>
<div
class=
"time_item_center"
>
<!-- status: 1 完成 ,2 异常 , 3 未到达 -->
<div
v-if=
"compareTime(item.milestoneTime)"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #54aeed',
background: '#54aeed',
}"
>
</div>
<div
v-if=
"!compareTime(item.milestoneTime)"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #8a8a8a',
background: '#8a8a8a',
}"
>
</div>
<div
v-if=
"item.milestoneTime == null"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #eba84b',
background: '#eba84b',
}"
>
</div>
<!--
<div
v-if=
"item.status == 1"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #54aeed',
background: '#54aeed',
}"
>
</div>
<div
v-if=
"item.status == 2"
class=
"time_item_dot"
:style=
"
{
border: '2px solid #eba84b',
background: '#eba84b',
}"
>
</div>
<div
v-if=
"item.status == 3"
class=
"time_item_dot"
:style=
"
{ border: '2px solid #8a8a8a' }"
>
</div>
-->
<!-- 线条颜色逻辑: 判断当前节点的下一个节点的状态,如果status === 3,未到达,则当前节点的线条为#8a8a8a,否则当前节点线条为#54aeed -->
<div
v-if=
"index
< timeLineDataList2
.
length
-
1
"
class=
"time_item_line"
:style=
"
{
borderLeftColor: !compareTime(
timeLineDataList2[index + 1].milestoneTime
)
? '#8a8a8a'
: '#54aeed',
}"
>
</div>
</div>
<div
class=
"time_item_right"
>
<div>
{{
item
.
milestoneTime
}}
</div>
</div>
</div>
</div>
</el-card>
</div>
</div>
</el-dialog>
</div>
</
template
>
<
script
>
import
{
Loading
}
from
'element-ui'
;
import
{
Loading
}
from
"element-ui"
;
// import{kkk}from "@/static/web/viewer.mjs"
import
{
milestonesGetList
,
selWtqdFZ
,
selFile
,
downloadObject
,
...
...
@@ -248,54 +561,189 @@ import {
ossupload
,
presignedUrl
,
selFileList
,
}
from
'@/api/indexzc'
import
{
MaterialsListKY
}
from
'@/utils/cache'
}
from
"@/api/indexzc"
;
import
{
MaterialsListKY
}
from
"@/utils/cache"
;
export
default
{
data
()
{
return
{
resimg
:
''
,
timeLineDataList1
:
[
// {
// milestoneTime: "2021-10",
// milestoneName: "中标日期",
// status: 1,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "合同生效日期",
// status: 1,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "启动计划开始日期",
// status: 2,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "系统开发计划开始日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "资源申请计划开始日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "第三方测试计划开始日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "架构审查计划开始日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "漏洞扫描计划开始日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "上线试运行计划开始日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "试运行验收计划开始日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "竣工验收计划开始日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "结算计划开始日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "决算计划开始日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "转资计划开始日期",
// status: 3,
// },
],
timeLineDataList2
:
[
// {
// milestoneTime: "2021-10",
// milestoneName: "启动实际结束日期",
// status: 1,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "系统开发实际结束日期",
// status: 1,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "资源申请实际结束日期",
// status: 2,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "第三方测试实际结束日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "架构审查实际结束日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "漏洞扫描实际结束日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "上线试运行实际结束日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "试运行验收实际结束日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "竣工验收实际结束日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "结算实际结束日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "决算实际结束日期",
// status: 3,
// },
// {
// milestoneTime: "2021-10",
// milestoneName: "转资实际结束日期",
// status: 3,
// },
],
showMilestone
:
false
,
resimg
:
""
,
dialogFullScreen
:
false
,
valuesel
:
''
,
valuesel
:
""
,
options
:
[],
dialogImageUrl
:
''
,
dialogImageUrl
:
""
,
fileList
:
[],
evalList
:
[
{
evalQues
:
''
,
evalQues
:
""
,
hideUploadEdit
:
false
,
},
],
tabList
:
[
{
label
:
'可研'
,
id
:
0
},
{
label
:
"可研"
,
id
:
0
},
// { label: "计划", id: 1 },
{
label
:
'采购'
,
id
:
2
},
{
label
:
'合同'
,
id
:
3
},
{
label
:
'执行'
,
id
:
4
},
{
label
:
'结决算及转资'
,
id
:
5
},
{
label
:
"采购"
,
id
:
2
},
{
label
:
"合同"
,
id
:
3
},
{
label
:
"执行"
,
id
:
4
},
{
label
:
"结决算及转资"
,
id
:
5
},
],
tabListKY
:
[],
active
:
0
,
activeName
:
'0'
,
activeName
:
"0"
,
clqparams
:
{},
iframeUrl
:
''
,
iframeUrl
:
""
,
urlList
:
[],
questionList
:
[],
file
:
''
,
file
:
""
,
dialogVisible
:
false
,
fullURL
:
''
,
fullURL
:
""
,
hideUploadEdit
:
false
,
limitNum
:
1
,
disabled
:
false
,
oldQuestionList
:
[],
//对比列表
blobType
:
'pdf'
,
//bolb类型
projectName
:
''
,
valuesel
:
''
,
blobType
:
"pdf"
,
//bolb类型
projectName
:
""
,
valuesel
:
""
,
dialogzhanshi
:
false
,
wtmx
:
''
,
hgx
:
""
,
wtmx
:
""
,
hgx
:
""
,
showZoomViewDialog
:
false
,
docxOptions
:
{
className
:
'kaimo-docx-666'
,
// string:默认和文档样式类的类名/前缀
className
:
"kaimo-docx-666"
,
// string:默认和文档样式类的类名/前缀
inWrapper
:
false
,
// boolean:启用围绕文档内容的包装器渲染
ignoreWidth
:
false
,
// boolean:禁用页面的渲染宽度
ignoreHeight
:
false
,
// boolean:禁止渲染页面高度
...
...
@@ -309,523 +757,727 @@ export default {
showChanges
:
false
,
// boolean:启用文档更改的实验性渲染(插入/删除)
debug
:
false
,
// boolean:启用额外的日志记录
},
}
}
;
},
mounted
()
{
this
.
clqparams
=
JSON
.
parse
(
this
.
$route
.
query
.
clqparams
)
this
.
projectName
=
this
.
$route
.
query
.
projectName
this
.
init
(
this
.
clqparams
)
this
.
getMilestonesList
();
this
.
clqparams
=
JSON
.
parse
(
this
.
$route
.
query
.
clqparams
);
this
.
projectName
=
this
.
$route
.
query
.
projectName
;
this
.
init
(
this
.
clqparams
);
},
methods
:
{
zhanshi
()
{
this
.
dialogzhanshi
=
true
compareTime
(
time
)
{
const
date
=
new
Date
(
time
).
setHours
(
0
,
0
,
0
,
0
);
const
today
=
new
Date
().
setHours
(
0
,
0
,
0
,
0
);
return
date
<=
today
;
// 头一天或者当天
},
async
getMilestonesList
()
{
const
{
projectId
,
contractNumber
}
=
JSON
.
parse
(
this
.
$route
.
query
.
clqparams
);
const
params
=
{
projectCode
:
projectId
,
contractNumber
:
contractNumber
// projectCode: "7322XT23005C", // projectId
// contractNumber: "SGLNXT00DKXX2310552", // contractNumber
};
const
res
=
await
milestonesGetList
(
params
);
if
(
res
.
data
.
code
===
200
)
{
// const mockdata = {
// code: 200,
// msg: "操作成功!",
// data: {
// dataList2: [
// {
// milestoneName: "启动实际结束日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "成果评审实际结束日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "试运行验收实际结束日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "结算实际结束日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "决算实际结束日期",
// milestoneTime: "2025-12-31",
// },
// {
// milestoneName: "转资实际结束日期",
// milestoneTime: "2025-12-31",
// },
// ],
// dataList1: [
// {
// milestoneName: "中标日期",
// milestoneTime: "2023-11-10",
// },
// {
// milestoneName: "合同生效日期",
// milestoneTime: "2023-12-06",
// },
// {
// milestoneName: "启动计划开始日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "成果评审计划开始日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "竣工验收计划开始日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "结算计划开始日期",
// milestoneTime: "2024-12-31",
// },
// {
// milestoneName: "决算计划开始日期",
// milestoneTime: "2025-12-31",
// },
// {
// milestoneName: "转资计划开始日期",
// milestoneTime: "2025-12-31",
// },
// ],
// },
// failed: false,
// };
const
{
dataList1
,
dataList2
}
=
res
.
data
.
data
;
dataList1
.
forEach
((
item
,
index
)
=>
{
item
[
"key"
]
=
index
+
1
;
});
dataList2
.
forEach
((
item
,
index
)
=>
{
item
[
"key"
]
=
index
+
1
;
});
console
.
log
(
66666
,
dataList1
,
dataList2
);
this
.
timeLineDataList1
=
dataList1
;
this
.
timeLineDataList2
=
dataList2
;
}
else
{
this
.
$message
.
error
(
res
.
data
.
msg
)
}
},
showMilestoneDialog
()
{
this
.
showMilestone
=
true
;
},
zoomViewDialog
()
{
this
.
showZoomViewDialog
=
true
;
},
downloadPdf
()
{
const
link
=
document
.
createElement
(
"a"
);
link
.
href
=
this
.
iframeUrl
;
link
.
download
=
"document.pdf"
;
link
.
click
();
},
zoomIn
()
{
const
iframe
=
this
.
$refs
.
pdfIframe
[
0
];
const
pdfWindow
=
iframe
.
contentWindow
;
console
.
log
(
"pdfWindow"
,
iframe
,
pdfWindow
);
// 假设 PDF.js 已经加载并且可以访问
if
(
pdfWindow
.
PDFViewerApplication
)
{
pdfWindow
.
PDFViewerApplication
.
zoomIn
();
// 调用 PDF.js 的放大方法
}
else
{
console
.
error
(
"PDF.js is not loaded."
);
window
.
open
(
this
.
iframeUrl
);
}
},
zanShi
()
{
this
.
dialogzhanshi
=
true
;
},
//提交问题清单
async
submitNexts
()
{
this
.
$confirm
(
'您确定检查完所有流程并去提交?'
,
'提示'
,
{
confirmButtonText
:
'是'
,
cancelButtonText
:
'继续检查'
,
this
.
$confirm
(
"您确定检查完所有流程并去提交?"
,
"提示"
,
{
confirmButtonText
:
"是"
,
cancelButtonText
:
"继续检查"
,
distinguishCancelAndClose
:
true
,
type
:
'warning'
,
type
:
"warning"
,
})
.
then
(()
=>
{
this
.
save
(
2
)
this
.
save
(
2
)
;
})
.
catch
((
action
)
=>
{})
.
catch
((
action
)
=>
{})
;
},
// 放大图片
handlePictureCardPreview
(
file
)
{
console
.
log
(
'点击放大'
)
this
.
dialogImageUrl
=
file
this
.
dialogVisible
=
true
console
.
log
(
"点击放大"
);
this
.
dialogImageUrl
=
file
;
this
.
dialogVisible
=
true
;
},
// 删除图片
handleRemove
(
file
,
fileList
)
{
console
.
log
(
fileList
,
'this.fileList'
)
console
.
log
(
fileList
,
"this.fileList"
);
if
(
this
.
fileList
.
length
==
0
)
{
this
.
fileList
=
[]
this
.
fileList
=
[]
;
}
else
{
let
dl
=
this
.
fileList
.
indexOf
(
file
)
this
.
fileList
.
splice
(
dl
,
1
)
let
dl
=
this
.
fileList
.
indexOf
(
file
)
;
this
.
fileList
.
splice
(
dl
,
1
)
;
}
this
.
hideUploadEdit
=
this
.
fileList
.
length
>=
this
.
limitNum
this
.
hideUploadEdit
=
this
.
fileList
.
length
>=
this
.
limitNum
;
},
// on-change添加文件,上传成功和上传失败时都会被调用
handleEditChange
(
file
,
fileList
)
{
this
.
hideUploadEdit
=
fileList
.
length
>=
this
.
limitNum
this
.
hideUploadEdit
=
fileList
.
length
>=
this
.
limitNum
;
},
// http-request自定义上传
ImgUploadSectionFile
(
param
)
{
this
.
param
=
param
this
.
param
=
param
;
},
// before-upload上传文件之前的钩子,参数为上传的文件
// 若返回 false 或者返回 Promise 且被 reject,则停止上传
beforeAvatarUpload
(
file
)
{
this
.
file
=
file
const
isJPG
=
file
.
type
===
'image/jpeg'
||
file
.
type
===
'image/png'
const
isLt2M
=
this
.
file
.
size
/
1024
<
1000
console
.
log
(
this
.
file
.
size
/
1024
,
'this.file.size this.file.size '
)
this
.
file
=
file
;
const
isJPG
=
file
.
type
===
"image/jpeg"
||
file
.
type
===
"image/png"
;
const
isLt2M
=
this
.
file
.
size
/
1024
<
1000
;
console
.
log
(
this
.
file
.
size
/
1024
,
"this.file.size this.file.size "
);
if
(
!
isJPG
)
{
this
.
$message
.
error
(
'上传图片只能是 JPG 或 PNG 格式!'
)
this
.
hideUploadEdit
=
false
this
.
$message
.
error
(
"上传图片只能是 JPG 或 PNG 格式!"
);
this
.
hideUploadEdit
=
false
;
}
if
(
!
isLt2M
)
{
this
.
hideUploadEdit
=
false
this
.
$message
.
error
(
'上传图片大小不能超过 1000k!'
)
this
.
hideUploadEdit
=
false
;
this
.
$message
.
error
(
"上传图片大小不能超过 1000k!"
);
}
return
isJPG
&&
isLt2M
return
isJPG
&&
isLt2M
;
},
// 文件上传成功时的钩子
handleSuccess
(
file
)
{
// console.log(file);
const
data
=
file
.
data
const
data
=
file
.
data
;
//然后数据、逻辑处理
},
showFullScreen
()
{
console
.
log
(
this
.
fileList
,
'4444'
)
this
.
fullURL
=
this
.
fileList
[
0
].
url
this
.
dialogVisible
=
true
console
.
log
(
this
.
fileList
,
"4444"
);
this
.
fullURL
=
this
.
fileList
[
0
].
url
;
this
.
dialogVisible
=
true
;
},
handleExceed
()
{
this
.
$message
.
warning
(
`只能选择一张图片`
)
this
.
$message
.
warning
(
`只能选择一张图片`
)
;
},
changexm
(
row
,
typeCode
)
{
this
.
downloadObject
(
this
.
options
[
row
],
typeCode
)
console
.
log
(
row
,
'换文件'
)
this
.
downloadObject
(
this
.
options
[
row
],
typeCode
)
;
console
.
log
(
row
,
"换文件"
);
},
async
init
(
type
)
{
let
params
=
{
projectStage
:
this
.
active
*
1
+
1
,
...
type
,
}
}
;
Promise
.
all
([
selFile
(
params
),
selWtqdFZ
(
params
)]).
then
(
async
(
res
)
=>
{
this
.
tabListKY
=
[]
this
.
urlList
=
res
[
0
].
data
this
.
tabListKY
=
[]
;
this
.
urlList
=
res
[
0
].
data
;
if
(
this
.
urlList
.
length
>
0
)
{
this
.
urlList
.
forEach
((
item
)
=>
{
this
.
tabListKY
.
push
({
typeText
:
item
.
materialName
,
typeCode
:
item
.
mid
,
})
})
this
.
activeName
=
this
.
tabListKY
[
0
].
typeCode
})
;
})
;
this
.
activeName
=
this
.
tabListKY
[
0
].
typeCode
;
let
resList
=
await
selFileList
({
...
params
,
typeCode
:
this
.
tabListKY
[
0
].
typeCode
,
})
this
.
options
=
resList
.
data
||
[]
})
;
this
.
options
=
resList
.
data
||
[]
;
if
(
this
.
options
.
length
>
0
)
{
this
.
valuesel
=
this
.
options
[
0
].
name
this
.
downloadObject
(
this
.
options
[
0
],
this
.
tabListKY
[
0
].
typeCode
)
this
.
valuesel
=
this
.
options
[
0
].
name
;
this
.
downloadObject
(
this
.
options
[
0
],
this
.
tabListKY
[
0
].
typeCode
)
;
}
else
{
this
.
blobType
=
'png'
this
.
iframeUrl
=
'/nopdf.png'
this
.
blobType
=
"png"
;
this
.
iframeUrl
=
"/nopdf.png"
;
}
}
if
(
res
[
1
].
data
)
{
this
.
questionList
=
res
[
1
].
data
.
records
this
.
wtmx
=
res
[
1
].
data
.
MapkyXqfx
let
counterNum
=
0
this
.
questionList
=
res
[
1
].
data
.
records
;
this
.
wtmx
=
res
[
1
].
data
.
MapkyXqfx
;
let
counterNum
=
0
;
this
.
questionList
.
forEach
(
async
(
item
)
=>
{
if
(
item
.
isProblem
==
0
)
{
this
.
$set
(
item
,
'checked'
,
true
)
this
.
changeChecked
(
item
)
this
.
$set
(
item
,
"checked"
,
true
);
this
.
changeChecked
(
item
)
;
}
let
respon
=
await
selWtmx
({
qid
:
item
.
qid
})
let
respon
=
await
selWtmx
({
qid
:
item
.
qid
})
;
counterNum
++
counterNum
++
;
if
(
respon
.
data
.
records
&&
respon
.
data
.
records
.
length
>
0
)
{
respon
.
data
.
records
.
forEach
(
async
(
itemImg
)
=>
{
if
(
itemImg
.
url
)
{
let
paramsImg
=
{
fileId
:
itemImg
.
id
,
url
:
itemImg
.
url
,
}
let
resUrl
=
await
presignedUrl
(
paramsImg
)
this
.
$set
(
itemImg
,
'fileList'
,
[
}
;
let
resUrl
=
await
presignedUrl
(
paramsImg
)
;
this
.
$set
(
itemImg
,
"fileList"
,
[
{
url
:
resUrl
.
msg
,
},
])
itemImg
.
hideUploadEdit
=
true
])
;
itemImg
.
hideUploadEdit
=
true
;
}
else
{
itemImg
.
hideUploadEdit
=
false
itemImg
.
hideUploadEdit
=
false
;
}
})
this
.
$set
(
item
,
'evalList'
,
[...
respon
.
data
.
records
])
})
;
this
.
$set
(
item
,
"evalList"
,
[...
respon
.
data
.
records
]);
}
else
{
this
.
$set
(
item
,
'evalList'
,
[
this
.
$set
(
item
,
"evalList"
,
[
{
evalQues
:
''
,
evalQues
:
""
,
hideUploadEdit
:
false
,
},
])
])
;
}
if
(
counterNum
==
this
.
questionList
.
length
)
{
setTimeout
(()
=>
{
this
.
oldQuestionList
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
questionList
))
},
300
)
this
.
oldQuestionList
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
questionList
)
);
},
300
);
}
})
})
;
}
})
})
;
},
working
(
type
){
let
options
=
{
working
(
type
)
{
let
options
=
{
fullscreen
:
true
,
spinner
:
'el-icon-loading'
,
customClass
:
'iam-loading'
,
text
:
"智能分析中,请耐心等候..."
,
//显示在加载图标下方的加载文案
background
:
'rgba(0,0,0,.7)'
,
//遮罩背景色
}
spinner
:
"el-icon-loading"
,
customClass
:
"iam-loading"
,
text
:
"智能分析中,请耐心等候..."
,
//显示在加载图标下方的加载文案
background
:
"rgba(0,0,0,.7)"
,
//遮罩背景色
};
console
.
log
(
2222
,
this
.
clqparams
);
let
params
=
{
projectStage
:
this
.
active
*
1
+
1
,
// hgx: 'hgx',
...
this
.
clqparams
,
}
let
loadingInstance
=
''
;
if
(
type
==
'work'
)
{
this
.
hgx
=
'hgx'
}
;
let
loadingInstance
=
""
;
if
(
type
==
"work"
)
{
this
.
hgx
=
"hgx"
;
loadingInstance
=
Loading
.
service
(
options
);
}
if
(
this
.
hgx
=
'hgx'
)
{
params
.
hgx
=
'hgx'
if
((
this
.
hgx
=
"hgx"
))
{
params
.
hgx
=
"hgx"
;
}
console
.
log
(
111111
,
params
);
Promise
.
all
([
selFile
(
params
),
selWtqdFZ
(
params
)]).
then
(
async
(
res
)
=>
{
this
.
$nextTick
(()
=>
{
// 以服务的方式调用的 Loading 需要异步关闭
if
(
type
==
'work'
){
console
.
log
(
'走了关闭'
)
this
.
$nextTick
(()
=>
{
// 以服务的方式调用的 Loading 需要异步关闭
if
(
type
==
"work"
)
{
console
.
log
(
"走了关闭"
);
loadingInstance
.
close
();
}
});
this
.
tabListKY
=
[]
this
.
urlList
=
res
[
0
].
data
this
.
tabListKY
=
[]
;
this
.
urlList
=
res
[
0
].
data
;
if
(
this
.
urlList
.
length
>
0
)
{
this
.
urlList
.
forEach
((
item
)
=>
{
this
.
tabListKY
.
push
({
typeText
:
item
.
materialName
,
typeCode
:
item
.
mid
,
})
})
this
.
activeName
=
this
.
tabListKY
[
0
].
typeCode
})
;
})
;
this
.
activeName
=
this
.
tabListKY
[
0
].
typeCode
;
let
resList
=
await
selFileList
({
...
params
,
typeCode
:
this
.
tabListKY
[
0
].
typeCode
,
})
this
.
options
=
resList
.
data
||
[]
})
;
this
.
options
=
resList
.
data
||
[]
;
if
(
this
.
options
.
length
>
0
)
{
this
.
valuesel
=
this
.
options
[
0
].
name
this
.
downloadObject
(
this
.
options
[
0
],
this
.
tabListKY
[
0
].
typeCode
)
this
.
valuesel
=
this
.
options
[
0
].
name
;
this
.
downloadObject
(
this
.
options
[
0
],
this
.
tabListKY
[
0
].
typeCode
)
;
}
else
{
this
.
blobType
=
'png'
this
.
iframeUrl
=
'/nopdf.png'
this
.
blobType
=
"png"
;
this
.
iframeUrl
=
"/nopdf.png"
;
}
}
else
{
// this.iframeUrl = "/nopdf.png";
}
if
(
res
[
1
].
data
)
{
this
.
questionList
=
res
[
1
].
data
.
records
this
.
wtmx
=
res
[
1
].
data
.
MapkyXqfx
let
counterNum
=
0
this
.
questionList
=
res
[
1
].
data
.
records
;
this
.
wtmx
=
res
[
1
].
data
.
MapkyXqfx
;
let
counterNum
=
0
;
this
.
questionList
.
forEach
(
async
(
item
)
=>
{
if
(
item
.
isProblem
==
0
)
{
this
.
$set
(
item
,
'checked'
,
true
)
this
.
changeChecked
(
item
)
this
.
$set
(
item
,
"checked"
,
true
);
this
.
changeChecked
(
item
)
;
}
let
respon
=
await
selWtmx
({
qid
:
item
.
qid
})
let
respon
=
await
selWtmx
({
qid
:
item
.
qid
})
;
let
paramsFX
=
{
batchId
:
this
.
clqparams
.
batchId
,
projectId
:
this
.
clqparams
.
projectId
,
projectStage
:
item
.
questionId
,
}
let
responfx
=
await
selZnfx
(
paramsFX
)
counterNum
++
}
;
let
responfx
=
await
selZnfx
(
paramsFX
)
;
counterNum
++
;
if
(
respon
.
data
.
records
&&
respon
.
data
.
records
.
length
>
0
)
{
respon
.
data
.
records
.
forEach
(
async
(
itemImg
)
=>
{
if
(
itemImg
.
url
)
{
let
paramsImg
=
{
fileId
:
itemImg
.
id
,
url
:
itemImg
.
url
,
}
let
resUrl
=
await
presignedUrl
(
paramsImg
)
this
.
$set
(
itemImg
,
'fileList'
,
[
}
;
let
resUrl
=
await
presignedUrl
(
paramsImg
)
;
this
.
$set
(
itemImg
,
"fileList"
,
[
{
url
:
resUrl
.
msg
,
},
])
itemImg
.
hideUploadEdit
=
true
])
;
itemImg
.
hideUploadEdit
=
true
;
}
else
{
itemImg
.
hideUploadEdit
=
false
itemImg
.
hideUploadEdit
=
false
;
}
})
this
.
$set
(
item
,
'evalList'
,
[...
respon
.
data
.
records
])
})
;
this
.
$set
(
item
,
"evalList"
,
[...
respon
.
data
.
records
]);
}
else
{
this
.
$set
(
item
,
'evalList'
,
[
this
.
$set
(
item
,
"evalList"
,
[
{
evalQues
:
''
,
evalQues
:
""
,
hideUploadEdit
:
false
,
},
])
])
;
}
if
(
responfx
.
data
.
records
&&
responfx
.
data
.
records
.
length
>
0
)
{
let
znfxList
=
responfx
.
data
.
records
.
filter
(
async
(
item
)
=>
{
if
(
item
.
projectStage
==
'14'
)
{
if
(
item
.
projectStage
==
"14"
)
{
let
paramsImg
=
{
url
:
item
.
checkDesc
,
}
let
resUrl
=
await
presignedUrl
(
paramsImg
)
}
;
let
resUrl
=
await
presignedUrl
(
paramsImg
)
;
this
.
resimg
=
resUrl
.
msg
this
.
resimg
=
resUrl
.
msg
;
}
if
(
item
.
checkDesc
&&
item
.
type
==
0
)
{
item
.
checkDesc
=
item
.
checkDesc
.
replace
(
/
\n
/g
,
'<br>'
)
item
.
checkDesc
=
item
.
checkDesc
.
replace
(
/
\n
/g
,
"<br>"
);
}
return
item
.
checkDesc
&&
item
.
type
==
0
})
this
.
$set
(
item
,
'znfxList'
,
[...
znfxList
])
return
item
.
checkDesc
&&
item
.
type
==
0
;
})
;
this
.
$set
(
item
,
"znfxList"
,
[...
znfxList
]);
let
resfxList
=
responfx
.
data
.
records
.
filter
((
item
)
=>
{
return
item
.
type
==
1
||
item
.
type
==
2
})
return
item
.
type
==
1
||
item
.
type
==
2
;
})
;
if
(
resfxList
&&
resfxList
.
length
>
0
)
{
let
fzfxList
=
resfxList
[
0
].
checkDesc
.
split
(
'\n'
)
this
.
$set
(
item
,
'fzfxList'
,
[...
fzfxList
])
let
fzfxList
=
resfxList
[
0
].
checkDesc
.
split
(
"\n"
);
this
.
$set
(
item
,
"fzfxList"
,
[...
fzfxList
]);
}
}
else
{
this
.
$set
(
item
,
'znfxList'
,
[])
this
.
$set
(
item
,
'fzfxList'
,
[])
this
.
$set
(
item
,
"znfxList"
,
[]);
this
.
$set
(
item
,
"fzfxList"
,
[]);
}
if
(
counterNum
==
this
.
questionList
.
length
)
{
setTimeout
(()
=>
{
this
.
oldQuestionList
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
questionList
))
},
300
)
this
.
oldQuestionList
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
questionList
)
);
},
300
);
}
})
})
;
}
})
})
;
},
async
downloadObject
(
row
,
code
)
{
this
.
iframeUrl
=
''
this
.
blobType
=
''
let
resUrl
=
await
downloadObject
({
fileId
:
row
.
id
})
if
(
this
.
blobType
==
''
)
{
this
.
blobType
=
row
.
suffix
}
const
binaryData
=
[]
binaryData
.
push
(
resUrl
)
let
URL
=
window
.
URL
.
createObjectURL
(
new
Blob
(
binaryData
,
{
type
:
'application/pdf'
}))
if
(
this
.
iframeUrl
==
''
)
{
this
.
iframeUrl
=
URL
+
'#view=FitH,top'
}
if
(
this
.
blobType
==
'docx'
)
{
let
docx
=
require
(
'docx-preview'
)
this
.
iframeUrl
=
""
;
this
.
blobType
=
""
;
let
resUrl
=
await
downloadObject
({
fileId
:
row
.
id
});
if
(
this
.
blobType
==
""
)
{
this
.
blobType
=
row
.
suffix
;
}
const
binaryData
=
[];
binaryData
.
push
(
resUrl
);
let
URL
=
window
.
URL
.
createObjectURL
(
new
Blob
(
binaryData
,
{
type
:
"application/pdf"
})
);
if
(
this
.
iframeUrl
==
""
)
{
this
.
iframeUrl
=
URL
+
"#view=Fit,top"
;
// this.iframeUrl = URL + "#view=FitH,top&toolbar=0";
// setTimeout(() => {
// console.log('全屏预览');
// // const binaryData = [];
// // binaryData.push(res);
// // this.pdfUrl = window.URL.createObjectURL(new Blob(binaryData, {type: 'application/pdf'}));
// window.open(this.iframeUrl);
// }, 2000)
}
if
(
this
.
blobType
==
"docx"
)
{
let
docx
=
require
(
"docx-preview"
);
this
.
$nextTick
(()
=>
{
docx
.
renderAsync
(
resUrl
,
document
.
getElementById
(
`word
${
code
}
`
),
null
,
this
.
docxOptions
)
// 渲染到页面预览
})
docx
.
renderAsync
(
resUrl
,
document
.
getElementById
(
`word
${
code
}
`
),
null
,
this
.
docxOptions
);
// 渲染到页面预览
});
}
},
async
handleClick
(
tab
)
{
let
params
=
{
projectStage
:
this
.
active
*
1
+
1
,
hgx
:
'hgx'
,
hgx
:
"hgx"
,
...
this
.
clqparams
,
}
this
.
options
=
[]
this
.
valuesel
=
''
this
.
iframeUrl
=
''
console
.
log
(
'切换'
,
tab
.
index
)
}
;
this
.
options
=
[]
;
this
.
valuesel
=
""
;
this
.
iframeUrl
=
""
;
console
.
log
(
"切换"
,
tab
.
index
);
let
resList
=
await
selFileList
({
...
params
,
typeCode
:
this
.
tabListKY
[
tab
.
index
].
typeCode
,
})
this
.
options
=
resList
.
data
||
[]
})
;
this
.
options
=
resList
.
data
||
[]
;
if
(
this
.
options
.
length
>
0
)
{
this
.
valuesel
=
this
.
options
[
0
].
name
this
.
downloadObject
(
this
.
options
[
0
],
this
.
tabListKY
[
tab
.
index
].
typeCode
)
this
.
valuesel
=
this
.
options
[
0
].
name
;
this
.
downloadObject
(
this
.
options
[
0
],
this
.
tabListKY
[
tab
.
index
].
typeCode
);
}
else
{
this
.
blobType
=
'png'
this
.
iframeUrl
=
'/nopdf.png'
this
.
blobType
=
"png"
;
this
.
iframeUrl
=
"/nopdf.png"
;
}
},
change
(
id
)
{
console
.
log
(
this
.
hgx
,
'3'
)
console
.
log
(
this
.
hgx
,
"3"
);
if
(
JSON
.
stringify
(
this
.
questionList
)
==
JSON
.
stringify
(
this
.
oldQuestionList
))
{
this
.
active
=
id
*
1
if
(
JSON
.
stringify
(
this
.
questionList
)
==
JSON
.
stringify
(
this
.
oldQuestionList
)
)
{
this
.
active
=
id
*
1
;
// this.tabListKY = MaterialsListKY(id * 1 + 1);
// if(this.hgx=='hgx'){
// this.working(this.clqparams)
// }else{
// this.init(this.clqparams)
// }
this
.
init
(
this
.
clqparams
)
this
.
init
(
this
.
clqparams
)
;
return
return
;
}
this
.
$confirm
(
'是否保存?'
,
'提示'
,
{
confirmButtonText
:
'是'
,
cancelButtonText
:
'否'
,
this
.
$confirm
(
"是否保存?"
,
"提示"
,
{
confirmButtonText
:
"是"
,
cancelButtonText
:
"否"
,
distinguishCancelAndClose
:
true
,
type
:
'warning'
,
type
:
"warning"
,
})
.
then
(()
=>
{
this
.
save
(
'3'
,
id
)
this
.
save
(
"3"
,
id
);
})
.
catch
((
action
)
=>
{
console
.
log
(
action
,
'actionaction'
)
if
(
action
===
'cancel'
)
{
this
.
active
=
id
*
1
console
.
log
(
action
,
"actionaction"
);
if
(
action
===
"cancel"
)
{
this
.
active
=
id
*
1
;
// this.tabListKY = MaterialsListKY(id * 1 + 1);
if
(
this
.
hgx
==
'hgx'
)
{
this
.
working
(
this
.
clqparams
)
}
else
{
this
.
init
(
this
.
clqparams
)
if
(
this
.
hgx
==
"hgx"
)
{
this
.
working
(
this
.
clqparams
);
}
else
{
this
.
init
(
this
.
clqparams
);
}
}
else
{
}
})
})
;
},
delInput
(
item
,
index
)
{
if
(
item
.
evalList
.
length
<=
1
)
{
item
.
checked
=
true
this
.
$set
(
item
,
'checked'
,
true
)
this
.
changeChecked
(
item
)
return
false
item
.
checked
=
true
;
this
.
$set
(
item
,
"checked"
,
true
);
this
.
changeChecked
(
item
)
;
return
false
;
}
item
.
evalList
.
splice
(
index
,
1
)
item
.
evalList
.
splice
(
index
,
1
)
;
},
adopt
(
item
,
index
,
items
)
{
console
.
log
(
item
,
'采纳'
)
console
.
log
(
item
,
"采纳"
);
if
(
item
.
evalList
.
length
==
1
&&
!
item
.
evalList
[
0
].
evalQues
)
{
item
.
evalList
[
0
].
evalQues
=
items
item
.
evalList
[
0
].
evalQues
=
items
;
}
else
{
item
.
evalList
.
push
({
evalQues
:
items
,
hideUploadEdit
:
false
,
})
})
;
}
},
addInput
(
item
)
{
if
(
item
.
evalList
[
0
].
disabled
==
true
)
{
console
.
log
(
'选择了未发现问题'
)
return
console
.
log
(
"选择了未发现问题"
);
return
;
}
item
.
evalList
.
push
({
data
:
''
,
evalQues
:
''
,
})
data
:
""
,
evalQues
:
""
,
})
;
},
changeChecked
(
item
)
{
if
(
item
.
checked
)
{
this
.
$set
(
item
,
'evalList'
,
[
this
.
$set
(
item
,
"evalList"
,
[
{
ideval
:
''
,
evalQues
:
''
,
ideval
:
""
,
evalQues
:
""
,
hideUploadEdit
:
false
,
disabled
:
true
,
},
])
this
.
$set
(
item
,
'isProblem'
,
0
)
])
;
this
.
$set
(
item
,
"isProblem"
,
0
);
// this.$set(item, "Id", 0);
}
else
{
item
.
evalList
[
0
].
disabled
=
false
this
.
$set
(
item
,
'isProblem'
,
1
)
item
.
evalList
[
0
].
disabled
=
false
;
this
.
$set
(
item
,
"isProblem"
,
1
);
}
},
cancel
()
{
this
.
$router
.
push
({
path
:
'/assesszc/auxiliaryInspection'
,
})
path
:
"/assesszc/auxiliaryInspection"
,
})
;
},
async
save
(
type
,
id
)
{
this
.
questionList
.
forEach
((
item
)
=>
{
let
evals
=
''
let
evals
=
""
;
item
.
evalList
.
forEach
((
childItem
)
=>
{
evals
=
evals
.
concat
(
childItem
.
evalQues
+
','
)
})
evals
=
evals
.
slice
(
0
,
-
1
)
item
.
evalQues
=
evals
evals
=
evals
.
concat
(
childItem
.
evalQues
+
","
);
})
;
evals
=
evals
.
slice
(
0
,
-
1
)
;
item
.
evalQues
=
evals
;
// if (item.evalList.length >= 1 && item.evalList[0].evalQues) {
// item.isProblem = 1;
// }
const
isProblem
=
item
.
evalList
.
filter
((
v
)
=>
v
.
evalQues
).
length
item
.
isProblem
=
isProblem
>
0
?
1
:
0
})
console
.
log
(
this
.
questionList
,
'questionList'
)
const
isProblem
=
item
.
evalList
.
filter
((
v
)
=>
v
.
evalQues
).
length
;
item
.
isProblem
=
isProblem
>
0
?
1
:
0
;
})
;
console
.
log
(
this
.
questionList
,
"questionList"
);
let
params
=
{
list
:
this
.
questionList
,
...
this
.
clqparams
,
}
console
.
log
(
params
,
'保存'
)
}
;
console
.
log
(
params
,
"保存"
);
// return
let
res
=
await
bcevalQuesInfo
(
params
)
if
(
res
.
code
==
'200'
)
{
this
.
$message
(
'保存成功'
)
let
res
=
await
bcevalQuesInfo
(
params
)
;
if
(
res
.
code
==
"200"
)
{
this
.
$message
(
"保存成功"
);
if
(
type
&&
type
==
2
)
{
this
.
$router
.
push
({
path
:
'/assesszc/Compliancefz'
,
path
:
"/assesszc/Compliancefz"
,
query
:
{
clqparams
:
JSON
.
stringify
(
this
.
clqparams
),
projectName
:
this
.
projectName
,
},
})
});
}
else
{
this
.
active
=
id
*
1
;
if
(
this
.
hgx
==
"hgx"
)
{
this
.
working
(
this
.
clqparams
);
}
else
{
this
.
active
=
id
*
1
if
(
this
.
hgx
==
'hgx'
){
this
.
working
(
this
.
clqparams
)
}
else
{
this
.
init
(
this
.
clqparams
)
this
.
init
(
this
.
clqparams
);
}
}
}
else
{
this
.
$message
(
'保存失败'
)
this
.
$message
(
"保存失败"
);
}
},
fileupdate
(
res
,
items
)
{
this
.
file
=
res
.
file
this
.
submitFile
(
res
,
items
)
this
.
file
=
res
.
file
;
this
.
submitFile
(
res
,
items
)
;
},
submitFile
(
item
,
list
)
{
console
.
log
(
list
,
'list'
)
console
.
log
(
this
.
file
,
'多少k'
)
console
.
log
(
list
,
"list"
);
console
.
log
(
this
.
file
,
"多少k"
);
if
(
this
.
file
)
{
const
formData
=
new
FormData
()
formData
.
append
(
'file'
,
this
.
file
)
const
formData
=
new
FormData
()
;
formData
.
append
(
"file"
,
this
.
file
);
ossupload
(
formData
)
.
then
((
response
)
=>
{
console
.
log
(
response
,
'上传图片'
)
if
(
response
.
code
==
'200'
)
{
console
.
log
(
response
,
"上传图片"
);
if
(
response
.
code
==
"200"
)
{
// list.url = response.data.downLoadUrl;
// list.fileId= response.data.fileId
this
.
$set
(
list
,
'url'
,
response
.
data
.
downLoadUrl
)
this
.
$set
(
list
,
'fileId'
,
response
.
data
.
fileId
)
this
.
$message
(
'上传成功'
)
this
.
$set
(
list
,
"url"
,
response
.
data
.
downLoadUrl
);
this
.
$set
(
list
,
"fileId"
,
response
.
data
.
fileId
);
this
.
$message
(
"上传成功"
);
}
else
{
this
.
$message
(
'上传失败'
)
this
.
$message
(
"上传失败"
);
}
})
.
catch
((
error
)
=>
{
console
.
error
(
error
)
this
.
$message
(
'上传失败'
)
})
console
.
error
(
error
)
;
this
.
$message
(
"上传失败"
);
})
;
}
},
},
}
}
;
</
script
>
<
style
lang=
"scss"
>
.time_line_wrap
{
display
:
flex
;
flex-direction
:
column
;
align-items
:
center
;
position
:
relative
;
padding
:
20px
10px
;
}
.time_item_left
{
margin-bottom
:
24px
;
margin-top
:
1px
;
flex
:
60
;
text-align
:
end
;
}
.time_item_center
{
display
:
flex
;
flex-direction
:
column
;
align-items
:
center
;
padding
:
0
12px
;
}
.time_item_right
{
margin-bottom
:
24px
;
margin-top
:
2px
;
flex
:
40
;
text-align
:
left
;
}
.time_item_line
{
position
:
relative
;
height
:
calc
(
100%
-
18px
);
min-height
:
20px
;
border-left-width
:
2px
;
//
border-left-color
:
#f2f2f3
;
border-left-style
:
solid
;
}
.time_item_dot
{
//
border
:
2px
solid
#babbc0
;
border-radius
:
50%
;
width
:
18px
;
height
:
18px
;
flex-shrink
:
0
;
}
</
style
>
<
style
lang=
"scss"
scoped
>
.pdf-container
{
position
:
relative
;
}
.pdf-controls
{
position
:
absolute
;
top
:
10px
;
right
:
10px
;
z-index
:
10
;
}
.main
{
font-size
:
14px
;
position
:
relative
;
...
...
@@ -836,6 +1488,7 @@ export default {
display
:
flex
;
flex-direction
:
column
;
}
.close
{
position
:
absolute
;
right
:
20px
;
...
...
@@ -847,6 +1500,7 @@ export default {
//
color
:
#fff
;
}
}
.title
{
text-align
:
left
;
background-color
:
#fff
;
...
...
@@ -855,6 +1509,7 @@ export default {
color
:
grey
;
font-size
:
15px
;
}
.continer
{
width
:
100%
;
background-color
:
#f5f5f6
;
...
...
@@ -865,12 +1520,14 @@ export default {
padding-bottom
:
0
;
min-height
:
0
;
height
:
100%
;
.top
{
width
:
70%
;
margin
:
0
auto
;
position
:
relative
;
padding-top
:
15px
;
}
.content
{
width
:
100%
;
margin-top
:
10px
;
...
...
@@ -880,6 +1537,7 @@ export default {
min-height
:
0
;
padding-bottom
:
50px
;
}
.left
{
width
:
49%
;
min-height
:
100px
;
...
...
@@ -892,12 +1550,15 @@ export default {
min-height
:
0
;
display
:
flex
;
flex-direction
:
column
;
.el-tabs__content
{
flex
:
1
;
.el-tab-pane
{
display
:
flex
;
flex-direction
:
column
;
height
:
100%
;
.iframeDiv
{
flex
:
1
;
}
...
...
@@ -905,22 +1566,26 @@ export default {
}
}
}
.right
{
width
:
50%
;
margin-left
:
10px
;
background
:
#fff
;
}
.rightscoll
{
//
height
:
610px
;
overflow-y
:
auto
;
padding
:
10px
;
}
.rightscollBig
{
//
height
:
680px
;
overflow-y
:
auto
;
padding
:
10px
;
}
}
::v-deep
.el-step__icon
{
color
:
#0d867f
;
border-color
:
#0d867f
;
...
...
@@ -928,6 +1593,7 @@ export default {
height
:
20px
;
//
border
:
3px
solid
#0d867f
;
}
::v-deep
.el-icon-caret-right
{
font-size
:
30px
;
line-height
:
23px
;
...
...
@@ -935,21 +1601,26 @@ export default {
color
:
#0d867f
;
z-index
:
4
;
}
::v-deep
.el-step.is-horizontal
.el-step__line
{
height
:
1px
;
//
margin-right
:
-20px
!important
;
z-index
:
1
;
}
::v-deep
.el-step__line
{
color
:
gainsboro
;
}
.el-step__head.is-wait
{
color
:
#0d867f
;
border-color
:
#0d867f
;
}
::v-deep
.el-step__title
{
color
:
#000
;
}
::v-deep
.el-step__title.is-process
{
color
:
#0d867f
;
}
...
...
@@ -957,9 +1628,11 @@ export default {
::v-deep
.is-wait
.el-step__icon-inner
{
display
:
none
;
}
::v-deep
.upload-demo
{
display
:
inline-block
;
}
.tableTitle
{
background
:
#0d867f
;
color
:
#f5f5f6
;
...
...
@@ -974,7 +1647,6 @@ export default {
justify-content
:
space-between
;
align-items
:
center
;
padding-right
:
20px
;
}
.rightContent
{
...
...
@@ -982,12 +1654,15 @@ export default {
overflow-y
:
auto
;
text-align
:
left
;
h3
{
margin
:
0
;
}
p
{
margin
:
5px
0
;
}
.question
{
border
:
1px
solid
gainsboro
;
padding
:
5px
;
...
...
@@ -996,12 +1671,14 @@ export default {
color
:
gray
;
font-size
:
12px
;
}
.el-textarea
{
width
:
65%
;
vertical-align
:
top
;
}
}
}
.el-button--primary
{
color
:
#ffffff
;
background-color
:
#0d867f
;
...
...
@@ -1011,6 +1688,7 @@ export default {
margin-left
:
10px
;
vertical-align
:
top
;
}
.el-button--info
{
color
:
#ffffff
;
//
background-color
:
#0d867f
;
...
...
@@ -1020,19 +1698,23 @@ export default {
margin-left
:
10px
;
vertical-align
:
top
;
}
.el-icon-circle-plus
{
font-size
:
45px
;
vertical-align
:
middle
;
color
:
#0d867f
;
}
.inputDiv
{
margin-top
:
5px
;
}
.addBtn
{
display
:
flex
;
justify-content
:
flex-end
;
//
justify-content
:
space-between
;
}
.Btn
{
//
width
:
calc
(
100%
-
276px
)
!important
;
width
:
100%
;
...
...
@@ -1045,6 +1727,7 @@ export default {
line-height
:
50px
;
box-sizing
:
border-box
;
margin
:
0
;
span
{
display
:
inline-block
;
width
:
89px
;
...
...
@@ -1057,18 +1740,21 @@ export default {
border
:
1px
solid
#0d867f
;
color
:
#fff
;
}
span
:first-of-type
{
border
:
1px
solid
grey
;
color
:
#000
;
background-color
:
#fff
;
}
}
.quesznfx
{
background-color
:
rgba
(
255
,
248
,
226
,
1
);
color
:
#ff5a2e
;
font-size
:
12px
;
padding
:
5px
;
margin-bottom
:
10px
;
.el-textarea
{
width
:
65%
;
vertical-align
:
top
;
...
...
@@ -1078,9 +1764,11 @@ export default {
::v-deep
.uploadBox_hide
.el-upload--picture-card
{
display
:
none
;
}
::v-deep
.upload_box
{
display
:
inline-block
;
}
::v-deep
.el-upload--picture-card
{
width
:
80px
;
height
:
40px
;
...
...
@@ -1088,83 +1776,96 @@ export default {
margin-left
:
10px
;
border
:
none
;
}
.blobImg
{
width
:
100%
;
img
{
text-align
:
center
;
width
:
80%
;
}
}
.docDiv
{
width
:
100%
;
height
:
600px
;
overflow
:
auto
;
}
.iframeDiv
{
width
:
80%
;
height
:
50vh
;
margin
:
auto
;
display
:
block
;
}
.iframeDivBig
{
width
:
80%
;
height
:
66vh
;
margin
:
auto
;
display
:
block
;
}
.opt
{
height
:
40px
;
width
:
100%
;
text-align
:
left
;
padding-left
:
10px
;
::v-deep
.el-input__inner
{
width
:
600px
;
}
}
::v-deep
.docx-wrapper
{
padding
:
0
!important
;
}
::v-deep
.docx
{
//
width
:
100%
!important
;
display
:
table
!important
;
padding
:
2em
1em
0
!important
;
margin
:
0
auto
!important
;
}
::v-deep
.kaimo-docx-666
{
margin
:
0
auto
!important
;
text-align
:
center
;
}
.dialogscroll
{
height
:
65vh
;
overflow-y
:
auto
;
}
.msg
{
vertical-align
:
middle
;
line-height
:
33px
;
}
::v-deep
.el-dialog__header
{
background-color
:
#0d867f
;
padding-bottom
:
20px
;
text-align
:
left
;
border-radius
:
10px
10px
0
0
;
.el-dialog__title
{
color
:
#fff
;
}
}
::v-deep
.el-dialog
{
border-radius
:
10px
;
//
margin-top
:
3vh
!important
;
//
margin-left
:
3vw
!important
;
}
.noShow
{
display
:
none
;
}
.resimg
{
display
:
inline-block
;
width
:
100px
;
}
.working
{
position
:
absolute
;
left
:
-100px
;
}
</
style
>
src/views/assessZC/confirmRelease.vue
View file @
4fc8e26
...
...
@@ -865,7 +865,7 @@ export default {
this
.
$refs
[
"multipleTableZJ"
].
toggleRowSelection
(
row
);
this
.
addZJList
=
this
.
$refs
.
multipleTableZJ
.
selection
;
}
else
{
this
.
$message
.
warning
(
"项目编码或合同编码为空"
);
this
.
$message
.
warning
(
"项目编码或合同编码为空
2
"
);
}
},
timeChange
(
time
)
{
...
...
src/views/assessZC/projectView.vue
View file @
4fc8e26
...
...
@@ -455,7 +455,7 @@ export default {
checkedList
:
[],
yearsList
:
generateYearOptions
(),
ruleForm
:
{
projectCode
:
"
7322XT23005C
"
,
projectCode
:
""
,
projectName
:
""
,
issueYear
:
""
,
constructionForm
:
""
,
...
...
src/views/layout/index.vue
View file @
4fc8e26
...
...
@@ -9,6 +9,34 @@
</div>
<div
class=
"right"
>
<div
class=
"head"
>
<div
style=
"margin-right: 20px; cursor: pointer"
@
click=
"showMessageDialog"
>
<el-badge
:value=
"messageNum"
:max=
"99"
class=
"item"
>
<svg
t=
"1739518743824"
class=
"icon"
:fill=
"messageNum > 0 ? 'red' : 'gray'"
style=
"width: 20px; height: 20px"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"1670"
>
<path
d=
"M951.925029 807.043657l-80.310858-111.850057V457.201371c0-183.281371-146.285714-336.7936-336.457142-350.632228V76.1856a29.257143 29.257143 0 0 0-58.514286 0v30.529829c-175.542857 14.730971-321.828571 167.818971-321.828572 350.485942v237.9776l-81.173942 113.2544c-12.741486 17.832229-14.584686 33.923657-4.549486 53.408915s29.988571 24.385829 51.902171 24.385828h782.7456c21.9136 0 40.594286-4.900571 50.629486-24.385828s10.298514-36.9664-2.442971-54.798629zM120.992914 827.728457l92.335543-113.795657v-256.731429c0-160.168229 133.032229-302.3872 297.764572-302.3872h2.545371c164.746971 0 299.446857 142.218971 299.446857 302.3872v256.7168l90.638629 113.795658H120.992914z"
fill=
""
p-id=
"1671"
></path>
<path
d=
"M689.239771 291.693714c-6.407314-4.959086-14.189714-3.774171-19.1488 2.589257-4.959086 6.392686-5.880686 15.5648 0.482743 20.523886 35.605943 27.604114 54.740114 70.5536 54.740115 114.907429v143.842743a14.628571 14.628571 0 1 0 29.257142 0v-143.842743c0.014629-53.321143-22.674286-104.916114-65.3312-138.020572zM627.317029 255.063771c-17.642057-5.178514-36.9664-12.478171-55.881143-12.478171h-1.4336c-8.0896 0-13.9264 11.117714-13.9264 19.207314s7.255771 16.910629 15.345371 16.910629c16.164571 0 32.650971 3.4816 47.659886 7.8848 1.375086 0.394971 2.750171 1.155657 4.110628 1.155657 6.334171 0 12.170971-6.129371 14.043429-12.507429 2.282057-7.767771-2.165029-17.905371-9.918171-20.1728zM599.259429 915.499886h-175.542858a29.257143 29.257143 0 0 0 0 58.514285h175.542858a29.257143 29.257143 0 0 0 0-58.514285z"
fill=
""
p-id=
"1672"
></path>
</svg>
</el-badge>
</div>
<!--
<el-select
v-model=
"userMock"
placeholder=
"请选择"
@
change=
"changeUser"
>
<el-option
v-for=
"(item, index) in userMockList"
...
...
@@ -20,7 +48,7 @@
<div
style=
"margin-right: 5px"
>
<img
src=
"../../assets/user.png"
alt=
"user"
/>
</div>
<div
style=
"margin-right: 35px"
>
您好,管理员
</div>
<div
style=
"margin-right: 35px"
>
您好,管理员
</div>
<div
style=
"margin-right: 5px"
>
<img
src=
"../../assets/exit.png"
alt=
"exit"
/>
...
...
@@ -29,26 +57,38 @@
</div>
<div
class=
"menu no-select"
>
<div
class=
"right-angle-triangle"
></div>
<div
v-if=
"!false"
class=
"just"
>
<div
id=
"home"
@
click=
"navigateToChild('1','/home')"
:class=
"active=='1'?'active':''"
>
<div
v-if=
"false"
class=
"just"
>
<div
id=
"home"
@
click=
"navigateToChild('1', '/home')"
:class=
"active == '1' ? 'active' : ''"
>
<span
class=
"iconfont"
>

</span>
主页
</div>
<div
id=
"lxtc"
:class=
"active
=='2'?'active':
''"
>
<div
id=
"lxtc"
:class=
"active
== '2' ? 'active' :
''"
>
<span
class=
"between iconfont"
>

</span>
立项统筹中心
</div>
<div
id=
"xmjg"
:class=
"active
=='3'?'active':
''"
>
<div
id=
"xmjg"
:class=
"active
== '3' ? 'active' :
''"
>
<span
class=
"between iconfont"
>

</span>
项目建管中心
</div>
<div
id=
"jggk"
:class=
"active
=='4'?'active':
''"
>
<div
id=
"jggk"
:class=
"active
== '4' ? 'active' :
''"
>
<span
class=
"between iconfont"
>

</span>
架构管控中心
</div>
<div
id=
"hpg"
@
click=
"navigateToChild('5','/mainLayout')"
:class=
"active=='5'?'active':''"
>
<span
class=
"between iconfont"
>

</span>
后评估管控中心
<div
id=
"hpg"
@
click=
"navigateToChild('5', '/mainLayout')"
:class=
"active == '5' ? 'active' : ''"
>
<span
class=
"between iconfont"
>

</span>
后评估管控中心
</div>
<div
id=
"zhfx"
:class=
"active=='6'?'active':''"
@
click=
"navigateToChild('6','/analysisCore')"
>
<div
id=
"zhfx"
:class=
"active == '6' ? 'active' : ''"
@
click=
"navigateToChild('6', '/analysisCore')"
>
<span
class=
"between iconfont"
>

</span>
综合分析中心
</div>
<div
id=
"xtgl"
:class=
"active
=='7'?'active':
''"
>
<div
id=
"xtgl"
:class=
"active
== '7' ? 'active' :
''"
>
<span
class=
"between iconfont"
>

</span>
系统管理
</div>
</div>
...
...
@@ -59,37 +99,199 @@
<!--
<MainLayout
class=
"continer"
>
<router-view></router-view>
</MainLayout>
-->
<el-dialog
:visible
.
sync=
"showMessage"
title=
"消息列表"
width=
"90%"
:modal-append-to-body=
"true"
:append-to-body=
"true"
:fullscreen=
"false"
@
close=
"closeMessage"
>
<div
style=
"display: flex; flex-direction: column; gap: 10px;"
>
<div
style=
"
display: flex;
flex-direction: row;
align-items: center;
gap: 10px;
"
>
<!--
<div>
消息提醒
{{
messageNum
}}
条
</div>
-->
<div><el-button
type=
"primary"
@
click=
"readWhole"
size=
"small"
>
一键已读
</el-button></div>
</div>
<div>
<el-table
@
selection-change=
"handleSelectionChange"
@
row-click=
"
(row, column, event) =>
handleRowClick(row, column, event, 'multipleTable')
"
ref=
"multipleTable"
:header-cell-style=
"
{ background: '#f5f5f5' }"
header-cell-class-name="custom-th-background"
:data="tableData"
style="width: 100%; box-sizing: border-box"
border
stripe
>
<el-table-column
fixed
label=
"序号"
width=
"55"
type=
"index"
align=
"center"
/>
<!--
<el-table-column
fixed
type=
"selection"
/>
-->
<el-table-column
prop=
"projectCode"
label=
"项目编码"
width=
"150"
align=
"center"
/>
<el-table-column
prop=
"projectName"
label=
"项目名称"
width=
"120"
show-overflow-tooltip
align=
"center"
/>
<el-table-column
align=
"center"
prop=
"issueYear"
label=
"项目年度"
width=
"100"
/>
<el-table-column
align=
"center"
prop=
"projectType"
label=
"项目类型"
width=
"100"
>
<template
slot-scope=
"scope"
>
<div
v-if=
"scope.row.projectType == 1"
>
咨询设计类
</div>
<div
v-if=
"scope.row.projectType == 2"
>
开发实施类
</div>
<div
v-if=
"scope.row.projectType == 3"
>
业务运营类
</div>
<div
v-if=
"scope.row.projectType == 4"
>
数据工程类
</div>
<div
v-if=
"scope.row.projectType == 5"
>
产品购置类
</div>
</
template
>
</el-table-column>
<el-table-column
prop=
"constructionForm"
label=
"建设形式"
width=
"90"
align=
"center"
>
<
template
slot-scope=
"scope"
>
<div
v-if=
"scope.row.constructionForm == 1"
>
独立建设
</div>
<div
v-if=
"scope.row.constructionForm == 2"
>
统推
</div>
<div
v-if=
"
scope.row.constructionForm == 3 ||
scope.row.constructionForm == 4
"
>
自建
</div>
</
template
>
</el-table-column>
<el-table-column
prop=
"currentProgress"
label=
"当前进度"
width=
"90"
align=
"center"
/>
<el-table-column
prop=
"contractNumber"
label=
"合同编码"
width=
"90"
align=
"center"
show-overflow-tooltip
/>
<el-table-column
prop=
"contractName"
label=
"合同名称"
width=
"90"
align=
"center"
show-overflow-tooltip
/>
<el-table-column
prop=
"createTime"
align=
"center"
label=
"提醒时间"
width=
"110"
/>
<el-table-column
prop=
"status"
align=
"center"
label=
"状态"
width=
"100"
>
<
template
slot-scope=
"scope"
>
{{
scope
.
row
.
status
===
1
?
"未读"
:
"已读"
}}
</
template
>
</el-table-column>
<el-table-column
prop=
"materialName"
label=
"未上传材料"
width=
"100"
align=
"center"
show-overflow-tooltip
/>
<el-table-column
fixed=
"right"
label=
"操作"
align=
"center"
min-width=
"120"
>
<
template
slot-scope=
"scope"
>
<el-button
link
type=
"primary"
@
click=
"bingoOprate(scope.row)"
size=
"small"
>
操作
</el-button
>
</
template
>
</el-table-column>
</el-table>
</div>
<el-pagination
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
:current-page=
"currentPage"
:page-sizes=
"[10, 15, 20, 50, 100]"
:page-size=
"1000"
layout=
"total, sizes, prev, pager, next, jumper"
:total=
"total"
style=
"text-align: center; margin-right: 100px"
>
</el-pagination>
</div>
</el-dialog>
</div>
</template>
<
script
>
import
MainLayout
from
"./mainLayout"
;
import
{
getMessageListApi
,
updateMessageApi
,
readWholwMsg
}
from
"@/api/indexzc"
;
// import tableMixin from '@/mixins/table.mixin.js'
export
default
{
// mixins: [tableMixin],
components
:
{
MainLayout
,
},
data
()
{
return
{
currentPage
:
1
,
pageSize
:
10
,
currentPagetjcl
:
1
,
pageSizetjcl
:
10
,
total
:
0
,
tableData
:
[
{
date
:
"2016-05-01"
,
status
:
1
,
name
:
"Tom"
,
state
:
"California"
,
city
:
"Los Angeles"
,
address
:
"No. 189, Grove St, Los Angeles"
,
zip
:
"CA 90036"
,
tag
:
"Office"
,
},
{
date
:
"2016-05-01"
,
status
:
1
,
name
:
"Tom"
,
state
:
"California"
,
city
:
"Los Angeles"
,
address
:
"No. 189, Grove St, Los Angeles"
,
zip
:
"CA 90036"
,
tag
:
"Office"
,
},
],
showMessage
:
false
,
messageNum
:
0
,
userMock
:
1
,
// 角色
userMockList
:
[
{
label
:
'超管'
,
id
:
1
label
:
"超管"
,
id
:
1
,
},
{
label
:
'发起人'
,
id
:
2
label
:
"发起人"
,
id
:
2
,
},
{
label
:
'专家'
,
id
:
3
label
:
"专家"
,
id
:
3
,
},
{
label
:
'项目负责人'
,
id
:
4
label
:
"项目负责人"
,
id
:
4
,
},
],
active
:
'5'
,
active
:
"5"
,
headerList
:
[
{
name
:
"主页"
,
...
...
@@ -129,30 +331,129 @@ export default {
],
};
},
mounted
(){
if
(
this
.
$route
.
path
==
'/analysisCore'
){
this
.
active
=
6
created
()
{
this
.
getMessageList
();
},
mounted
()
{
if
(
this
.
$route
.
path
==
"/analysisCore"
)
{
this
.
active
=
6
;
}
// this.$router.push({ path:" /mainLayout" });
},
methods
:{
changeUser
(
val
){
const
{
label
}
=
this
.
userMockList
.
find
(
item
=>
item
.
id
===
val
)
console
.
log
(
'changeUser'
,
val
,
label
);
},
navigateToChild
(
num
,
pushUrl
){
this
.
active
=
num
this
.
$router
.
push
({
path
:
pushUrl
});
methods
:
{
async
readWhole
()
{
// 一键已读
this
.
$confirm
(
'确认已读所有消息, 是否继续?'
,
'提示'
,
{
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
,
}).
then
(
async
()
=>
{
let
res
=
await
readWholwMsg
()
// console.log('res', res);
if
(
res
.
data
.
code
==
0
)
{
this
.
$message
({
type
:
'success'
,
message
:
'已读所有消息成功!'
,
})
}
else
{
this
.
$message
({
type
:
'info'
,
message
:
'已读失败!'
,
})
}
}).
catch
(()
=>
{
this
.
$message
({
type
:
'info'
,
message
:
'已取消已读所有'
,
})
})
},
changeSelect
(){
async
bingoOprate
(
row
)
{
const
a
=
await
updateMessageApi
([
row
.
id
])
this
.
showMessage
=
false
;
this
.
$router
.
push
({
path
:
"/assesszc/projectView"
,
query
:
{
projectId
:
row
.
projectCode
,
// projectId: '7422XT230022',
},
});
},
handleRowClick
(
row
,
column
,
event
,
ref
)
{
console
.
log
(
"column"
,
column
);
if
(
column
.
label
==
"操作"
)
{
return
;
// this.showMessage = false
// this.$router.push({path: '/assesszc/projectView', query: {
// projectId: row.projectCode,
// // projectId: '7422XT230022',
// }})
}
else
{
this
.
$refs
[
ref
].
toggleRowSelection
(
row
);
}
},
async
getMessageList
()
{
let
params
=
{
current
:
this
.
currentPage
,
pageSize
:
this
.
pageSize
,
};
console
.
log
(
params
);
let
res
=
await
getMessageListApi
(
params
);
if
(
res
.
code
==
"200"
)
{
this
.
tableData
=
res
.
data
.
records
;
this
.
messageNum
=
res
.
data
.
count
*
1
this
.
total
=
res
.
data
.
count
*
1
;
}
},
handleSizeChange
(
val
)
{
this
.
pageSize
=
val
;
this
.
getMessageList
();
},
handleCurrentChange
(
val
)
{
this
.
currentPage
=
val
;
this
.
getMessageList
();
},
handleSelectionChange
(
selection
)
{
console
.
log
(
"hand"
,
selection
);
},
async
showMessageDialog
()
{
this
.
currentPage
=
1
;
await
this
.
getMessageList
();
this
.
showMessage
=
true
;
},
closeMessage
()
{
this
.
currentPage
=
1
;
},
changeUser
(
val
)
{
const
{
label
}
=
this
.
userMockList
.
find
((
item
)
=>
item
.
id
===
val
);
console
.
log
(
"changeUser"
,
val
,
label
);
},
navigateToChild
(
num
,
pushUrl
)
{
this
.
active
=
num
;
this
.
$router
.
push
({
path
:
pushUrl
});
},
changeSelect
()
{},
},
};
</
script
>
<
style
lang=
"scss"
scoped
>
::v-deep
.el-dialog__header
{
background-color
:
#0d867f
;
padding-bottom
:
20px
;
text-align
:
left
;
border-radius
:
10px
10px
0
0
;
.el-dialog__title
{
color
:
#fff
;
}
}
::v-deep
.el-dialog
{
border-radius
:
10px
;
//
margin-top
:
3vh
!important
;
//
margin-left
:
3vw
!important
;
}
.iconfont
{
font-family
:
"iconfont"
!important
;
font-size
:
16px
;
...
...
@@ -217,8 +518,6 @@ export default {
-moz-osx-font-smoothing
:
grayscale
;
}
.head-container
{
display
:
flex
;
width
:
100%
;
...
...
@@ -367,13 +666,10 @@ export default {
::-webkit-scrollbar-track-piece
{
background-color
:
#f5f5f5
;
}
.mian
{
.mian
{
//
width
:
100%
;
//
height
:
100vh
;
height
:
100%
;
overflow
:
auto
;
}
</
style
>
src/views/layout/mainLayout.vue
View file @
4fc8e26
...
...
@@ -9,7 +9,7 @@
<ContinerView
class=
"continer"
id=
"myElement"
>
<router-view></router-view>
</ContinerView>
<div
class=
"changeqx"
>
<div
v-if=
"false"
class=
"changeqx"
>
<el-menu
router
class=
"el-menu-vertical-demo"
...
...
Write
Preview
Markdown
is supported
Attach a file
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 post a comment