2024-04-01 14:13:13 +08:00

578 lines
15 KiB
Vue

<template>
<div class="list-detail" v-if="showDialog">
<div class="dialog-content">
<div class="dialog-title">
<div class="title-img"><img src="@/assets/images/titleIcon.png" alt="" /></div>
<div class="title-text">
<i>工作票数据</i>
</div>
</div>
<div class="dialog-article">
<div class="dialog-input">
<el-input v-model="selectTitle" placeholder="请输入工作票编号" size="small" @change="searchChange"> </el-input>
</div>
<div class="main-article" v-if="articleNewList.length > 0">
<el-scrollbar class="left-content">
<div class="content-tab">
<div
class="tab-box"
:style="boxStyle(item)"
v-for="(item, index) in articleNewList"
:key="item.id"
@click="activeBtn(item)"
>
<div class="text" :title="item.title" :style="getStyle(item)">{{ item.workTicketSn || "" }}</div>
<div class="time">时间: {{ item.createTime || "" }}</div>
</div>
</div>
</el-scrollbar>
<div class="center-content">
<div class="center-content-box">
<el-row :gutter="12">
<el-col :span="12">
<div class="col-content">
<span>工程名称</span>
<div class="col-content-item">{{ detailData.projectName || "" }}</div>
</div>
</el-col>
<el-col :span="12">
<div class="col-content">
<span>工作票编号</span>
<div class="col-content-item">{{ detailData.workTicketSn || "" }}</div>
</div>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="12">
<div class="col-content">
<span>开始时间</span>
<div class="col-content-item">{{ detailData.startTime || "" }}</div>
</div>
</el-col>
<el-col :span="12">
<div class="col-content">
<span>施工班组</span>
<div class="col-content-item">{{ detailData.constructionTeam || "" }}</div>
</div>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="12">
<div class="col-content">
<span>结束时间</span>
<el-date-picker
v-if="isEdit"
v-model="detailData.endTime"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
:clearable="true"
/>
<div class="col-content-item" v-else>{{ detailData.endTime || "" }}</div>
</div>
</el-col>
<el-col :span="12">
<div class="col-content">
<span>初勘风险等级</span>
<div class="col-content-item">{{ detailData.initialSurveyRiskLevel || "" }}</div>
</div>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="12">
<div class="col-content">
<span>执行方案名称</span>
<div class="col-content-item">{{ detailData.executionPlanName || "" }}</div>
</div>
</el-col>
<el-col :span="12">
<div class="col-content">
<span>复测后的风险等级</span>
<div class="col-content-item">{{ detailData.riskLevelAfterRetest || "" }}</div>
</div>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="12">
<div class="col-content">
<span>施工人数</span>
<div class="col-content-item">{{ detailData.constructionWorkerNumber || "" }}</div>
</div>
</el-col>
<el-col :span="12">
<div class="col-content">
<span>作业类型、工序及部位</span>
<div class="col-content-item">{{ detailData.rtRiskSecurityLibraryTypeStr || "" }}</div>
</div>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="24">
<div class="col-content">
<span>作业部位</span>
<div class="col-content-item" style="height: 60px">{{ detailData.workPart || "" }}</div>
</div>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="24">
<div class="col-content">
<span>地理位置</span>
<div class="col-content-item" style="height: 60px">{{ detailData.geographicalLocation || "" }}</div>
</div>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="12">
<div class="col-content">
<span>班组负责人</span>
<div class="col-content-item">{{ detailData.teamLeader || "" }}</div>
</div>
</el-col>
<el-col :span="12">
<div class="col-content">
<span>一般作业人员</span>
<div class="col-content-item">{{ detailData.generalOperatePersonnel || "" }}</div>
</div>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="12">
<div class="col-content">
<span>班组安全员</span>
<div class="col-content-item">{{ detailData.teamSafetyOfficer || "" }}</div>
</div>
</el-col>
<el-col :span="12">
<div class="col-content">
<span>班组技术人员</span>
<div class="col-content-item">{{ detailData.teamTechnicalStaff || "" }}</div>
</div>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="24">
<div class="col-content">
<span>主要风险</span>
<div class="col-content-item" style="height: 60px">{{ detailData.mainRisk || "" }}</div>
</div>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="12">
<div class="col-content">
<span>作业必备条件</span>
<div class="col-content-item" style="height: 60px">{{ detailData.jobPrerequisite || "" }}</div>
</div>
</el-col>
<el-col :span="12">
<div class="col-content">
<span>作业过程风险控制措施</span>
<div class="col-content-item" style="height: 60px">
{{ detailData.operationProcessRiskControlMeasure || "" }}
</div>
</div>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="24">
<div class="col-content">
<span>现场风险复测变化情况及补充控制措施</span>
<div class="col-content-item" style="height: 60px">
{{ detailData.riskRetestChangesAndSupplementaryControlMeasure || "" }}
</div>
</div>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="12">
<div class="col-content">
<span>签发日期</span>
<div class="col-content-item">{{ detailData.issueDate || "" }}</div>
</div>
</el-col>
<el-col :span="6">
<div class="col-content">
<span>工作票</span>
<el-button @click="previewFile()">预览</el-button>
</div>
</el-col>
<el-col :span="6">
<div class="col-content">
<span>操作</span>
<el-button @click="editOperate" v-if="!isEdit">编辑</el-button>
<el-button @click="saveOperate" v-else>保存</el-button>
</div>
</el-col>
</el-row>
</div>
</div>
<div class="right-content">
<el-carousel indicator-position="none" height="450px" v-if="detailData.videoList && detailData.videoList.length > 0">
<el-carousel-item v-for="(item, index) in detailData.videoList" :key="item.id">
<div style="width: 100%; height: 100%">
<ckplayerComp
:name="index"
:poster="''"
:deviceIp="`http://${item.account}:${item.password}`"
:videoUrls="item.serialNumber"
:autoPlay="true"
></ckplayerComp>
</div>
</el-carousel-item>
</el-carousel>
<!-- <ckplayerComp
:name="0"
:poster="''"
:deviceIp="`http://${detailData.videoList[0].account}:${detailData.videoList[0].password}`"
:videoUrls="detailData.videoList[0].serialNumber"
:autoPlay="true"
v-if="detailData.videoList && detailData.videoList.length > 0"
></ckplayerComp> -->
</div>
</div>
<div class="notoDta" v-else>
<img src="@/assets/images/noData.png" alt="" />
<p>暂无数据</p>
</div>
</div>
<div class="close-icon" @click="closeDialog">
<el-icon><Close /></el-icon>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted, watch, defineEmits } from "vue";
import { GlobalStore } from "@/stores";
import { getWorkTicketDetail, editWorkTicketDetail } from "@/api/modules/headNoise";
import firstIcon from "@/assets/images/smartPartyBuilding/contentBox.png";
import ckplayerComp from "../../videoManagement/ckplayerComp.vue";
import { ElMessage } from "element-plus";
const isEdit = ref(false);
const detailId = ref("" as any);
const detailData = ref({} as any);
const articleNewList = ref([] as any);
const store = GlobalStore();
const selectTitle = ref("" as any);
let showDialog = ref(false as any);
const postData = ref({} as any);
const emit = defineEmits(['call-parent-function']);
// 保存操作
const saveOperate = async () => {
const res: any = await editWorkTicketDetail({ ...detailData.value });
if (res.success) {
ElMessage({
showClose: true,
message: "操作成功",
type: "success"
});
isEdit.value = false;
emit('call-parent-function')
}
};
// 编辑操作
const editOperate = () => {
isEdit.value = true;
};
// 预览文件
const previewFile = () => {
let data = JSON.parse(detailData.value.workTicket);
if (data.length != 0) {
let imageurl = data[0].urlJson;
window.open("http://jxjzw.zhgdyun.com:8012/onlinePreview?url=" + imageurl);
}
};
const getStyle = (item: any) => {
if (item.isActive) {
let choiseStyle = {
color: "#4AC0F3"
};
return choiseStyle;
}
return {};
};
const activeBtn = (item: any) => {
let currentState = item.isActive;
if (!currentState) {
articleNewList.value.forEach((el: any) => {
el.isActive = false;
});
item.isActive = !currentState;
detailId.value = item.id;
detailData.value = item;
}
// 取消编辑态
isEdit.value = false;
setVideoElement();
};
const boxStyle = (item: any) => {
if (item.isActive) {
let choiseStyle = {
background: `url(${firstIcon}) no-repeat`,
backgroundSize: "100% 100%"
};
return choiseStyle;
}
return {};
};
// 列表查询工作票
const getDataList = async () => {
let requestData = {
projectSn: store.sn,
type: postData.value.tip,
workTicketSn: selectTitle.value,
pageSize: -1
};
if (!requestData.type) {
requestData.type = 2;
}
// 当前类型
const res: any = await getWorkTicketDetail(requestData);
if (res.success && res.result.records.length !== 0) {
console.log(res);
let newArray = res.result.records;
newArray[0].isActive = true;
articleNewList.value = newArray;
detailData.value = newArray[0];
setVideoElement();
} else {
articleNewList.value = [];
detailData.value = {};
}
};
const setVideoElement = () => {
// 为了解决视频播放器渲染,第二个总是会默认显示一半,我动态设置样式让视图刷新,只要设置百分百就有问题,所以只能使用此方法
setTimeout(() => {
// 获取所有的 video 元素
var videos = document.getElementsByTagName("video");
// 遍历所有的 video 元素
for (var i = 0; i < videos.length; i++) {
// 修改视频元素的样式
videos[i].style.width = "99.9%";
videos[i].style.height = "99.9%";
}
}, 1000);
}
const searchChange = (e: any) => {
getDataList();
};
const closeDialog = () => {
showDialog.value = false;
postData.value = {};
};
function openDialog(obj: any) {
postData.value = obj;
showDialog.value = true;
}
// 暴露给父组件的参数和方法(外部需要什么,都可以从这里暴露出去)
defineExpose({
openDialog
});
watch(
() => showDialog.value,
newData => {
if (newData) {
getDataList();
}
}
);
// onMounted(async () => {
// await getDataList();
// });
</script>
<style lang="scss" scoped>
.list-detail {
position: absolute;
width: 100%;
height: 100%;
top: 0%;
left: 0%;
background: rgba(7, 28, 49, 0.5);
z-index: 100;
.dialog-content {
position: absolute;
box-sizing: border-box;
padding: 1%;
left: 12%;
top: 6%;
width: 80%;
height: 90%;
background: url("@/assets/images/aIEarlyWarning/dialogBg.png") no-repeat;
background-size: 100% 100%;
z-index: 21;
}
.dialog-content {
.political-outlook {
height: 100%;
}
.dialog-article {
width: 100%;
height: calc(100% - 50px);
position: relative;
.notoDta {
top: 20%;
width: 30%;
left: 35%;
position: absolute;
text-align: center;
img {
width: 40%;
margin: 5% 30%;
}
p {
color: #fff;
font-size: calc(100vw * 14 / 1920);
margin: -6% 37%;
}
}
.dialog-input {
width: 15%;
margin-left: 1%;
padding: 1% 0;
}
.main-article {
width: 100%;
height: 95%;
display: flex;
.left-content {
width: 25%;
height: 100%;
border-right: 2px solid #405e97;
.content-tab {
width: 90%;
height: 100%;
.tab-box {
box-sizing: border-box;
padding: 5%;
width: 100%;
height: 17%;
margin-top: 5%;
// background: url("@/assets/images/smartPartyBuilding/contentBox.png") no-repeat;
// background-size: 100% 100%;
.text {
white-space: nowrap; //单行
overflow: hidden;
text-overflow: ellipsis;
font-size: 14px;
color: rgba(255, 255, 255, 0.8);
cursor: pointer;
}
.time {
margin-top: 5%;
color: #a1accb;
font-size: 12px;
}
}
}
}
.center-content {
box-sizing: border-box;
padding: 0 2%;
width: 50%;
height: 100%;
&-box {
:deep() {
.el-row:not(:first-child) {
margin-top: 15px;
}
}
.col-content {
display: flex;
align-items: center;
span {
width: 100px;
display: inline-block;
text-align: right;
margin-right: 10px;
color: white;
}
&-item {
color: white;
flex: 1;
border: 1px solid #2f5db7;
background-color: #08203a;
color: white;
text-indent: 0.5em;
height: 40px;
overflow-wrap: anywhere;
overflow-y: scroll;
}
}
}
}
.right-content {
width: 30%;
height: 50%;
}
}
}
.close-icon {
position: absolute;
right: 3%;
top: 3%;
cursor: pointer;
color: #ffffff;
font-size: 18px;
}
.dialog-title {
color: #ffffff;
font-weight: bold;
font-size: 18px;
font-family: "OPPOSans-Bold";
display: flex;
align-items: center;
.title-img {
width: 3%;
height: 3%;
img {
width: 100%;
height: 100%;
}
}
.title-text {
margin-left: 1%;
}
}
}
}
.notoDta {
top: 73%;
width: 12%;
left: 44%;
position: absolute;
img {
width: 40%;
margin: 5% 30%;
}
p {
color: #fff;
font-size: 14px;
margin: -6% 37%;
}
}
// element 组件样式
:deep() {
.el-date-editor .el-range-input,
.el-range-separator,
.el-form-item__label {
color: #fff;
}
.el-input__wrapper {
background: #112d59;
}
.el-input__inner {
color: #fff;
}
.el-button {
background-color: #2758c0;
color: white;
border-color: transparent;
}
}
</style>