Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
I
inspection-pad-web
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
专网
inspection-pad-web
Commits
e0416766
提交
e0416766
authored
4月 15, 2025
作者:
zs
浏览文件
操作
浏览文件
下载
差异文件
Merge branct puh 'dev' of
https://git.yfzx.zjtys.com.cn/privateNetwork/inspection-pad-web
into dev
上级
34f6fb51
464de427
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
887 行增加
和
845 行删除
+887
-845
inspect.js
api/inspect.js
+2
-1
shaftInspectionList.vue
pages/shaftInspection/shaftInspectionList.vue
+885
-844
没有找到文件。
api/inspect.js
浏览文件 @
e0416766
...
...
@@ -283,7 +283,8 @@ LIMIT 1;`
}
let
sql
=
`UPDATE
${
table
.
inspectionRecordName
}
SET
signImg = '
${
data
.
signImg
}
',
synFlag = '
${
data
.
synFlag
}
'
synFlag = '
${
data
.
synFlag
}
',
isException = '
${
data
.
isException
}
',
WHERE id =
${
data
.
id
}
`
;
await
sqllitedb
.
executeSQL
(
sql
);
}
catch
(
e
)
{
...
...
pages/shaftInspection/shaftInspectionList.vue
浏览文件 @
e0416766
<
template
>
<!-- 井道巡检列表 -->
<view
class=
"container"
>
<uni-nav-bar
:fixed=
"true"
background-color=
"rgba(214, 240, 255, 0.0)"
status-bar
rightWidth=
"300"
>
<block
slot=
"left"
>
<view
class=
""
@
click=
"back"
>
<text
class=
"iconfont icon-fanhui"
></text>
</view>
</block>
<block
slot=
"right"
class=
"nav-right"
>
<view
class=
"header-buttons"
>
<view
class=
"button"
@
click=
"lookTable"
>
查看样表
</view>
</view>
</block>
</uni-nav-bar>
<!-- 第二个模块 -->
<view
class=
"profile-section"
>
<view
class=
"profile-box"
>
<view
class=
"profile-left"
>
<view
class=
"avatar"
>
<image
src=
"@/static/img/add-img/defaultAvatar.png"
mode=
"aspectFit"
></image>
</view>
<view
class=
"info"
>
<view
class=
"username"
>
{{
userInfo
.
user
}}
</view>
<view
class=
"number"
>
巡检编号:
<text
class=
"value"
>
{{
inspectionCode
}}
</text></view
>
</view>
</view>
<!--
{{
isSubmit
}}
{{
isSign
}}
-->
<view
v-if=
"isSubmit"
class=
"profile-right"
>
<button
v-if=
"!isSign"
class=
"record-button"
@
click=
"toSign"
>
巡检人签字
</button>
<view
v-else-if=
"detailsInfo.synchronization != 1"
class=
"action-container"
>
<image
class=
"sign-img"
:src=
"detailsInfo.signImg"
mode=
"aspectFit"
>
</image>
<button
class=
"record-button small"
@
click=
"toSign"
>
重签
</button>
<view
class=
"inspection-button"
@
click=
"openDialog(true)"
>
数据同步
</view>
</view>
</view>
</view>
</view>
<view
v-if=
"!isSign"
class=
"content-box"
>
<!-- 左侧模块 -->
<view
class=
"left-side"
>
<view
v-for=
"(tab, index) in tabs.slice(0, 7)"
:key=
"index"
:class=
"['tab-item',
{ active: activeTab === index }]"
@click="getActiveTab(index)"
>
{{
tab
}}
</view>
</view>
<!-- 右侧模块 -->
<view
class=
"right-side"
>
<!-- 第一部分:按钮 -->
<view
class=
"button-group"
>
<view
class=
"button"
>
已巡检
<text
class=
"number"
>
{{
inspectionNumber
}}
</text
>
个井道
</view
>
<view
class=
"button"
>
<text
class=
"iconfont icon-tixing"
></text
>
请点击“需巡检井道”执行巡检
</view
>
</view>
<!-- 第二部分:卡片组 -->
<view
class=
"card-box"
>
<view
class=
"card-group"
v-for=
"(item, index) in cardsInfo"
:key=
"index"
>
<view
class=
"card-title"
>
{{
item
.
name
}}
</view>
<view
class=
"card-list"
>
<view
v-for=
"position in item.position"
:key=
"position.dictValue"
class=
"card"
:class=
"
{
status1: position.status == 1,
status2: position.status == 2,
}"
@click="
toShaftInspection(
item.value,
position.dictValue,
item.name + position.dictLabel
)
"
>
<view
class=
"card-content"
>
<view
class=
"status-line"
>
<text
v-if=
"position.status == 0"
class=
"iconfont icon-weixunjian"
></text>
<text
v-if=
"position.status == 1"
class=
"iconfont icon-wancheng"
></text>
<text
v-if=
"position.status == 2"
class=
"iconfont icon-shibai1"
></text>
<text
v-if=
"position.isSubmit === 0"
class=
"status-text"
>
草稿
</text>
<text
v-else
class=
"status-text"
>
{{
position
.
statusLable
}}
</text>
</view>
<view
class=
"info-line"
>
<text
class=
"info-text"
>
{{
item
.
name
}}{{
position
.
dictLabel
}}
</text
>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view
v-else
class=
"content-box"
>
<!-- 左侧模块 -->
<view
class=
"left-side"
>
<view
v-for=
"(tab, index) in tabsDetail.slice(0, 7)"
:key=
"index"
:class=
"['tab-item',
{ active: activeTab === index }]"
@click="getActiveTabDetails(index, tab)"
>
{{
tab
}}
</view>
</view>
<!-- 右侧模块 -->
<view
class=
"right-side"
>
<!-- 第二部分:卡片组 -->
<view
class=
"card-box"
>
<view
class=
"card-group"
v-for=
"(item, index) in cardsInfo"
:key=
"index"
>
<view
class=
"card-title"
>
{{
item
.
name
}}
</view>
<view
class=
"card-list"
>
<view
v-for=
"position in item.position"
:key=
"position.dictValue"
class=
"card"
:class=
"
{
status1: position.status == 1,
status2: position.status == 2,
}"
@click="getDetailsItem(item.value, position.dictCode)"
>
<view
class=
"card-content"
>
<view
class=
"status-line"
>
<text
v-if=
"position.status == 0"
class=
"iconfont icon-weixunjian"
></text>
<text
v-if=
"position.status == 1"
class=
"iconfont icon-wancheng"
></text>
<text
v-if=
"position.status == 2"
class=
"iconfont icon-shibai1"
></text>
<text
v-if=
"position.isSubmit === 0"
class=
"status-text"
>
草稿
</text>
<text
v-else
class=
"status-text"
>
{{
position
.
statusLable
}}
</text>
</view>
<view
class=
"info-line"
>
<text
class=
"info-text"
>
{{
item
.
name
}}{{
position
.
dictLabel
}}
</text
>
</view>
</view>
</view>
</view>
</view>
<view
v-if=
"isShow"
class=
"card-group"
>
<detail
ref=
"detail"
:detailsItem=
"detailsItem"
></detail
></view>
</view>
</view>
</view>
<signDialog
ref=
"signDialog"
@
confirm=
"handlePopupConfirm"
></signDialog>
<Dialog
v-show=
"showSyncDialog"
:list=
"list"
@
close=
"openDialog(false)"
></Dialog>
</view>
</
template
>
<
script
>
import
moment
from
"moment"
;
import
{
pad_2_1_inspection_position
,
pad_2_1_floor
}
from
"@/utils/dict.js"
;
import
{
writeInspectionData
,
addLog
,
getLogContent
,
LOG_TYPE_ENUM
,
}
from
"@/utils/IoReadingAndWriting.js"
;
import
{
getInspectionDetails
}
from
"@/request/index.js"
;
import
inspectApi
from
"@/api/inspect"
;
import
signDialog
from
"@/components/signDialog.vue"
;
import
detail
from
"./model/detail.vue"
;
import
Dialog
from
'@/pages/inspectionManagement/dialog.vue'
import
{
sqlToData
,
dataToSql
}
from
"./shared"
;
export
default
{
components
:
{
signDialog
,
detail
,
Dialog
},
data
()
{
return
{
tabs
:
[
"所有井道"
],
// 选项卡内容
tabsDetail
:
[
"所有井道"
],
activeTab
:
0
,
// 默认选中的选项卡
inspectionNumber
:
0
,
// 已巡检的井道数量
cards
:
[
"A座-1楼"
,
"A座-2楼"
,
"A座-3楼"
,
"A座-4楼"
,
"A座-5楼"
,
"A座-6楼"
,
"A座-7楼"
,
"A座-8楼"
,
],
// 卡片内容
inspectionCode
:
""
,
cardsInfo
:
[],
//卡片数据
tabList
:
[],
activeTabIndex
:
0
,
baseInfo
:
{},
// 基础信息
tempForm
:
{
// 对应每个tab下的数据 [示例 0: 数据]
},
detailsInfo
:
{},
// 详情
isDisable
:
false
,
// 禁用
isSign
:
false
,
//签名状态
isSubmit
:
0
,
//提交状态
uid
:
""
,
options
:
{},
//存储数据
backValue
:
""
,
all_data
:
[],
//所有数据
detailsItem
:
{},
//单个井道详情
isShow
:
false
,
showSyncDialog
:
false
,
list
:
[]
};
},
computed
:
{
userInfo
()
{
return
this
.
$store
.
state
.
now_user
||
{};
},
isOperationPermissions
()
{
// 是否有操作权限
const
{
uid
,
createByName
}
=
this
.
detailsInfo
;
return
!
uid
||
(
uid
&&
createByName
==
this
.
userInfo
.
user
);
},
},
onLoad
(
options
)
{
this
.
options
=
options
;
this
.
backValue
=
this
.
options
.
backValue
||
""
;
this
.
isDisable
=
this
.
options
.
isDisable
==
1
?
true
:
false
;
console
.
log
(
"options.uid"
,
this
.
options
.
uid
);
this
.
uid
=
this
.
options
.
uid
||
""
;
},
onShow
()
{
if
(
this
.
uid
)
{
this
.
getDetails
(
this
.
uid
);
}
else
{
this
.
init
();
}
this
.
all_data
=
this
.
$store
.
state
.
all_data
;
},
mounted
()
{},
methods
:
{
init
()
{
return
new
Promise
((
resolve
,
reject
)
=>
{
this
.
tabList
=
pad_2_1_inspection_position
.
rows
.
map
((
item
,
index
)
=>
{
this
.
tabs
.
push
(
item
.
dictLabel
);
return
{
name
:
item
.
dictLabel
,
value
:
item
.
dictValue
,
isVaild
:
false
,
// 校验通过
// type: 1, // 枚举值
position
:
pad_2_1_floor
.
rows
,
refName
:
`TabContentItem_
${
index
}
`
,
descript
:
"检查内容包括门禁、卫生、设备告警。"
,
};
});
this
.
cardsInfo
=
this
.
tabList
;
this
.
inspectionCode
=
`JDXJ
${
moment
().
format
(
"yyyyMMDDHHmmss"
)}${
Math
.
floor
(
Math
.
random
()
*
900
)
+
100
}
`
;
console
.
log
(
"this.tabList"
,
this
.
tabList
);
if
(
this
.
detailsInfo
.
inspectionType
)
{
const
fillCheck
=
this
.
detailsInfo
.
fillCheck
.
split
(
","
);
setTimeout
(()
=>
{
this
.
tabList
.
forEach
((
item
,
index
)
=>
{
item
.
isVaild
=
fillCheck
.
includes
(
item
.
value
);
this
.
tempForm
[
index
]
&&
this
.
setComponentData
(
item
.
refName
,
this
.
tempForm
[
index
]);
});
},
500
);
}
else
{
this
.
baseInfo
=
this
.
$store
.
state
.
temp_data
;
}
resolve
();
});
},
// 获取井道详情
getDetailsItem
(
value
,
dictCode
)
{
let
item
=
this
.
detailsInfo
.
originData
.
find
(
building
=>
building
.
value
===
value
)?.
position
.
find
(
pos
=>
pos
.
dictCode
===
dictCode
)
if
(
item
.
status
<
1
)
{
uni
.
showToast
({
title
:
"该井道暂无数据"
,
icon
:
"none"
,
});
}
this
.
detailsItem
=
item
.
details
;
this
.
isShow
=
true
;
console
.
log
(
"this.detailsItem"
,
this
.
detailsItem
);
},
getActiveTab
(
index
)
{
this
.
activeTab
=
index
;
console
.
log
(
"this.activeTab"
,
this
.
activeTab
);
if
(
this
.
activeTab
==
0
)
{
this
.
cardsInfo
=
this
.
tabList
;
}
else
{
this
.
cardsInfo
=
[
this
.
tabList
[
index
-
1
]];
}
},
getActiveTabDetails
(
index
,
tab
)
{
this
.
activeTab
=
index
;
// this.cardsInfo = [selected];
// this.cardsInfo = [this.tabList[index]];
if
(
this
.
activeTab
==
0
)
{
this
.
cardsInfo
=
this
.
tabList
;
}
else
{
let
selected
=
this
.
tabList
.
find
(
t
=>
t
.
name
===
tab
)
this
.
cardsInfo
=
[
selected
];
}
this
.
isShow
=
false
;
},
// 回显数据
getDetails
(
uid
)
{
uni
.
showLoading
();
inspectApi
.
info
(
uid
)
.
then
((
res
)
=>
{
console
.
log
(
res
)
const
detailsInfo
=
sqlToData
(
res
);
console
.
log
(
"detailsInfo"
,
detailsInfo
);
this
.
detailsInfo
=
detailsInfo
;
this
.
inspectionNumber
=
detailsInfo
.
inspectionNumber
;
if
(
detailsInfo
.
synchronization
===
1
)
{
// 已同步数据的查看详情时,只展示'已巡检'的井道信息,过滤未巡检的井道
let
defaultList
=
detailsInfo
.
originData
this
.
cardsInfo
=
this
.
tabList
=
defaultList
.
filter
(
building
=>
{
building
.
position
=
building
.
position
.
filter
(
pos
=>
pos
.
status
===
1
)
return
building
.
position
.
length
})
}
else
{
this
.
cardsInfo
=
this
.
tabList
=
detailsInfo
.
originData
;
}
this
.
inspectionCode
=
detailsInfo
.
inspectionCode
;
// this.cardsInfo = this.tabList = detailsInfo.originData;
this
.
isSubmit
=
this
.
detailsInfo
.
originData
.
reduce
((
acc
,
cur
)
=>
{
acc
.
push
(...
cur
.
position
)
return
acc
},
[]).
every
(
pos
=>
pos
.
isSubmit
===
''
||
pos
.
isSubmit
===
1
);
this
.
isSign
=
!!
this
.
detailsInfo
.
signImg
;
this
.
cardsInfo
.
forEach
((
item
)
=>
{
this
.
tabs
.
push
(
item
.
name
);
this
.
tabsDetail
.
push
(
item
.
name
);
});
if
(
this
.
isSign
)
{
this
.
getActiveTabDetails
(
0
);
}
this
.
isDisable
=
this
.
isDisable
||
detailsInfo
.
synchronization
==
1
;
// 是否禁用 1:已同步数据 0: 未同步数据
uni
.
hideLoading
();
})
.
catch
((
error
)
=>
{
uni
.
showToast
({
title
:
error
.
msg
,
icon
:
"none"
,
duration
:
1000
,
});
uni
.
hideLoading
();
});
},
// 回显组件数据
setComponentData
(
refName
,
componentData
)
{
this
.
$refs
[
refName
][
0
]
&&
this
.
$refs
[
refName
][
0
].
setForm
(
componentData
);
},
// 删除
deleteClick
()
{
this
.
$refs
.
inputDialog2
.
open
();
},
toSign
()
{
this
.
$refs
.
signDialog
.
open
();
},
// tab选中change 时间
changeTab
(
index
,
item
)
{
this
.
draft
(
this
.
activeTabIndex
,
false
,
false
).
then
(()
=>
{
this
.
activeTabIndex
=
index
;
});
},
// 处理弹窗确认
handlePopupConfirm
(
summary
)
{
this
.
detailsInfo
.
isSign
=
this
.
isSign
=
true
;
// 回显到文字显示区域
this
.
detailsInfo
.
signImg
=
summary
;
// 回显到文字显示区域
this
.
submit
(
"sign"
,
this
.
detailsInfo
.
signImg
);
},
// 提交
submit
(
type
=
"sign"
,
value
=
""
)
{
const
all_data
=
this
.
all_data
;
//获取全部数据
let
params
=
this
.
detailsInfo
;
params
.
signImg
=
value
;
console
.
log
(
"all_data"
,
all_data
);
const
index
=
all_data
.
findIndex
((
element
)
=>
element
.
uid
==
this
.
uid
);
console
.
log
(
"签字获取数据"
,
params
);
all_data
[
index
]
=
params
;
const
logContent
=
getLogContent
(
LOG_TYPE_ENUM
.
sign
,
"签字"
,
"机房巡检"
);
// 更新巡检list
console
.
log
(
"all_data存储"
,
all_data
);
console
.
log
(
"all_data一个"
,
all_data
[
index
]);
this
.
$store
.
commit
(
"SET_ALL_DATA"
,
all_data
);
const
userInfo
=
this
.
userInfo
;
const
inspectList
=
all_data
.
filter
(
(
item
)
=>
item
.
createByName
==
userInfo
.
user
);
writeInspectionData
(
inspectList
,
userInfo
.
user
);
// 更新日志
const
log_list
=
this
.
$store
.
state
.
log_list
;
logContent
.
inspectionType
=
params
.
inspectionType
;
log_list
.
push
(
logContent
);
this
.
$store
.
commit
(
"SET_LOG_LIST"
,
log_list
);
addLog
(
log_list
).
then
((
res
)
=>
{
console
.
log
(
"日志文件写入成功"
);
});
if
(
type
===
'sign'
)
{
inspectApi
.
updateSignImg
({
id
:
params
.
id
,
signImg
:
params
.
signImg
,
synFlag
:
0
})
}
uni
.
showToast
({
title
:
type
==
"sign"
?
"签字成功"
:
"同步成功"
,
icon
:
"success"
,
});
this
.
getActiveTabDetails
(
0
);
},
lookTable
()
{
uni
.
navigateTo
({
url
:
"/pages/report/sampleTable?isJF=0"
,
});
},
// 跳转到具体的井道
toShaftInspection
(
value
,
dictValue
,
location
)
{
uni
.
navigateTo
({
url
:
`/pages/shaftInspection/shaftInspectionNew?value=
${
value
}
&dictValue=
${
dictValue
}
&inspectionCode=
${
this
.
inspectionCode
}
&location=
${
location
}
&uid=
${
this
.
uid
}
&backValue=
${
this
.
backValue
}
`
,
});
},
back
()
{
if
(
this
.
backValue
===
"home"
)
{
uni
.
navigateTo
({
url
:
"/pages/home/home"
,
});
}
else
{
uni
.
navigateTo
({
url
:
`/pages/inspectionManagement/index`
,
});
}
},
openDialog
(
val
)
{
if
(
val
)
{
let
data
=
dataToSql
(
this
.
detailsInfo
)
this
.
list
=
[{
...
data
,
id
:
this
.
uid
}]
}
else
{
this
.
list
=
[]
}
this
.
showSyncDialog
=
val
}
},
};
</
script
>
<
style
lang=
"less"
scoped
>
/* 导航栏样式 */
.nav-right {
width: 192px;
}
.header-buttons {
display: flex;
align-items: center;
margin-left: auto; // 将按钮组推到最右侧
.button {
width: 89.6px;
height: 28.8px;
background: #ffffff;
border-radius: 14.4px;
margin-left: 12.8px;
font-family: PingFangSC-Regular;
font-size: 12.8px;
color: #000000;
line-height: 28.8px;
font-weight: 400;
text-align: center;
}
}
.container {
background-image: linear-gradient(115deg, #e8f0fb 0%, #e1ebfa 100%);
padding: 0 25.6px;
height: 100vh;
overflow: hidden;
.profile-section {
width: 100%;
margin-bottom: 12.8px;
.profile-box {
background-color: #fff;
border-radius: 9.6px;
padding: 12.8px 25.6px;
display: flex;
justify-content: space-between;
align-items: center;
.profile-left {
display: flex;
align-items: center;
.avatar {
position: relative;
width: 51.2px;
height: 51.2px;
border-radius: 50%;
overflow: hidden;
margin-right: 9.6px;
image {
width: 100%;
height: 100%;
}
.change-password {
position: absolute;
bottom: 0;
left: 0;
right: 0;
background-color: rgba(0, 0, 0, 0.5);
text-align: center;
height: 17.6px;
font-family: PingFangSC-Regular;
font-size: 9.6px;
color: #ffffff;
line-height: 16px;
font-weight: 400;
}
}
.info {
margin-right: 9.6px;
.username {
font-size: 16px;
color: #000000;
line-height: 22.4px;
font-weight: 500;
margin-bottom: 7.2px;
}
.number {
font-size: 12.8px;
color: #4a4a4a;
line-height: 22.4px;
font-weight: 400;
.value {
color: #000000;
}
}
}
}
.profile-right {
display: flex;
.inspection-button {
width: 89.6px;
height: 28.8px;
background-image: linear-gradient(105deg, #68acfb 0%, #3774f6 100%);
border-radius: 14.4px;
font-family: PingFangSC-Regular;
font-size: 12.8px;
color: #ffffff;
line-height: 28.8px;
font-weight: 400;
margin-right: 12.8px;
}
.record-button {
width: 115.2px;
height: 28.8px;
background: #ffffff;
border: 0.8px solid rgba(55, 116, 246, 1);
border-radius: 14.4px;
font-family: PingFangSC-Regular;
font-size: 12.8px;
color: #3774f6;
line-height: 28.8px;
font-weight: 400;
}
.action-container {
display: flex;
.record-button.small {
width: 75px;
margin-right: 10px;
}
.inspection-button {
display: flex;
align-items: center;
justify-content: center;
width: 115.2px;
height: 28.8px;
color: #fff;
background-image: linear-gradient(180deg, #3773f6 0%, #2c57f6 99%);
box-shadow: 0px 8px 19.2px 0px rgba(51, 104, 246, 0.24);
border-radius: 14.4px;
}
.sign-img {
width: 80px;
height: 28.8px;
margin-right: 10px;
border: 1px solid #ccc;
// border-right: none;
border-radius: 3px;
}
}
}
}
}
/* 页面容器 */
.content-box {
width: 100%;
height: calc(100vh - 190px);
border-radius: 9.6px;
overflow: hidden;
background-color: #ffffff;
display: flex;
/* 左侧模块 */
.left-side {
width: 120px;
height: 100%;
background-color: #f9f9f9;
display: flex;
flex-direction: column;
align-items: center;
padding-top: 12.8px;
.tab-item {
width: 100%;
height: 38.4px;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
color: #333333;
cursor: pointer;
&.active {
background-color: #ffffff;
}
}
}
/* 右侧模块 */
.right-side {
flex: 1;
padding: 12.8px 18.4px;
display: flex;
flex-direction: column;
.button-group {
display: flex;
margin-bottom: 12.8px;
.button {
height: 27.2px;
background-color: rgba(55, 116, 246, 0.08);
display: flex;
align-items: center;
justify-content: center;
font-size: 11.2px;
color: #3774f6;
border-radius: 3.2px;
&:first-child {
width: 97.6px;
font-size: 11.2px;
color: #4a4a4a;
letter-spacing: 0;
font-weight: 400;
.number {
color: #000000;
font-weight: 500;
}
}
&:last-child {
flex: 1;
margin-left: 9.6px;
padding: 0 9.6px;
text-align: left;
display: flex;
justify-content: flex-start;
font-size: 11.2px;
color: #4a4a4a;
letter-spacing: 0;
font-weight: 400;
.icon-tixing {
color: #3774f6;
font-size: 9.6px;
margin-right: 6.4px;
}
}
}
}
.card-box {
overflow: auto;
.card-group {
flex: 1;
.card-title {
font-size: 12.8px;
font-weight: bold;
color: #333333;
margin: 12.8px 0;
}
.card-list {
display: flex;
flex-wrap: wrap;
gap: 12.8px;
.card {
width: 105.6px;
height: 51.2px;
background-color: #f9f9f9;
border-radius: 6.4px;
padding: 6.4px 10.312px;
box-sizing: border-box;
&.status1 {
background: #f3f7ff;
}
&.status2 {
background: #fff5f4;
}
.card-content {
display: flex;
flex-direction: column;
justify-content: space-between;
.status-line {
display: flex;
align-items: center;
margin-bottom: 3px;
.iconfont {
font-size: 12px;
margin-right: 6.4px;
&.icon-weixunjian {
color: #959595;
}
&.icon-shibai1 {
color: #ff4a34;
}
&.icon-wancheng {
color: #3774f6;
}
}
.status-text {
font-size: 12px;
color: #7c7c7c;
text-align: center;
line-height: 16.5px;
font-weight: 400;
}
}
.info-line {
margin-left: 20px;
font-size: 12px;
color: #000000;
line-height: 16.5px;
font-weight: 400;
}
}
}
}
}
}
}
}
}
</
style
>
<
template
>
<!-- 井道巡检列表 -->
<view
class=
"container"
>
<uni-nav-bar
:fixed=
"true"
background-color=
"rgba(214, 240, 255, 0.0)"
status-bar
rightWidth=
"300"
>
<block
slot=
"left"
>
<view
class=
""
@
click=
"back"
>
<text
class=
"iconfont icon-fanhui"
></text>
</view>
</block>
<block
slot=
"right"
class=
"nav-right"
>
<view
class=
"header-buttons"
>
<view
class=
"button"
@
click=
"lookTable"
>
查看样表
</view>
</view>
</block>
</uni-nav-bar>
<!-- 第二个模块 -->
<view
class=
"profile-section"
>
<view
class=
"profile-box"
>
<view
class=
"profile-left"
>
<view
class=
"avatar"
>
<image
src=
"@/static/img/add-img/defaultAvatar.png"
mode=
"aspectFit"
></image>
</view>
<view
class=
"info"
>
<view
class=
"username"
>
{{
userInfo
.
user
}}
</view>
<view
class=
"number"
>
巡检编号:
<text
class=
"value"
>
{{
inspectionCode
}}
</text></view
>
</view>
</view>
<!--
{{
isSubmit
}}
{{
isSign
}}
-->
<view
class=
"profile-right"
>
<button
v-if=
"!isSign"
:disabled=
"!isSubmit"
:class=
"
{
'record-button': true,
'disabled-btn': !isSubmit,
}"
@click="toSign"
>
巡检人签字
</button>
<view
v-else-if=
"detailsInfo.synchronization != 1"
class=
"action-container"
>
<image
class=
"sign-img"
:src=
"detailsInfo.signImg"
mode=
"aspectFit"
>
</image>
<button
class=
"record-button small"
@
click=
"toSign"
>
重签
</button>
<view
class=
"inspection-button"
@
click=
"openDialog(true)"
>
数据同步
</view
>
</view>
</view>
</view>
</view>
<view
v-if=
"!isSign"
class=
"content-box"
>
<!-- 左侧模块 -->
<view
class=
"left-side"
>
<view
v-for=
"(tab, index) in tabs.slice(0, 7)"
:key=
"index"
:class=
"['tab-item',
{ active: activeTab === index }]"
@click="getActiveTab(index)"
>
{{
tab
}}
</view>
</view>
<!-- 右侧模块 -->
<view
class=
"right-side"
>
<!-- 第一部分:按钮 -->
<view
class=
"button-group"
>
<view
class=
"button"
>
已巡检
<text
class=
"number"
>
{{
inspectionNumber
}}
</text
>
个井道
</view
>
<view
class=
"button"
>
<text
class=
"iconfont icon-tixing"
></text
>
请点击“需巡检井道”执行巡检
</view
>
</view>
<!-- 第二部分:卡片组 -->
<view
class=
"card-box"
>
<view
class=
"card-group"
v-for=
"(item, index) in cardsInfo"
:key=
"index"
>
<view
class=
"card-title"
>
{{
item
.
name
}}
</view>
<view
class=
"card-list"
>
<view
v-for=
"position in item.position"
:key=
"position.dictValue"
class=
"card"
:class=
"
{
status1: position.status == 1,
status2: position.status == 2,
}"
@click="
toShaftInspection(
item.value,
position.dictValue,
item.name + position.dictLabel
)
"
>
<view
class=
"card-content"
>
<view
class=
"status-line"
>
<text
v-if=
"position.status == 0"
class=
"iconfont icon-weixunjian"
></text>
<text
v-if=
"position.status == 1"
class=
"iconfont icon-wancheng"
></text>
<text
v-if=
"position.status == 2"
class=
"iconfont icon-shibai1"
></text>
<text
v-if=
"position.isSubmit === 0"
class=
"status-text"
>
草稿
</text
>
<text
v-else
class=
"status-text"
>
{{
position
.
statusLable
}}
</text>
</view>
<view
class=
"info-line"
>
<text
class=
"info-text"
>
{{
item
.
name
}}{{
position
.
dictLabel
}}
</text
>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view
v-else
class=
"content-box"
>
<!-- 左侧模块 -->
<view
class=
"left-side"
>
<view
v-for=
"(tab, index) in tabsDetail.slice(0, 7)"
:key=
"index"
:class=
"['tab-item',
{ active: activeTab === index }]"
@click="getActiveTabDetails(index, tab)"
>
{{
tab
}}
</view>
</view>
<!-- 右侧模块 -->
<view
class=
"right-side"
>
<!-- 第二部分:卡片组 -->
<view
class=
"card-box"
>
<view
class=
"card-group"
v-for=
"(item, index) in cardsInfo"
:key=
"index"
>
<view
class=
"card-title"
>
{{
item
.
name
}}
</view>
<view
class=
"card-list"
>
<view
v-for=
"position in item.position"
:key=
"position.dictValue"
class=
"card"
:class=
"
{
status1: position.status == 1,
status2: position.status == 2,
}"
@click="getDetailsItem(item.value, position.dictCode)"
>
<view
class=
"card-content"
>
<view
class=
"status-line"
>
<text
v-if=
"position.status == 0"
class=
"iconfont icon-weixunjian"
></text>
<text
v-if=
"position.status == 1"
class=
"iconfont icon-wancheng"
></text>
<text
v-if=
"position.status == 2"
class=
"iconfont icon-shibai1"
></text>
<text
v-if=
"position.isSubmit === 0"
class=
"status-text"
>
草稿
</text
>
<text
v-else
class=
"status-text"
>
{{
position
.
statusLable
}}
</text>
</view>
<view
class=
"info-line"
>
<text
class=
"info-text"
>
{{
item
.
name
}}{{
position
.
dictLabel
}}
</text
>
</view>
</view>
</view>
</view>
</view>
<view
v-if=
"isShow"
class=
"card-group"
>
<detail
ref=
"detail"
:detailsItem=
"detailsItem"
></detail
></view>
</view>
</view>
</view>
<signDialog
ref=
"signDialog"
@
confirm=
"handlePopupConfirm"
></signDialog>
<Dialog
v-show=
"showSyncDialog"
:list=
"list"
@
close=
"openDialog(false)"
></Dialog>
</view>
</
template
>
<
script
>
import
moment
from
"moment"
;
import
{
pad_2_1_inspection_position
,
pad_2_1_floor
}
from
"@/utils/dict.js"
;
import
{
writeInspectionData
,
addLog
,
getLogContent
,
LOG_TYPE_ENUM
,
}
from
"@/utils/IoReadingAndWriting.js"
;
import
{
getInspectionDetails
}
from
"@/request/index.js"
;
import
inspectApi
from
"@/api/inspect"
;
import
signDialog
from
"@/components/signDialog.vue"
;
import
detail
from
"./model/detail.vue"
;
import
Dialog
from
"@/pages/inspectionManagement/dialog.vue"
;
import
{
sqlToData
,
dataToSql
}
from
"./shared"
;
export
default
{
components
:
{
signDialog
,
detail
,
Dialog
,
},
data
()
{
return
{
tabs
:
[
"所有井道"
],
// 选项卡内容
tabsDetail
:
[
"所有井道"
],
activeTab
:
0
,
// 默认选中的选项卡
inspectionNumber
:
0
,
// 已巡检的井道数量
cards
:
[
"A座-1楼"
,
"A座-2楼"
,
"A座-3楼"
,
"A座-4楼"
,
"A座-5楼"
,
"A座-6楼"
,
"A座-7楼"
,
"A座-8楼"
,
],
// 卡片内容
inspectionCode
:
""
,
cardsInfo
:
[],
//卡片数据
tabList
:
[],
activeTabIndex
:
0
,
baseInfo
:
{},
// 基础信息
tempForm
:
{
// 对应每个tab下的数据 [示例 0: 数据]
},
detailsInfo
:
{},
// 详情
isDisable
:
false
,
// 禁用
isSign
:
false
,
//签名状态
isSubmit
:
0
,
//提交状态
uid
:
""
,
options
:
{},
//存储数据
backValue
:
""
,
all_data
:
[],
//所有数据
detailsItem
:
{},
//单个井道详情
isShow
:
false
,
showSyncDialog
:
false
,
list
:
[],
};
},
computed
:
{
userInfo
()
{
return
this
.
$store
.
state
.
now_user
||
{};
},
isOperationPermissions
()
{
// 是否有操作权限
const
{
uid
,
createByName
}
=
this
.
detailsInfo
;
return
!
uid
||
(
uid
&&
createByName
==
this
.
userInfo
.
user
);
},
},
onLoad
(
options
)
{
this
.
options
=
options
;
this
.
backValue
=
this
.
options
.
backValue
||
""
;
this
.
isDisable
=
this
.
options
.
isDisable
==
1
?
true
:
false
;
console
.
log
(
"options.uid"
,
this
.
options
.
uid
);
this
.
uid
=
this
.
options
.
uid
||
""
;
},
onShow
()
{
if
(
this
.
uid
)
{
this
.
getDetails
(
this
.
uid
);
}
else
{
this
.
init
();
}
this
.
all_data
=
this
.
$store
.
state
.
all_data
;
},
mounted
()
{},
methods
:
{
init
()
{
return
new
Promise
((
resolve
,
reject
)
=>
{
this
.
tabList
=
pad_2_1_inspection_position
.
rows
.
map
((
item
,
index
)
=>
{
this
.
tabs
.
push
(
item
.
dictLabel
);
return
{
name
:
item
.
dictLabel
,
value
:
item
.
dictValue
,
isVaild
:
false
,
// 校验通过
// type: 1, // 枚举值
position
:
pad_2_1_floor
.
rows
,
refName
:
`TabContentItem_
${
index
}
`
,
descript
:
"检查内容包括门禁、卫生、设备告警。"
,
};
});
this
.
cardsInfo
=
this
.
tabList
;
this
.
inspectionCode
=
`JDXJ
${
moment
().
format
(
"yyyyMMDDHHmmss"
)}${
Math
.
floor
(
Math
.
random
()
*
900
)
+
100
}
`
;
console
.
log
(
"this.tabList"
,
this
.
tabList
);
if
(
this
.
detailsInfo
.
inspectionType
)
{
const
fillCheck
=
this
.
detailsInfo
.
fillCheck
.
split
(
","
);
setTimeout
(()
=>
{
this
.
tabList
.
forEach
((
item
,
index
)
=>
{
item
.
isVaild
=
fillCheck
.
includes
(
item
.
value
);
this
.
tempForm
[
index
]
&&
this
.
setComponentData
(
item
.
refName
,
this
.
tempForm
[
index
]);
});
},
500
);
}
else
{
this
.
baseInfo
=
this
.
$store
.
state
.
temp_data
;
}
resolve
();
});
},
// 获取井道详情
getDetailsItem
(
value
,
dictCode
)
{
let
item
=
this
.
detailsInfo
.
originData
.
find
((
building
)
=>
building
.
value
===
value
)
?.
position
.
find
((
pos
)
=>
pos
.
dictCode
===
dictCode
);
if
(
item
.
status
<
1
)
{
uni
.
showToast
({
title
:
"该井道暂无数据"
,
icon
:
"none"
,
});
}
this
.
detailsItem
=
item
.
details
;
this
.
isShow
=
true
;
console
.
log
(
"this.detailsItem"
,
this
.
detailsItem
);
},
getActiveTab
(
index
)
{
this
.
activeTab
=
index
;
console
.
log
(
"this.activeTab"
,
this
.
activeTab
);
if
(
this
.
activeTab
==
0
)
{
this
.
cardsInfo
=
this
.
tabList
;
}
else
{
this
.
cardsInfo
=
[
this
.
tabList
[
index
-
1
]];
}
},
getActiveTabDetails
(
index
,
tab
)
{
this
.
activeTab
=
index
;
// this.cardsInfo = [selected];
// this.cardsInfo = [this.tabList[index]];
if
(
this
.
activeTab
==
0
)
{
this
.
cardsInfo
=
this
.
tabList
;
}
else
{
let
selected
=
this
.
tabList
.
find
((
t
)
=>
t
.
name
===
tab
);
this
.
cardsInfo
=
[
selected
];
}
this
.
isShow
=
false
;
},
// 回显数据
getDetails
(
uid
)
{
uni
.
showLoading
();
inspectApi
.
info
(
uid
)
.
then
((
res
)
=>
{
console
.
log
(
res
);
const
detailsInfo
=
sqlToData
(
res
);
console
.
log
(
"detailsInfo"
,
detailsInfo
);
this
.
detailsInfo
=
detailsInfo
;
this
.
inspectionNumber
=
detailsInfo
.
inspectionNumber
;
if
(
detailsInfo
.
synchronization
===
1
)
{
// 已同步数据的查看详情时,只展示'已巡检'的井道信息,过滤未巡检的井道
let
defaultList
=
detailsInfo
.
originData
;
this
.
cardsInfo
=
this
.
tabList
=
defaultList
.
filter
((
building
)
=>
{
building
.
position
=
building
.
position
.
filter
(
(
pos
)
=>
pos
.
status
===
1
);
return
building
.
position
.
length
;
});
}
else
{
this
.
cardsInfo
=
this
.
tabList
=
detailsInfo
.
originData
;
}
this
.
inspectionCode
=
detailsInfo
.
inspectionCode
;
// this.cardsInfo = this.tabList = detailsInfo.originData;
this
.
isSubmit
=
this
.
detailsInfo
.
originData
.
reduce
((
acc
,
cur
)
=>
{
acc
.
push
(...
cur
.
position
);
return
acc
;
},
[])
.
every
((
pos
)
=>
pos
.
isSubmit
===
""
||
pos
.
isSubmit
===
1
);
this
.
isSign
=
!!
this
.
detailsInfo
.
signImg
;
this
.
cardsInfo
.
forEach
((
item
)
=>
{
this
.
tabs
.
push
(
item
.
name
);
this
.
tabsDetail
.
push
(
item
.
name
);
});
if
(
this
.
isSign
)
{
this
.
getActiveTabDetails
(
0
);
}
this
.
isDisable
=
this
.
isDisable
||
detailsInfo
.
synchronization
==
1
;
// 是否禁用 1:已同步数据 0: 未同步数据
uni
.
hideLoading
();
})
.
catch
((
error
)
=>
{
uni
.
showToast
({
title
:
error
.
msg
,
icon
:
"none"
,
duration
:
1000
,
});
uni
.
hideLoading
();
});
},
// 回显组件数据
setComponentData
(
refName
,
componentData
)
{
this
.
$refs
[
refName
][
0
]
&&
this
.
$refs
[
refName
][
0
].
setForm
(
componentData
);
},
// 删除
deleteClick
()
{
this
.
$refs
.
inputDialog2
.
open
();
},
toSign
()
{
this
.
$refs
.
signDialog
.
open
();
},
// tab选中change 时间
changeTab
(
index
,
item
)
{
this
.
draft
(
this
.
activeTabIndex
,
false
,
false
).
then
(()
=>
{
this
.
activeTabIndex
=
index
;
});
},
// 处理弹窗确认
handlePopupConfirm
(
summary
)
{
this
.
detailsInfo
.
isSign
=
this
.
isSign
=
true
;
// 回显到文字显示区域
this
.
detailsInfo
.
signImg
=
summary
;
// 回显到文字显示区域
// const isException = this.detailsInfo.originData.some(
// (item) => item.status == 2
// );
// this.detailsInfo.isException = isException ? 1 : 0; // 巡检异常
this
.
submit
(
"sign"
,
this
.
detailsInfo
.
signImg
,
this
.
detailsInfo
.
isException
);
},
// 提交
submit
(
type
=
"sign"
,
value
=
""
,
isException
)
{
const
all_data
=
this
.
all_data
;
//获取全部数据
let
params
=
this
.
detailsInfo
;
params
.
signImg
=
value
;
console
.
log
(
"all_data"
,
all_data
);
const
index
=
all_data
.
findIndex
((
element
)
=>
element
.
uid
==
this
.
uid
);
console
.
log
(
"签字获取数据"
,
params
);
all_data
[
index
]
=
params
;
const
logContent
=
getLogContent
(
LOG_TYPE_ENUM
.
sign
,
"签字"
,
"机房巡检"
);
// 更新巡检list
console
.
log
(
"all_data存储"
,
all_data
);
console
.
log
(
"all_data一个"
,
all_data
[
index
]);
this
.
$store
.
commit
(
"SET_ALL_DATA"
,
all_data
);
const
userInfo
=
this
.
userInfo
;
const
inspectList
=
all_data
.
filter
(
(
item
)
=>
item
.
createByName
==
userInfo
.
user
);
writeInspectionData
(
inspectList
,
userInfo
.
user
);
// 更新日志
const
log_list
=
this
.
$store
.
state
.
log_list
;
logContent
.
inspectionType
=
params
.
inspectionType
;
log_list
.
push
(
logContent
);
this
.
$store
.
commit
(
"SET_LOG_LIST"
,
log_list
);
addLog
(
log_list
).
then
((
res
)
=>
{
console
.
log
(
"日志文件写入成功"
);
});
if
(
type
===
"sign"
)
{
inspectApi
.
updateSignImg
({
id
:
params
.
id
,
signImg
:
params
.
signImg
,
synFlag
:
0
,
isException
,
});
}
uni
.
showToast
({
title
:
type
==
"sign"
?
"签字成功"
:
"同步成功"
,
icon
:
"success"
,
});
this
.
getActiveTabDetails
(
0
);
},
lookTable
()
{
uni
.
navigateTo
({
url
:
"/pages/report/sampleTable?isJF=0"
,
});
},
// 跳转到具体的井道
toShaftInspection
(
value
,
dictValue
,
location
)
{
uni
.
navigateTo
({
url
:
`/pages/shaftInspection/shaftInspectionNew?value=
${
value
}
&dictValue=
${
dictValue
}
&inspectionCode=
${
this
.
inspectionCode
}
&location=
${
location
}
&uid=
${
this
.
uid
}
&backValue=
${
this
.
backValue
}
`
,
});
},
back
()
{
if
(
this
.
backValue
===
"home"
)
{
uni
.
navigateTo
({
url
:
"/pages/home/home"
,
});
}
else
{
uni
.
navigateTo
({
url
:
`/pages/inspectionManagement/index`
,
});
}
},
openDialog
(
val
)
{
if
(
val
)
{
let
data
=
dataToSql
(
this
.
detailsInfo
);
this
.
list
=
[
{
...
data
,
id
:
this
.
uid
,
},
];
}
else
{
this
.
list
=
[];
}
this
.
showSyncDialog
=
val
;
},
},
};
</
script
>
<
style
lang=
"less"
scoped
>
/* 导航栏样式 */
.nav-right {
width: 192px;
}
.header-buttons {
display: flex;
align-items: center;
margin-left: auto; // 将按钮组推到最右侧
.button {
width: 89.6px;
height: 28.8px;
background: #ffffff;
border-radius: 14.4px;
margin-left: 12.8px;
font-family: PingFangSC-Regular;
font-size: 12.8px;
color: #000000;
line-height: 28.8px;
font-weight: 400;
text-align: center;
}
}
.container {
background-image: linear-gradient(115deg, #e8f0fb 0%, #e1ebfa 100%);
padding: 0 25.6px;
height: 100vh;
overflow: hidden;
.profile-section {
width: 100%;
margin-bottom: 12.8px;
.profile-box {
background-color: #fff;
border-radius: 9.6px;
padding: 12.8px 25.6px;
display: flex;
justify-content: space-between;
align-items: center;
.profile-left {
display: flex;
align-items: center;
.avatar {
position: relative;
width: 51.2px;
height: 51.2px;
border-radius: 50%;
overflow: hidden;
margin-right: 9.6px;
image {
width: 100%;
height: 100%;
}
.change-password {
position: absolute;
bottom: 0;
left: 0;
right: 0;
background-color: rgba(0, 0, 0, 0.5);
text-align: center;
height: 17.6px;
font-family: PingFangSC-Regular;
font-size: 9.6px;
color: #ffffff;
line-height: 16px;
font-weight: 400;
}
}
.info {
margin-right: 9.6px;
.username {
font-size: 16px;
color: #000000;
line-height: 22.4px;
font-weight: 500;
margin-bottom: 7.2px;
}
.number {
font-size: 12.8px;
color: #4a4a4a;
line-height: 22.4px;
font-weight: 400;
.value {
color: #000000;
}
}
}
}
.profile-right {
display: flex;
.inspection-button {
width: 89.6px;
height: 28.8px;
background-image: linear-gradient(105deg, #68acfb 0%, #3774f6 100%);
border-radius: 14.4px;
font-family: PingFangSC-Regular;
font-size: 12.8px;
color: #ffffff;
line-height: 28.8px;
font-weight: 400;
margin-right: 12.8px;
}
.record-button {
width: 115.2px;
height: 28.8px;
background: #ffffff;
border: 0.8px solid rgba(55, 116, 246, 1);
border-radius: 14.4px;
font-family: PingFangSC-Regular;
font-size: 12.8px;
color: #3774f6;
line-height: 28.8px;
font-weight: 400;
&.disabled-btn {
color: #c7c7c7;
border-color: #c7c7c7;
}
}
.action-container {
display: flex;
.record-button.small {
width: 75px;
margin-right: 10px;
}
.inspection-button {
display: flex;
align-items: center;
justify-content: center;
width: 115.2px;
height: 28.8px;
color: #fff;
background-image: linear-gradient(180deg, #3773f6 0%, #2c57f6 99%);
box-shadow: 0px 8px 19.2px 0px rgba(51, 104, 246, 0.24);
border-radius: 14.4px;
}
.sign-img {
width: 80px;
height: 28.8px;
margin-right: 10px;
border: 1px solid #ccc;
// border-right: none;
border-radius: 3px;
}
}
}
}
}
/* 页面容器 */
.content-box {
width: 100%;
height: calc(100vh - 190px);
border-radius: 9.6px;
overflow: hidden;
background-color: #ffffff;
display: flex;
/* 左侧模块 */
.left-side {
width: 120px;
height: 100%;
background-color: #f9f9f9;
display: flex;
flex-direction: column;
align-items: center;
padding-top: 12.8px;
.tab-item {
width: 100%;
height: 38.4px;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
color: #333333;
cursor: pointer;
&.active {
background-color: #ffffff;
}
}
}
/* 右侧模块 */
.right-side {
flex: 1;
padding: 12.8px 18.4px;
display: flex;
flex-direction: column;
.button-group {
display: flex;
margin-bottom: 12.8px;
.button {
height: 27.2px;
background-color: rgba(55, 116, 246, 0.08);
display: flex;
align-items: center;
justify-content: center;
font-size: 11.2px;
color: #3774f6;
border-radius: 3.2px;
&:first-child {
width: 97.6px;
font-size: 11.2px;
color: #4a4a4a;
letter-spacing: 0;
font-weight: 400;
.number {
color: #000000;
font-weight: 500;
}
}
&:last-child {
flex: 1;
margin-left: 9.6px;
padding: 0 9.6px;
text-align: left;
display: flex;
justify-content: flex-start;
font-size: 11.2px;
color: #4a4a4a;
letter-spacing: 0;
font-weight: 400;
.icon-tixing {
color: #3774f6;
font-size: 9.6px;
margin-right: 6.4px;
}
}
}
}
.card-box {
overflow: auto;
.card-group {
flex: 1;
.card-title {
font-size: 12.8px;
font-weight: bold;
color: #333333;
margin: 12.8px 0;
}
.card-list {
display: flex;
flex-wrap: wrap;
gap: 12.8px;
.card {
width: 105.6px;
height: 51.2px;
background-color: #f9f9f9;
border-radius: 6.4px;
padding: 6.4px 10.312px;
box-sizing: border-box;
&.status1 {
background: #f3f7ff;
}
&.status2 {
background: #fff5f4;
}
.card-content {
display: flex;
flex-direction: column;
justify-content: space-between;
.status-line {
display: flex;
align-items: center;
margin-bottom: 3px;
.iconfont {
font-size: 12px;
margin-right: 6.4px;
&.icon-weixunjian {
color: #959595;
}
&.icon-shibai1 {
color: #ff4a34;
}
&.icon-wancheng {
color: #3774f6;
}
}
.status-text {
font-size: 12px;
color: #7c7c7c;
text-align: center;
line-height: 16.5px;
font-weight: 400;
}
}
.info-line {
margin-left: 20px;
font-size: 12px;
color: #000000;
line-height: 16.5px;
font-weight: 400;
}
}
}
}
}
}
}
}
}
</
style
>
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论