zhgdyun/src/views/projectFront/workTicketManage/homeworkControlProcess.vue

2833 lines
82 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<!-- 检查部位 -->
<div class="whiteBlock" style="height: 100%">
<div class="checkPoint">
<div class="header-title">
<div>
总数<span>{{ total }}</span>
</div>
<div>
施工中<span>{{ workTicketCountInfo.ing }}</span>
</div>
<div>
未开始<span>{{ workTicketCountInfo.notStarted }}</span>
</div>
<div>
暂停中<span>{{ workTicketCountInfo.pause }}</span>
</div>
<div>
已完工<span>{{ workTicketCountInfo.done }}</span>
</div>
</div>
<el-form
size="medium"
:model="queryParams"
ref="queryForm"
:inline="true"
>
<el-form-item label="工作票类型" prop="typeId">
<el-cascader
v-model="queryParams.typeId"
:options="workTicketTypeTreeList"
filterable
clearable
collapse-tags
:show-all-levels="false"
:props="{
multiple: false,
checkStrictly: true,
emitPath: false,
value: 'id',
label: 'typeName',
}"
></el-cascader>
</el-form-item>
<el-form-item label="施工计划时间" prop="constructionTime">
<el-date-picker
v-model="queryParams.constructionTime"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</el-date-picker>
</el-form-item>
<el-form-item label="工作票编号" prop="workTicketNumber">
<el-input
v-model="queryParams.workTicketNumber"
placeholder="请输入"
></el-input>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择">
<el-option
v-for="item in statusList"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="施工人员" prop="operator">
<el-input
v-model="queryParams.operator"
placeholder="请输入"
></el-input>
</el-form-item>
<el-form-item label="施工场站" prop="constructionAreas">
<el-cascader
v-model="queryParams.constructionAreas"
:options="qualityRegionList"
filterable
clearable
collapse-tags
:show-all-levels="false"
:props="{
multiple: false,
checkStrictly: true,
emitPath: false,
value: 'id',
label: 'regionName',
}"
></el-cascader>
</el-form-item>
<el-form-item>
<el-button type="primary" plain @click="handleQuery">查询</el-button>
<el-button type="warning" plain @click="handleRefresh"
>刷新</el-button
>
<!-- v-permission="{
key: 'business_add',
menuPath: '/project/safeManage/safeZoneSetting',
}" -->
<el-button type="primary" size="medium" @click="addWorkTicket(1)"
>新增</el-button
>
<el-button
:disabled="
$refs.multipleTable && $refs.multipleTable.selection.length == 0
"
:type="
$refs.multipleTable && $refs.multipleTable.selection.length == 0
? 'info'
: 'danger'
"
class="delete_btn"
plain
@click="deleteAttendanceBatch"
>删除</el-button
>
</el-form-item>
</el-form>
<!-- <div class="check_box">
<div>
已选{{ $refs.multipleTable ? $refs.multipleTable.selection.length : 0 }}项
</div>
<el-button @click="toggleSelection(false)" type="text" style="color: #f76c6c"
>取消</el-button
>
<el-button @click="toggleSelection(true)" type="text">全选</el-button>
<el-button style="color: #b3b3b3" @click="toggleExpandAll(true)" type="text">全部展开</el-button>
<el-button style="color: #b3b3b3" @click="toggleExpandAll(false)" type="text"
>全部关闭</el-button
>
</div> -->
<el-table
ref="multipleTable"
:data="tableData"
style="width: 100%"
row-key="id"
class="tables"
height="calc(100% - 64px - 116px - 16px)"
max-height="calc(100% - 64px - 116px - 16px)"
>
<el-table-column
type="selection"
align="center"
width="55"
></el-table-column>
<el-table-column
prop="workTicketNumber"
align="center"
label="工作票编号"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="status"
align="center"
label="状态"
show-overflow-tooltip
>
<template slot-scope="scope">
<span
class="status-box"
:class="{
wks_active: scope.row.status == 1,
sgz_active: scope.row.status == 2,
ztz_active: scope.row.status == 3,
ywg_acitve: scope.row.status == 4,
}"
>
{{ statusUp(scope.row.status) }}</span
>
</template>
</el-table-column>
<el-table-column
prop="devName"
align="center"
label="当前绑定监控记录"
show-overflow-tooltip
>
<template slot-scope="scope">
{{ itemListDevNameUp(scope.row) }}
</template>
</el-table-column>
<el-table-column
prop="typeName"
align="center"
label="类别"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="workContent"
align="center"
label="作业内容"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="safetyMeasure"
align="center"
label="安全措施"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="constructionAreaNames"
align="center"
label="施工区域"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="operator"
align="center"
label="施工人员"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="constructionTimeBegin"
align="center"
label="施工计划时间"
show-overflow-tooltip
>
<template slot-scope="scope">
{{ scope.row.constructionTimeBegin }} -
{{ scope.row.constructionTimeEnd }}
</template>
</el-table-column>
<el-table-column
prop="typeName"
align="center"
label="工作票附件"
show-overflow-tooltip
>
<template slot-scope="scope">
<template v-if="scope.row.workTicketAttachment.length > 0">
<el-image
style="width: 62px; height: 29px"
:src="
$store.state.FILEURL + scope.row.workTicketAttachment[0].url
"
:preview-src-list="srcListUp(scope.row.workTicketAttachment)"
>
</el-image>
</template>
</template>
</el-table-column>
<!-- <el-table-column
prop="typeName"
align="center"
label="安全风险分析"
show-overflow-tooltip
>
<template slot-scope="scope">
<template v-if="scope.row.safetyRiskAnalysis.length > 0">
<el-image
style="width: 62px; height: 29px"
:src="$store.state.FILEURL + scope.row.safetyRiskAnalysis[0].url"
:preview-src-list="srcListUp(scope.row.safetyRiskAnalysis)"
>
</el-image>
</template>
</template>
</el-table-column> -->
<el-table-column
:width="380"
:label="$t('message.quality.operation')"
align="center"
>
<template slot-scope="scope">
<div class="flex2 edit">
<el-button
@click="onStateShow(4, scope.row.id)"
style="border: 0 !important; color: #f56c6c"
type="text"
icon="el-icon-switch-button"
v-if="scope.row.status == 2 || scope.row.status == 3"
>结束作业</el-button
>
<el-button
@click="onStateShow(1, scope.row.id)"
type="text"
icon="el-icon-refresh-right"
v-if="scope.row.status == 1"
>开始作业</el-button
>
<el-button
type="text"
@click="onStateShow(2, scope.row.id)"
icon="el-icon-video-pause"
v-if="scope.row.status == 2"
>暂停作业</el-button
>
<el-button
type="text"
@click="onStateShow(3, scope.row.id)"
icon="el-icon-video-play"
v-if="scope.row.status == 3"
>继续作业</el-button
>
<el-button
@click="onExamineClick(scope.row)"
type="text"
icon="el-icon-view"
>查看</el-button
>
<el-button
style="border: 0 !important"
type="text"
icon="el-icon-edit"
@click="addWorkTicket(3, scope.row)"
>编辑</el-button
>
<el-button
style="border: 0 !important; color: #f56c6c"
type="text"
icon="el-icon-delete"
@click="deleteBtn(scope.row)"
>删除</el-button
>
</div>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="Number(total)"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getWorkTicketList"
:pageSizes="[...$store.state.PAGESIZRS]"
layout="total,sizes, prev, pager, next, jumper"
/>
</div>
<el-dialog
:modal-append-to-body="false"
@close="initWorkTicketClose"
:title="workTicketTitle"
:visible.sync="workTicketDialog"
:width="workTicketType == 1 ? '668px' : '960px'"
>
<div class="dialog_content">
<el-steps
align-center
v-if="workTicketType == 2 || workTicketType == 3"
:active="stepActive"
:class="{
steps_1: stepActive == 1,
'steps_1 steps_2': stepActive == 2,
steps_3: workTicketBindCamera == 0,
}"
>
<el-step title="基础信息"></el-step>
<el-step title="绑定工作票监控"></el-step>
<el-step title="完成"></el-step>
</el-steps>
<el-form
v-if="stepActive == 0"
ref="workTicketFormRef"
:model="workTicketForm"
:rules="workTicketRules"
label-width="130px"
size="medium"
:class="{
workticket_main2: workTicketType == 2 || workTicketType == 3,
workticket_main1: workTicketType == 1,
}"
>
<el-form-item
v-if="workTicketType == 1"
label="工作票类型"
prop="typeId"
>
<el-cascader
v-model="workTicketForm.typeId"
:options="workTicketTypeTreeList"
filterable
clearable
collapse-tags
:show-all-levels="false"
:props="{
multiple: false,
checkStrictly: true,
emitPath: false,
value: 'id',
label: 'typeName',
}"
></el-cascader>
</el-form-item>
<template v-if="workTicketType == 2 || workTicketType == 3">
<el-form-item label="工作票类型" prop="typeId">
<el-cascader
disabled
class="mycascader"
:value="workTicketForm.typeId"
:options="workTicketTypeTreeList"
:show-all-levels="false"
:props="{
multiple: false,
checkStrictly: true,
emitPath: false,
value: 'id',
label: 'typeName',
}"
placeholder=""
></el-cascader>
</el-form-item>
<el-form-item label="工作票编号" prop="workTicketNumber">
<el-input
v-model="workTicketForm.workTicketNumber"
placeholder="请输入"
></el-input>
</el-form-item>
<el-form-item label="施工场站" prop="constructionAreas">
<el-cascader
v-model="workTicketForm.constructionAreas"
:options="qualityRegionList"
filterable
clearable
collapse-tags
:show-all-levels="false"
:props="{
multiple: true,
checkStrictly: true,
emitPath: false,
value: 'id',
label: 'regionName',
}"
></el-cascader>
</el-form-item>
<el-form-item label="施工地点" prop="constructionAddr">
<el-input
v-model="workTicketForm.constructionAddr"
placeholder="请输入"
></el-input>
</el-form-item>
<el-form-item label="申请单位" prop="applicants">
<el-select
v-model="workTicketForm.applicants"
multiple
filterable
collapse-tags
placeholder="请选择企业"
>
<el-option
:label="item.enterpriseName"
:value="item.id"
v-for="(item, index) in enterpriseInfoList"
:key="index"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="申请时间" prop="applicationTime">
{{ workTicketForm.applicationTime }}
</el-form-item>
<el-form-item label="施工时间" prop="constructionTime">
<el-date-picker
v-model="workTicketForm.constructionTime"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</el-date-picker>
</el-form-item>
<el-form-item label="作业人员" prop="operator">
<el-input
type="textarea"
placeholder="请输入"
v-model="workTicketForm.operator"
maxlength="200"
:autosize="{ minRows: 2, maxRows: 4 }"
show-word-limit
>
</el-input>
</el-form-item>
<el-form-item label="作业内容" prop="workContent">
<el-input
type="textarea"
placeholder="请输入"
v-model="workTicketForm.workContent"
maxlength="1000"
:autosize="{ minRows: 2, maxRows: 4 }"
show-word-limit
>
</el-input>
</el-form-item>
<el-form-item label="安全措施" prop="safetyMeasure">
<el-input
type="textarea"
placeholder="请输入"
v-model="workTicketForm.safetyMeasure"
maxlength="1000"
:autosize="{ minRows: 2, maxRows: 4 }"
show-word-limit
>
</el-input>
</el-form-item>
<el-form-item label="工作票附件" prop="workTicketAttachment">
<el-upload
:action="$store.state.UPLOADURL"
list-type="picture-card"
name="files"
:limit="5"
accept=".png, .jpg, .jpeg"
:file-list="workTicketForm.workTicketAttachment"
:on-exceed="handleExceed"
:on-success="(res, file) => handleSuccess(res, file, 1)"
:on-remove="(file, fileList) => handleRemove(file, fileList, 1)"
>
<i class="el-icon-plus"></i>
</el-upload>
</el-form-item>
<el-form-item label="其他附件" prop="otherAttachment">
<el-upload
class="upload-demo"
name="files"
:action="$store.state.UPLOADURL"
:on-preview="handlePreview"
:on-success="(res, file) => handleSuccess(res, file, 2)"
:on-remove="(file, fileList) => handleRemove(file, fileList, 2)"
multiple
:limit="10"
:on-exceed="handleExceed"
:file-list="workTicketForm.otherAttachment"
>
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">
只能上传jpg/png文件且不超过100M且最多上传10个文件
</div>
</el-upload>
</el-form-item>
</template>
</el-form>
<div class="bindworkticket" v-else-if="stepActive == 1">
<div>
<div>绑定作业票监控</div>
<el-button @click="bindWorkTicketClick" size="medium" type="primary"
>去绑定</el-button
>
</div>
<el-table
:data="policeCameraItemListUp"
style="width: 100%"
row-key="id"
class="tables"
height="440"
>
<!-- <el-table-column
:selectable="selected"
type="selection"
align="center"
width="55"
></el-table-column> -->
<el-table-column
prop="devName"
align="center"
label="设备名称"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="devSn"
align="center"
label="设备编号"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="monitoringNumber"
align="center"
label="监控点编号"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="typeName"
align="center"
label="设备图片"
show-overflow-tooltip
>
<template slot-scope="scope">
<template v-if="scope.row.pic">
<el-image
style="width: 62px; height: 29px"
:src="$store.state.FILEURL + scope.row.pic"
:preview-src-list="[$store.state.FILEURL + scope.row.pic]"
>
</el-image>
</template>
</template>
</el-table-column>
<el-table-column
prop="userNames"
align="center"
label="使用人"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="status"
align="center"
label="设备状态"
show-overflow-tooltip
>
<template slot-scope="scope">
<span
class="boundalready_box"
:class="{
boundalready: scope.row.bindChecked,
}"
>
{{ scope.row.bindChecked ? "已绑定" : "空闲" }}</span
>
</template>
</el-table-column>
<el-table-column
:label="$t('message.quality.operation')"
align="center"
>
<template slot-scope="scope">
<el-button
style="border: 0 !important; color: #f56c6c"
type="text"
icon="el-icon-delete"
@click="onDelete(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</div>
<div class="content_main2" v-else-if="stepActive == 2">
<div :class="{ edit_img: workTicketType == 3 }"></div>
<div>
工作票已{{
workTicketType == 3 ? "编辑" : "添加"
}}完成,是否立即开始作业?
</div>
<div>
<i class="el-icon-warning-outline"></i>
<div>点击立即开始后,将会下发工单任务至执法记录仪设备中,施工员需要到设备的工单任务中点击开始执行工单任务进行录音、录像、拍照。</div>
</div>
</div>
</div>
<div class="dialog-footer" v-if="stepActive != 2">
<el-button
v-if="stepActive == 1"
class="cancleBtn"
@click="onLastStep"
icon="el-icon-circle-close"
size="medium"
>上一步
</el-button>
<el-button
v-else
class="cancleBtn"
@click="initWorkTicketClose"
icon="el-icon-circle-close"
size="medium"
>{{ $t("message.alarmValueSet.cancel") }}
</el-button>
<el-button
type="primary"
icon="el-icon-circle-check"
@click="onNextStep"
size="medium"
>{{ workTicketType == 1 ? "确定" : stepActive == 1 || workTicketBindCamera == 0 ? "确定" : "下一步" }}</el-button }}
</el-button>
</div>
<div class="dialog-footer" v-else>
<el-button
@click="initWorkTicketClose"
class="cancleBtn"
icon="el-icon-circle-close"
size="medium"
>不,暂时保存
</el-button>
<el-button
@click="onChangeState(1)"
type="primary"
icon="el-icon-circle-check"
size="medium"
>是,立即开始
</el-button>
</div>
</el-dialog>
<el-dialog
:modal-append-to-body="false"
title="设备列表"
:visible.sync="policeCameraItemDialog"
width="960px"
class="policecamera_box"
>
<div class="dialog_content">
<el-form
size="medium"
:model="policeCameraItemInfo"
ref="policeCameraItemInfo"
:inline="true"
>
<el-form-item label="设备名称" prop="devName">
<el-input
v-model="policeCameraItemInfo.devName"
placeholder="请输入"
></el-input>
</el-form-item>
<el-form-item label="设备编号" prop="devSn">
<el-input
v-model="policeCameraItemInfo.devSn"
placeholder="请输入"
></el-input>
</el-form-item>
<el-form-item label="设备状态" prop="bindTicket">
<el-select
v-model="policeCameraItemInfo.bindTicket"
clearable
placeholder="请选择"
>
<el-option label="空闲" :value="1"></el-option>
<el-option label="已绑定" :value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" plain @click="policeCameraItemQuery"
>查询</el-button
>
<el-button type="warning" plain @click="policeCameraItemRefresh"
>刷新</el-button
>
</el-form-item>
</el-form>
<el-table
ref="policeCameraItemTable"
:data="policeCameraItemList"
style="width: 100%"
row-key="id"
class="tables"
height="440"
>
<el-table-column
:selectable="selected"
type="selection"
align="center"
width="55"
></el-table-column>
<el-table-column
prop="devName"
align="center"
label="设备名称"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="devSn"
align="center"
label="设备编号"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="monitoringNumber"
align="center"
label="监控点编号"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="typeName"
align="center"
label="设备图片"
show-overflow-tooltip
>
<template slot-scope="scope">
<template v-if="scope.row.pic">
<el-image
style="width: 62px; height: 29px"
:src="$store.state.FILEURL + scope.row.pic"
:preview-src-list="[$store.state.FILEURL + scope.row.pic]"
>
</el-image>
</template>
</template>
</el-table-column>
<el-table-column
prop="userNames"
align="center"
label="使用人"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="status"
align="center"
label="设备状态"
show-overflow-tooltip
>
<template slot-scope="scope">
<span
class="boundalready_box"
:class="{
boundalready: scope.row.bindChecked,
}"
>
{{ scope.row.bindChecked ? "已绑定" : "空闲" }}</span
>
</template>
</el-table-column>
</el-table>
<!-- <pagination
v-show="policeCameraItemInfo.total > 0"
:total="Number(policeCameraItemInfo.total)"
:page.sync="policeCameraItemInfo.pageNo"
:limit.sync="policeCameraItemInfo.pageSize"
@pagination="getPoliceCameraItemPage"
:pageSizes="[...$store.state.PAGESIZRS]"
layout="total,sizes, prev, pager, next, jumper"
/> -->
</div>
<div class="dialog-footer">
<el-button
class="cancleBtn"
@click="policeCameraItemDialog = false"
icon="el-icon-circle-close"
size="medium"
>{{ $t("message.alarmValueSet.cancel") }}
</el-button>
<el-button
type="primary"
icon="el-icon-circle-check"
@click="policeCameraItemSubmit"
size="medium"
>确定
</el-button>
</div>
</el-dialog>
<el-dialog
:modal-append-to-body="false"
title="工作票详情"
:visible.sync="workTicketDetailDialog"
width="1416px"
class="workticketdelete_main"
>
<div class="dialog_content">
<div class="workticket_box workticket_box1">
<div class="workticket_header">
<div>
<div>基本信息</div>
<div
class="status-box"
:class="{
wks_active: workTicketDetail.status == 1,
sgz_active: workTicketDetail.status == 2,
ztz_active: workTicketDetail.status == 3,
ywg_acitve: workTicketDetail.status == 4,
}"
>
{{ statusUp(workTicketDetail.status) }}
</div>
</div>
<div>
<div
@click="onStateShow(1, workTicketDetail.id)"
class="bg-3e"
v-if="workTicketDetail.status == 1"
>
开始作业
</div>
<div
@click="onStateShow(2, workTicketDetail.id)"
class="bg-3e"
v-if="workTicketDetail.status == 2"
>
暂停作业
</div>
<div
@click="onStateShow(3, workTicketDetail.id)"
class="bg-3e"
v-if="workTicketDetail.status == 3"
>
继续作业
</div>
<div
@click="onStateShow(4, workTicketDetail.id)"
class="bg-ed"
v-if="
workTicketDetail.status == 2 || workTicketDetail.status == 3
"
>
结束作业
</div>
</div>
</div>
<div>
<div class="workticket_content">
<div>
<div>
<div><span>*</span>工作票类型</div>
<div>{{ workTicketDetail.typeName }}</div>
</div>
<div>
<div>施工区域</div>
<div>{{ workTicketDetail.constructionAreaNames }}</div>
</div>
<div>
<div>申请单位</div>
<div>{{ workTicketDetail.applicantNames }}</div>
</div>
<div>
<div>作业人员</div>
<div>{{ workTicketDetail.operator }}</div>
</div>
<div>
<div>安全措施</div>
<div>{{ workTicketDetail.safetyMeasure }}</div>
</div>
</div>
<div>
<div>
<div><span>*</span>工作票编号</div>
<div>{{ workTicketDetail.workTicketNumber }}</div>
</div>
<div>
<div>当前绑定监控</div>
<div>{{ workTicketDetail.itemList instanceof Array ? workTicketDetail.itemList.map(item => item.devName).join('、') : ''}}</div>
</div>
<div>
<div>施工地点</div>
<div>{{ workTicketDetail.constructionAddr }}</div>
</div>
<div>
<div>申请时间</div>
<div>{{ workTicketDetail.applicationTime }}</div>
</div>
<div>
<div>施工时间</div>
<div>
{{ workTicketDetail.constructionTimeBegin }} -
{{ workTicketDetail.constructionTimeEnd }}
</div>
</div>
<div>
<div>作业内容</div>
<div>
{{ workTicketDetail.workContent }}
</div>
</div>
</div>
</div>
<div
class="workticket_content1"
v-if="workTicketDetail.status == 2"
>
<el-select size="medium" v-model="itemId" placeholder="请选择">
<el-option
v-for="item in workTicketDetail.itemList"
:key="item.itemId"
:label="item.devName"
:value="item.itemId"
>
</el-option>
</el-select>
<div class="hls-video" v-if="videoItemInfo.videoInfo">
<HlsPlayer
:src="
videoItemInfo.videoInfo.url
? videoItemInfo.videoInfo.url
: ''
"
:autoplay="true"
:controls="true"
/>
</div>
<!-- videoItemInfo.videoInfo.url -->
<!-- https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8 -->
</div>
</div>
</div>
<div class="workticket_box workticket_box2">
<div class="workticket_header">
<div>
<div>附件内容</div>
</div>
</div>
<div>
<div class="workticket_content">
<div>
<div>
<div>工作票附件</div>
<div class="content-img">
<el-image
v-for="item in workTicketDetail.workTicketAttachment"
:key="item.url"
:src="$store.state.FILEURL + item.url"
:preview-src-list="[$store.state.FILEURL + item.url]"
>
</el-image>
</div>
</div>
</div>
<div>
<div>
<div>其它附件</div>
<div class="content-file_list">
<div
v-for="item in workTicketDetail.otherAttachment"
:key="item.url"
>
<div>
<i class="el-icon-files"></i>
<div>{{ item.name }}</div>
</div>
<div
@click="
downloadFileBtn(
$store.state.FILEURL + item.url,
item.name
)
"
>
<i class="el-icon-download"></i>
<div>下载</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="workticket_box workticket_box3">
<div class="workticket_header">
<div>
<div>历史记录</div>
</div>
</div>
<el-table
class="workticket-table"
:max-height="300"
:data="workTicketHistoryList"
row-key="id"
:tree-props="{ children: 'fileList' }"
border
>
<el-table-column
width="300"
show-overflow-tooltip
prop="date"
align="center"
label="序号"
>
<template slot-scope="scope">
<span v-if="scope.row.fileType">
{{ scope.row.fileName }}
</span>
<span v-else> 第{{ scope.row.no }}次作业 </span>
</template>
</el-table-column>
<el-table-column
width="450"
prop="name"
align="center"
label="总时间段"
>
<template slot-scope="scope">
<span v-if="scope.row.fileType">
{{ scope.row.startTime ? scope.row.startTime : "暂无" }} -
{{ scope.row.endTime ? scope.row.endTime : "暂无" }}
</span>
<span>
{{ scope.row.begin ? scope.row.begin : "暂无" }} -
{{ scope.row.end ? scope.row.end : "暂无" }}
</span>
</template>
</el-table-column>
<el-table-column
width="150"
prop="address"
align="center"
label="总时长"
>
<template slot-scope="scope">
<span class="time-diff" v-if="scope.row.fileType">{{
itemDiffUp(scope.row.startTime, scope.row.endTime)
}}</span>
<span class="time-diff" v-else>{{
itemDiffUp(scope.row.begin, scope.row.end)
}}</span>
</template>
</el-table-column>
<el-table-column
width="300"
prop="address"
align="center"
label="操作"
>
<template slot-scope="scope">
<div
v-if="scope.row.fileType"
class="viewreplay"
@click="onViewrePlayClick(scope.row)"
>
<div></div>
<div>查看回放</div>
</div>
</template>
</el-table-column>
</el-table>
</div>
</div>
<!-- <div class="dialog-footer">
<el-button
class="cancleBtn"
@click="workTicketDetailDialog = false"
icon="el-icon-circle-close"
size="medium"
>{{ $t("message.alarmValueSet.cancel") }}
</el-button>
<el-button
type="primary"
icon="el-icon-circle-check"
size="medium"
>确定
</el-button>
</div> -->
</el-dialog>
<el-dialog
:modal-append-to-body="false"
:title="viewreplayTitle"
:visible.sync="viewreplayDialog"
width="360px"
class="hls-video-dialog"
>
<div class="dialog_content">
<div class="audio-content" v-if="viewreplayInfo.fileType == 2">
<div>
<div>
<div></div>
<div>{{ viewreplayInfo.devName }}音频</div>
<div>
{{ (viewreplayInfo.fileLen / (1024 * 1024)).toFixed(2) }}MB
</div>
</div>
<div>
<div>{{ viewreplayInfo.fileTime }}</div>
<div>时长:{{ viewreplayInfo.duration }}</div>
</div>
</div>
<audio
:ref="`audio${viewreplayInfo.id}`"
:src="$store.state.FILEURL + viewreplayInfo.fileUrl"
controls
loop
></audio>
<div
class="bodyworn_pause"
:class="{ bodyworn_play: viewreplayInfo.is_play }"
@click.stop="onAudioClick(viewreplayInfo)"
></div>
</div>
<div class="video-content" v-else>
<div class="card-img">
<video controls v-if="viewreplayInfo.fileType == 3">
<source
:src="$store.state.FILEURL + viewreplayInfo.fileUrl"
type="video/mp4"
/>
<source
:src="$store.state.FILEURL + viewreplayInfo.fileUrl"
type="video/webm"
/>
您的浏览器不支持 HTML5 video 标签。
</video>
<img
v-else-if="viewreplayInfo.fileType == 1"
:src="$store.state.FILEURL + viewreplayInfo.fileUrl"
:preview="$store.state.FILEURL + viewreplayInfo.fileUrl"
alt=""
/>
<!-- <el-image
v-else-if="viewreplayInfo.fileType == 1"
:src="$store.state.FILEURL + viewreplayInfo.fileUrl"
:preview-src-list="[$store.state.FILEURL + viewreplayInfo.fileUrl]"
>
</el-image> -->
</div>
<template v-if="viewreplayInfo.fileType == 3">
<div class="card-flex">
<div class="card-num webkit-clamp_1">
{{ viewreplayInfo.fileName }}
</div>
<div class="card-num">
{{ (viewreplayInfo.fileLen / (1024 * 1024)).toFixed(2) }}MB
</div>
</div>
<div class="card-flex">
<div>{{ viewreplayInfo.startTime }}</div>
<p>至</p>
<div>{{ viewreplayInfo.endTime }}</div>
</div>
</template>
<template v-else-if="viewreplayInfo.fileType == 1">
<div class="card-flex">
<div>{{ viewreplayInfo.uploadTime }}</div>
</div>
</template>
</div>
</div>
</el-dialog>
</div>
</template>
<script>
import {
getProjectChilderSystemUserListApi,
getEnterpriseInfoListApi,
} from "@/assets/js/api/configManage.js";
import {
getWorkTicketTypeTreePageApi,
getWorkTicketPageApi,
addWorkTicketApi,
editWorkTicketApi,
deleteWorkTicketApi,
deleteBatchWorkTicketApi,
getWorkTicketCountWorkTicketApi,
setWorkTicketOperateWorkTicketApi,
getWorkTicketHistoryListApi,
getWorkTicketQueryByIdApi,
getVideoItemInfoPoliceCameraItemApi,
getQueryBindRegionsApi,
} from "@/assets/js/api/workTicketManage";
import { getProjectConfigListApi } from "@/assets/js/api/project.js";
import { getQualityRegionListApi } from "@/assets/js/api/quality.js";
import {
getPoliceCameraItemPageApi,
getPoliceCameraItemListApi,
} from "@/assets/js/api/bodyWornCamera";
import dayjs from "dayjs";
import duration from "dayjs/plugin/duration";
import { isJSON } from "@/util/nowDate";
import HlsPlayer from "./components/HlsPlayer.vue";
export default {
components: {
HlsPlayer,
},
data() {
return {
COMPANY: COMPANY,
projectSn: "",
tableData: [],
workTicketTitle: "新增",
workTicketType: 1,
workTicketDialog: false,
stepActive: 0,
workTicketForm: {
typeId: "",
workTicketNumber: "",
constructionAreas: [],
constructionAddr: "",
applicants: [],
applicationTime: "",
constructionTime: [],
operator: "",
workContent: "",
safetyMeasure: "",
workTicketAttachment: [],
otherAttachment: [],
safetyRiskAnalysis: [],
},
workTicketRules: {
typeId: [
{
required: true,
message: "请选择工作票类型",
trigger: "change",
},
],
workTicketNumber: [
{
required: true,
message: "请输入工作票编号",
trigger: "blur",
},
],
workContent: [
{
required: true,
message: "请输入作业内容",
trigger: "blur",
},
],
workTicketAttachment: [
{
required: true,
message: "请上传工作票附件",
trigger: "change",
},
],
},
// 查询参数
queryParams: {
pageNo: 1,
pageSize: 10,
typeId: "",
constructionTime: [],
workTicketNumber: "",
status: "",
operator: "",
constructionAreas: "",
},
total: 0,
enterpriseInfoList: [],
qualityRegionList: [],
workTicketTypeTreeList: [],
workTicketCountInfo: {
done: 0,
ing: 0,
notStarted: 0,
pause: 0,
},
workTicketBindCamera: 0,
statusList: [
{
value: 1,
label: "未开始",
},
{
value: 2,
label: "施工中",
},
{
value: 3,
label: "暂停中",
},
{
value: 4,
label: "已完工",
},
],
policeCameraItemDialog: false,
policeCameraItemList: [],
policeCameraItemInfo: {
pageNo: 1,
pageSize: 10,
total: 0,
devName: "",
devSn: "",
bindTicket: "",
},
workTicketId: "",
selectList: [],
selectFullList: [],
// 工作票详情
workTicketDetailDialog: false,
workTicketDetail: {},
workTicketHistoryList: [],
viewreplayDialog: false,
viewreplayInfo: {},
viewreplayTitle: "",
itemId: "",
videoItemInfo: {},
};
},
created() {
// 扩展Day.js以使用duration插件
dayjs.extend(duration);
this.projectSn = this.$store.state.projectSn;
this.getWorkTicketList();
this.getWorkTicketTypeTreePage();
this.getQualityRegionList();
this.getEnterpriseInfoList();
this.getProjectSetting();
this.getWorkTicketCountWorkTicket();
this.getPoliceCameraItemList();
this.getQueryBindRegions();
},
methods: {
// 查看回放
onViewrePlayClick(row) {
this.viewreplayTitle = `第${row.no}次作业回放`;
this.viewreplayInfo = {
...row,
is_play: false,
};
this.viewreplayDialog = true;
},
// 播放音频
onAudioClick() {
if (this.viewreplayInfo.is_play) {
this.$refs[`audio${this.viewreplayInfo.id}`].pause();
this.viewreplayInfo.is_play = false;
} else {
this.$refs[`audio${this.viewreplayInfo.id}`].play();
this.viewreplayInfo.is_play = true;
}
},
onExamineClick(row) {
this.workTicketId = row.id;
this.getWorkTicketQueryById();
this.getWorkTicketHistoryList();
this.workTicketDetailDialog = true;
},
// 列表查询工作票历史记录信息
getWorkTicketHistoryList() {
getWorkTicketHistoryListApi({
workTicketId: this.workTicketId,
// workTicketId: "1942510629577048066",
projectSn: this.projectSn,
}).then((res) => {
if (res.code == 200) {
const resultList = res.result.sort((a, b) => a.no - b.no);
this.workTicketHistoryList = resultList.map((item) => {
return {
...item,
};
});
}
});
},
// 通过id查询作业票详情
getWorkTicketQueryById() {
getWorkTicketQueryByIdApi({
id: this.workTicketId,
// id: "1942510629577048066",
projectSn: this.projectSn,
}).then((res) => {
if (res.code == 200) {
this.workTicketDetail = {
...res.result,
workTicketAttachment:
isJSON(res.result.workTicketAttachment) &&
JSON.parse(res.result.workTicketAttachment) instanceof Array
? JSON.parse(res.result.workTicketAttachment)
: [],
safetyRiskAnalysis:
isJSON(res.result.safetyRiskAnalysis) &&
JSON.parse(res.result.safetyRiskAnalysis) instanceof Array
? JSON.parse(res.result.safetyRiskAnalysis)
: [],
otherAttachment:
isJSON(res.result.otherAttachment) &&
JSON.parse(res.result.otherAttachment) instanceof Array
? JSON.parse(res.result.otherAttachment)
: [],
};
if (
res.result.itemList instanceof Array &&
res.result.itemList.length > 0
) {
this.itemId = res.result.itemList[0].itemId;
this.getVideoItemInfoPoliceCameraItem();
} else {
this.itemId = "";
this.videoItemInfo = {};
}
}
});
},
getVideoItemInfoPoliceCameraItem() {
getVideoItemInfoPoliceCameraItemApi({
itemId: this.itemId,
projectSn: this.projectSn,
}).then((res) => {
if (res.code == 200) {
this.videoItemInfo = res.result;
}
});
},
// 删除
onDelete(row) {
const findIndex = this.selectList.findIndex((item) => item == row.itemId);
if (findIndex > -1) {
this.selectList.splice(findIndex, 1);
}
},
// 添加设备列表
policeCameraItemSubmit() {
if (this.$refs.policeCameraItemTable.selection.length == 0)
return this.$message.warning("请选择需要绑定的设备");
const resultList = this.$refs.policeCameraItemTable.selection.map(
(item) => item.itemId
);
this.selectList = [...this.selectList, ...resultList];
console.log(1111, this.selectList);
this.policeCameraItemDialog = false;
this.$confirm(
"设备已绑定作业票,请选择继续添加设备或者绑定完成进行下一步操作",
"提示",
{
confirmButtonText: "绑定完成",
cancelButtonText: "继续添加",
customClass: "customConfirm",
// type: 'warning'
}
)
.then(() => {})
.catch(() => {
this.bindWorkTicketClick();
});
},
// 绑定设备列表
bindWorkTicketClick() {
this.policeCameraItemRefresh();
this.policeCameraItemDialog = true;
},
policeCameraItemQuery() {
this.policeCameraItemInfo.pageNo = 1;
this.getPoliceCameraItemPage();
},
policeCameraItemRefresh() {
this.policeCameraItemInfo.devName = "";
this.policeCameraItemInfo.devSn = "";
this.policeCameraItemInfo.bindTicket = "";
this.policeCameraItemQuery();
},
selected(row, index) {
return !row.bindChecked;
},
// 分页查询设备列表
getPoliceCameraItemPage() {
getPoliceCameraItemPageApi({
devName: this.policeCameraItemInfo.devName,
devSn: this.policeCameraItemInfo.devSn,
// bindTicket: this.policeCameraItemInfo.bindTicket,
// pageNo: this.policeCameraItemInfo.pageNo,
// pageSize: this.policeCameraItemInfo.pageSize,
pageNo: 1,
pageSize: -1,
projectSn: this.projectSn,
}).then((res) => {
if (res.code == 200) {
const resultList = res.result.records.map((item) => {
return {
...item,
bindChecked:
this.selectList.includes(item.itemId) || item.bindTicket == 1
? true
: false,
};
});
if (this.policeCameraItemInfo.bindTicket == 1) {
this.policeCameraItemList = resultList.filter(
(item) => !item.bindChecked
);
} else if (this.policeCameraItemInfo.bindTicket == 2) {
this.policeCameraItemList = resultList.filter(
(item) => item.bindChecked
);
} else {
this.policeCameraItemList = resultList;
}
this.policeCameraItemInfo.total = res.result.total;
}
});
},
handlePreview() {
console.log("预览图片");
},
handleRemove(file, fileList, type) {
const obj = {
1: "workTicketAttachment",
2: "otherAttachment",
};
this.workTicketForm[obj[type]] = fileList;
},
handleExceed(file, fileList) {
this.$message.warning("上传图片超出限制个数!");
},
handleSuccess(res, file, type) {
if (res.status == "SUCCESS") {
const obj = {
1: "workTicketAttachment",
2: "otherAttachment",
};
this.workTicketForm[obj[type]].push({
name: file.name,
url: this.$store.state.FILEURL + file.response.data[0].imageUrl,
newUrl: file.response.data[0].imageUrl,
});
if (type == 1) {
this.$refs.workTicketForm.clearValidate("workTicketAttachment");
}
}
},
handleQuery() {
this.queryParams.pageNo = 1;
this.getWorkTicketList();
},
handleRefresh() {
this.queryParams.pageNo = 1;
this.queryParams.typeId = "";
this.queryParams.constructionTime = [];
this.queryParams.workTicketNumber = "";
this.queryParams.status = "";
this.queryParams.operator = "";
this.queryParams.constructionAreas = "";
this.getWorkTicketList();
},
deleteAttendanceBatch() {
if (this.$refs.multipleTable.selection.length === 0)
return this.$message.warning("请勾选需要删除的数据!");
this.$confirm("删除后操作不可恢复,请谨慎操作!", "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
const ids = this.$refs.multipleTable.selection
.map((item) => item.id)
.join(",");
console.log(this.$refs.multipleTable.selection);
deleteBatchWorkTicketApi({ ids }).then((res) => {
this.getWorkTicketList();
});
})
.catch(() => {});
},
toggleExpandAll(isExpandAll) {
this.toggleSelectionAll(this.tableData, isExpandAll);
},
toggleSelection(flag) {
if (flag) {
// this.$refs.multipleTable.toggleAllSelection(true)
this.toggleSelectionAll(this.tableData);
} else {
this.$refs.multipleTable.clearSelection();
}
},
toggleSelectionAll(dataList, isExpandAll = null) {
dataList.forEach((item) => {
if (isExpandAll == null) {
this.$refs.multipleTable.toggleRowSelection(item, true);
} else {
this.$refs.multipleTable.toggleRowExpansion(item, isExpandAll);
}
if (item.children instanceof Array && item.children.length > 0) {
this.toggleSelectionAll(item.children, isExpandAll);
}
});
},
// 获取列表信息
getWorkTicketList() {
let data = {
projectSn: this.projectSn,
typeId: this.queryParams.typeId,
constructionTimeBegin_end:
this.queryParams.constructionTime.length > 0
? this.queryParams.constructionTime[0]
: "",
constructionTimeEnd_start:
this.queryParams.constructionTime.length > 0
? this.queryParams.constructionTime[1]
: "",
workTicketNumber: this.queryParams.workTicketNumber,
status: this.queryParams.status,
operator: this.queryParams.operator,
constructionAreas: this.queryParams.constructionAreas,
pageNo: this.queryParams.pageNo,
pageSize: this.queryParams.pageSize,
};
getWorkTicketPageApi(data).then((res) => {
console.log(res);
if (res.code == 200) {
this.tableData = res.result.records.map((item) => {
return {
...item,
workTicketAttachment:
isJSON(item.workTicketAttachment) &&
JSON.parse(item.workTicketAttachment) instanceof Array
? JSON.parse(item.workTicketAttachment)
: [],
safetyRiskAnalysis:
isJSON(item.safetyRiskAnalysis) &&
JSON.parse(item.safetyRiskAnalysis) instanceof Array
? JSON.parse(item.safetyRiskAnalysis)
: [],
otherAttachment:
isJSON(item.otherAttachment) &&
JSON.parse(item.otherAttachment) instanceof Array
? JSON.parse(item.otherAttachment)
: [],
};
});
this.total = res.result.total;
}
});
},
onStateShow(type, id) {
const obj = {
1: "是否确认开始作业?",
2: "暂未全部施工完成,将进入暂停施工状态,待下次点击继续作业...",
3: "是否确认继续作业?",
4: "作业已全部施工完成,点击结束作业",
};
this.$confirm(obj[type], "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
customClass: `customConfirm customConfirm-box customConfirm${type}`,
type: "warning",
}).then(() => {
this.workTicketId = id;
this.onChangeState(type);
});
},
onChangeState(operateStatus) {
let data = {
id: this.workTicketId,
projectSn: this.projectSn,
operateStatus,
};
setWorkTicketOperateWorkTicketApi(data).then((res) => {
if (res.code == 200) {
this.$message.success(res.message);
this.initWorkTicketClose();
this.getWorkTicketList();
this.onExamineClick({
id: this.workTicketId,
});
}
});
},
getQueryBindRegions() {
let data = {
// projectSn: this.projectSn,
};
getQueryBindRegionsApi(data).then((res) => {
if (res.code == 200) {
this.queryBindRegionList = res.result;
}
});
},
initWorkTicketForm() {
this.stepActive = 0;
this.workTicketId = "";
this.selectList = [];
this.workTicketForm = {
typeId: "",
workTicketNumber: `GZP${Date.now()}`,
constructionAreas:
this.queryBindRegionList.length > 0
? this.queryBindRegionList.map((item) => item.id)
: [],
constructionAddr: "",
applicants: this.$store.state.userInfo.enterpriseId
? [this.$store.state.userInfo.enterpriseId]
: [],
applicationTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
constructionTime: [],
operator: "",
workContent: "",
safetyMeasure: "",
safetyRiskAnalysis: [],
workTicketAttachment: [],
otherAttachment: [],
};
},
//新增作业票
addWorkTicket(type, row) {
this.workTicketType = type;
this.workTicketTitle = "新增";
if (type == 1) {
this.initWorkTicketForm();
} else if (type == 3) {
this.workTicketTitle = "编辑";
this.stepActive = 0;
this.workTicketId = row.id;
this.workTicketForm = {
...row,
applicants: row.applicants ? row.applicants.split(",") : [],
constructionAreas: row.constructionAreas
? row.constructionAreas.split(",")
: [],
operators: row.operators ? row.operators.split(",") : [],
otherAttachment: row.otherAttachment.map((item) => {
return {
name: item.name,
url: this.$store.state.FILEURL + item.url,
newUrl: item.url,
};
}),
workTicketAttachment: row.workTicketAttachment.map((item) => {
return {
name: item.name,
url: this.$store.state.FILEURL + item.url,
newUrl: item.url,
};
}),
safetyRiskAnalysis: row.safetyRiskAnalysis.map((item) => {
return {
name: item.name,
url: this.$store.state.FILEURL + item.url,
newUrl: item.url,
};
}),
constructionTime: [],
};
this.selectList = row.itemList
? row.itemList.map((item) => item.itemId)
: [];
if (row.constructionTimeBegin && row.constructionTimeEnd) {
this.constructionTime = [
row.constructionTimeBegin,
row.constructionTimeEnd,
];
}
}
this.workTicketDialog = true;
this.$nextTick(() => {
this.$refs["workTicketFormRef"].clearValidate();
});
},
// 上一步
onLastStep() {
this.stepActive = 0;
},
// 下一步
async onNextStep() {
console.log(this.stepActive, this.workTicketType);
if (this.workTicketType == 1) {
const valid = await this.$refs["workTicketFormRef"].validate();
if (!valid) return this.$message.warning("请填写必填项!");
this.addWorkTicket(2);
return;
}
if (this.stepActive == 0) {
console.log("我进来了");
const valid = await this.$refs["workTicketFormRef"].validate();
if (!valid) return this.$message.warning("请填写必填项!");
if (this.workTicketBindCamera == 0) {
this.submit();
return;
}
this.stepActive = 1;
// this.getPoliceCameraItemListFn();
} else if (this.stepActive == 1) {
// if (this.selectList.length == 0) {
// this.$message.warning("至少要绑定一台设备");
// return;
// }
this.submit();
}
},
//弹窗---保存按钮
submit() {
const workTicketAttachment = this.workTicketForm.workTicketAttachment.map(
(item) => {
return {
name: item.name,
url: item.newUrl,
};
}
);
const otherAttachment = this.workTicketForm.otherAttachment.map(
(item) => {
return {
name: item.name,
url: item.newUrl,
};
}
);
const safetyRiskAnalysis = this.workTicketForm.safetyRiskAnalysis.map(
(item) => {
return {
name: item.name,
url: item.newUrl,
};
}
);
const data = {
...this.workTicketForm,
constructionTimeBegin:
this.workTicketForm.constructionTime.length > 1
? this.workTicketForm.constructionTime[0]
: "",
constructionTimeEnd:
this.workTicketForm.constructionTime.length > 1
? this.workTicketForm.constructionTime[1]
: "",
constructionAreas: this.workTicketForm.constructionAreas.join(","),
workTicketAttachment: JSON.stringify(workTicketAttachment),
otherAttachment: JSON.stringify(otherAttachment),
safetyRiskAnalysis: JSON.stringify(safetyRiskAnalysis),
projectSn: this.projectSn,
policeCameraIds: this.selectList.join(","),
applicants: this.workTicketForm.applicants.join(","),
};
if (this.workTicketType == 2) {
addWorkTicketApi(data).then((res) => {
// console.log(res);
if (res.code == 200) {
this.$message.success(this.$t("message.quality.newSuccess"));
// this.workTicketDialog = false;
this.workTicketId = res.result.id;
this.stepActive = 2;
this.getWorkTicketList();
}
});
} else if (this.workTicketType == 3) {
editWorkTicketApi(data).then((res) => {
if (res.code == 200) {
// this.workTicketDialog = false;
this.stepActive = 2;
this.$message.success(res.message);
this.getWorkTicketList();
}
});
}
},
//删除 按钮
deleteBtn(value) {
this.$confirm(
this.$t("message.quality.deleteHint"),
this.$t("message.quality.hint"),
{
confirmButtonText: this.$t("message.quality.confirm"),
cancelButtonText: this.$t("message.quality.cancel"),
type: "warning",
}
)
.then(() => {
let data = {
id: value.id,
};
deleteWorkTicketApi(data).then((res) => {
if (res.code == 200) {
this.$message({
type: "success",
message: this.$t("message.quality.successfullyDelete") + "!",
});
this.getWorkTicketList();
}
});
})
.catch(() => {});
},
initWorkTicketClose() {
this.initWorkTicketForm();
this.workTicketDialog = false;
},
// 获取工作票统计
getWorkTicketCountWorkTicket() {
getWorkTicketCountWorkTicketApi({
projectSn: this.projectSn,
}).then((res) => {
if (res.code == 200) {
this.workTicketCountInfo = res.result;
}
});
},
// 获取工作票类型
getWorkTicketTypeTreePage() {
let data = {
projectSn: this.projectSn,
pageNo: 1,
pageSize: -1,
};
getWorkTicketTypeTreePageApi(data).then((res) => {
if (res.code == 200) {
this.workTicketTypeTreeList = res.result.records;
}
});
},
// 获取施工场站
getQualityRegionList() {
let data = {
projectSn: this.projectSn,
};
getQualityRegionListApi(data).then((res) => {
if (res.code == 200) {
this.qualityRegionList = res.result;
}
});
},
// 获取申请单位
getEnterpriseInfoList() {
let data = {
projectSn: this.projectSn,
};
getEnterpriseInfoListApi(data).then((res) => {
if (res.code == 200) {
this.enterpriseInfoList = res.result;
}
});
},
//获取项目配置信息
getProjectSetting() {
getProjectConfigListApi({
projectSn: this.projectSn,
}).then((res) => {
if (!res.result || res.result.length == 0) {
this.workTicketBindCamera = 0;
} else {
let workTicketBindCamera = res.result[0].workTicketBindCamera;
this.workTicketBindCamera = workTicketBindCamera;
}
});
},
getPoliceCameraItemList() {
getPoliceCameraItemListApi({
projectSn: this.projectSn,
}).then((res) => {
if (res.code == 200) {
this.selectFullList = res.result;
}
});
},
downloadFileBtn(url, name) {
fetch(url, {
method: "get",
headers: {
Authorization: this.$store.state.userInfo.token,
"Content-Type": "application/json", // 设置请求头的内容类型为JSON
},
// body: JSON.stringify(data) // 将data对象转换为JSON字符串并作为请求体发送
})
.then((response) => {
// 处理响应
if (!response.ok) {
throw new Error("下载失败");
}
return response.blob();
})
.then((blob) => {
// 创建一个下载链接
const url = window.URL.createObjectURL(blob);
// 创建一个<a>元素
const link = document.createElement("a");
link.href = url;
link.download = name; // 指定下载文件的文件名
// 模拟点击下载链接
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// 释放URL对象
window.URL.revokeObjectURL(url);
// 处理导出的文件
// 这里可以使用blob对象来获取导出的文件内容或者将其保存到本地
})
.catch((error) => {
// 处理错误
console.error(error);
});
},
},
computed: {
itemListDevNameUp() {
return (row) => {
return row.itemList
? row.itemList.map((item) => item.devName).join("、")
: "--";
};
},
srcListUp() {
return (dataList) => {
const resultList = dataList.map(
(item) => this.$store.state.FILEURL + item.url
);
console.log(resultList);
return resultList;
};
},
statusUp() {
return (id) => {
const find = this.statusList.find((item) => item.value == id);
return find ? find.label : "--";
};
},
policeCameraItemListUp() {
return this.selectFullList
.filter((item) => {
return this.selectList.includes(item.itemId);
})
.map((item) => {
return {
...item,
bindChecked: true,
};
});
},
itemDiffUp() {
return (begin, end) => {
// 定义两个日期
const date = dayjs();
const date1 = dayjs(begin);
const date2 = end ? dayjs(end) : date;
// 计算两个日期之间的差异(默认单位是毫秒)
const diffInMilliseconds = date2.diff(date1);
const durationObj = dayjs.duration(diffInMilliseconds);
const hour = durationObj.hours();
const minute = durationObj.minutes();
const second = durationObj.seconds();
return `${hour}h${minute}min${second}s`;
};
},
},
};
</script>
<style lang="less">
.el-tooltip__popper {
max-width: 30%;
}
.customConfirm4 .el-message-box__message::after {
content: "点击结束作业后需要到执法记录仪上手动结束工单结束后录像将会自动上传到平台可在历史回放中查看";
color: #ffa026;
font-size: 12px;
display: inline-block;
width: 400px;
}
.customConfirm3 .el-message-box__message::after {
content: "点击暂停作业后需要到执法记录仪上手动结束工单结束后录像将会自动上传到平台可在历史回放中查看";
color: #ffa026;
font-size: 12px;
display: inline-block;
width: 400px;
}
.customConfirm2 .el-message-box__message::after {
content: "点击暂停作业后需要到执法记录仪上手动结束工单结束后录像将会自动上传到平台可在历史回放中查看";
color: #ffa026;
font-size: 12px;
display: inline-block;
width: 400px;
}
.customConfirm1 .el-message-box__message::after {
content: "点击立即开始后将会下发工单任务至执法记录仪设备中施工员需要到设备的工单任务中点击开始执行工单任务进行录音录像拍照";
color: #ffa026;
font-size: 12px;
display: inline-block;
width: 400px;
}
.customConfirm-box {
.el-message-box__container {
position: relative;
}
.el-icon-warning {
left: 96px;
bottom: 6px;
font-size: 18px !important;
top: initial;
transform: translateY(0);
}
.el-message-box__btns {
> .el-button {
position: relative;
}
> .el-button::before {
font-family: "element-icons" !important;
speak: none;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
}
> .el-button:nth-child(1)::before {
content: "\e78d";
}
> .el-button:nth-child(2)::before {
content: "\e720";
}
}
}
.customConfirm {
width: 668px;
.el-message-box__title {
font-weight: normal;
font-size: 16px;
color: #272d45;
margin-left: 15px;
position: relative;
}
.el-message-box__title::before {
content: "";
width: 3px;
height: 100%;
background-color: #5c81ee;
position: absolute;
left: -15px;
top: 50%;
transform: translateY(-50%);
}
.el-message-box__btns,
.el-message-box__message {
text-align: center;
}
}
</style>
<style lang="less" scoped>
.hls-video-dialog {
/deep/ .el-dialog__header {
display: none;
}
/deep/ .el-dialog__body {
padding: 0 !important;
}
.dialog_content {
padding: 0 !important;
height: initial;
overflow: hidden;
}
.audio-content {
display: flex;
align-items: center;
justify-content: space-between;
padding: 13px 22px 13px 13px;
position: relative;
overflow: hidden;
audio {
opacity: 0;
position: absolute;
left: 0;
// right: -67%;
}
> div:last-child {
width: 26px;
height: 26px;
background-repeat: no-repeat;
background-size: 100% 100%;
}
.bodyworn_pause {
background-image: url(~@/assets/images/laborManage/bodyworn_pause.png);
}
.bodyworn_play {
background-image: url(~@/assets/images/laborManage/bodyworn_play.png);
}
> div:first-child {
display: flex;
flex-direction: column;
justify-content: space-between;
> div:last-child {
display: flex;
align-items: center;
font-size: 14px;
color: #808080;
margin-top: 20px;
> div:not(:first-child) {
margin-left: 19px;
}
}
> div:first-child {
display: flex;
align-items: center;
font-size: 14px;
color: #272d45;
> div:not(:first-child) {
margin-left: 10px;
}
> div:first-child {
width: 19px;
height: 18px;
background-image: url(~@/assets/images/laborManage/bodyworn_audio.png);
background-repeat: no-repeat;
background-size: 100% 100%;
}
> div:last-child {
padding: 2px 10px;
border: 1px solid #f7af13;
font-size: 14px;
color: #f7af13;
}
}
}
}
.video-content {
height: 260px;
.card-img {
width: 100%;
height: 180px;
img,
video,
.el-image {
width: 100%;
height: 100%;
}
}
.card-flex {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px 15px 0;
color: #333333;
font-size: 15px;
.webkit-clamp_1 {
width: 50%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.card-num {
font-size: 14px;
color: #808080;
}
}
}
}
.workticketdelete_main {
.workticket_box3 {
.time-diff {
padding: 4px 10px;
background: rgba(75, 141, 236, 0.1);
border-radius: 38px;
font-size: 12px;
color: #4b8dec;
}
.viewreplay {
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
color: #272d45;
> div:first-child {
width: 16px;
height: 16px;
background-image: url(~@/assets/images/laborManage/viewreplay.png);
background-repeat: no-repeat;
background-size: 100% 100%;
}
> div:last-child {
margin-left: 8px;
}
}
/deep/ .workticket-table {
width: 1202px;
margin-top: 20px;
border-color: #f2f2f2;
th {
background-color: #e6e6e6;
border-color: #f2f2f2;
}
td {
border-color: #f2f2f2;
}
}
/deep/ .workticket-table::before {
border-color: #f2f2f2;
}
}
.workticket_box2 {
.content-file_list {
display: flex;
flex-direction: column;
> div:nth-child(odd) {
background-color: #fbfbfb;
}
> div {
display: flex;
align-items: center;
justify-content: space-between;
height: 30px;
padding: 0 16px 0 20px;
> div:first-child {
font-size: 14px;
color: #272d45;
> div:last-child {
width: 170px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
> div:last-child {
font-size: 14px;
color: #5181f6;
cursor: pointer;
}
> div {
display: flex;
align-items: center;
> div:not(:first-child) {
margin-left: 6px;
}
}
}
}
.content-img {
display: flex;
flex-wrap: wrap;
> .el-image:nth-child(even) {
margin-left: 20px;
}
> .el-image {
width: 128px;
height: 128px;
border-radius: 4px;
}
}
}
.workticket_box1 {
> div:last-child {
display: flex;
justify-content: space-between;
}
.workticket_content1 {
display: flex;
flex-direction: column;
margin-top: 20px;
padding-right: 30px;
.el-select {
width: 320px;
}
.hls-video {
width: 358px;
height: 180px;
margin-top: 10px;
}
}
}
.workticket_box {
.workticket_content {
display: flex;
margin-top: 10px;
> div:not(:first-child) {
margin-left: 50px;
}
> div {
display: flex;
flex-direction: column;
> div {
display: flex;
padding: 10px 0;
> div:last-child {
width: 300px;
font-size: 14px;
color: #272d45;
margin-left: 16px;
}
> div:first-child {
width: 84px;
font-size: 14px;
color: #a2a4af;
text-align: right;
> span {
color: #ff0000;
}
}
}
}
}
.workticket_header {
display: flex;
align-items: center;
justify-content: space-between;
> div:last-child {
display: flex;
align-items: center;
> div {
font-weight: 500;
font-size: 14px;
color: #ffffff;
width: 74px;
height: 30px;
background-color: #3e89fd;
border-radius: 3px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
> div:not(:first-child) {
margin-left: 20px;
}
.bg-ed {
background-color: #ed2b29;
}
}
> div:first-child {
display: flex;
align-items: center;
> div:first-child {
font-weight: 800;
font-size: 16px;
color: #4d4d4d;
background-color: transparent;
}
> div:not(:first-child) {
margin-left: 10px;
}
}
}
}
}
/deep/ .el-textarea {
textarea {
padding-bottom: 15px;
}
.el-input__count {
background-color: transparent;
height: 12px;
line-height: 12px;
}
}
/deep/ .policecamera_box {
.el-form-item {
margin-bottom: 20px;
}
.pagination-container {
padding: 16px;
}
.dialog-footer {
margin-top: 16px;
}
}
.content_main2 {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin-top: 20px;
> div:first-child {
width: 251px;
height: 168px;
background-image: url(~@/assets/images/laborManage/index-icon11.png);
background-repeat: no-repeat;
background-size: 100% 100%;
}
.edit_img {
background-image: url(~@/assets/images/laborManage/index-icon12.png) !important;
}
> div:nth-child(2) {
font-weight: 500;
font-size: 14px;
color: #171717;
margin-top: 16px;
}
> div:nth-child(3) {
font-size: 12px;
color: #ffa026;
margin-top: 16px;
display: flex;
align-items: center;
.el-icon-warning-outline {
font-size: 18px;
margin-right: 10px;
}
}
}
.bindworkticket {
margin-top: 20px;
> div:first-child {
display: flex;
align-items: center;
> div:first-child {
margin-right: 15px;
}
}
}
/deep/ .el-steps {
justify-content: space-between;
padding-bottom: 20px;
border-bottom: 2px solid #f3f5fc;
> .el-step {
.el-step__icon {
width: 36px;
height: 36px;
position: relative;
border: none;
.el-step__icon-inner {
display: none;
}
}
.el-step__line {
top: 50%;
transform: translateY(-50%);
}
.el-step__icon::before {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 20px;
height: 20px;
background-repeat: no-repeat;
background-size: 100% 100%;
}
.el-step__title {
font-weight: 500;
font-size: 15px;
color: #1a1a1a;
}
}
> .el-step:nth-child(1) {
flex-basis: 10% !important;
.el-step__line,
.el-step__line-inner {
width: 414px;
background-color: #038ee4;
border-color: #038ee4;
}
.el-step__icon {
background-color: #008de4;
}
.el-step__icon::before {
background-image: url(~@/assets/images/laborManage/index-icon4.png);
}
}
.el-step:not(:first-child) {
.el-step__line {
width: 414px;
background-color: #f4333c;
}
.el-step__icon {
background-color: #f4333c;
}
}
> .el-step:nth-child(2) {
flex-basis: 15% !important;
.el-step__icon::before {
background-image: url(~@/assets/images/laborManage/index-icon5.png);
}
}
> .el-step:nth-child(3) {
flex-basis: 10% !important;
.el-step__icon::before {
background-image: url(~@/assets/images/laborManage/index-icon6.png);
}
}
}
/deep/ .steps_1 > .el-step:nth-child(2) {
.el-step__line {
background-color: #038ee4;
}
.el-step__icon {
background-color: #008de4;
}
}
/deep/ .steps_2 > .el-step:nth-child(3) {
.el-step__line {
background-color: #038ee4;
}
.el-step__icon {
background-color: #008de4;
}
}
/deep/ .steps_3 > .el-step:nth-child(2) {
.el-step__icon {
opacity: 0;
}
.el-step__main {
display: none;
}
}
.dialog_content {
padding: 0px;
max-height: 670px;
overflow-y: auto;
}
/deep/ .el-dialog__body {
padding: 20px;
}
/deep/ .el-dialog {
top: 50%;
transform: translateY(-50%);
margin-top: 0 !important;
}
.workticket_main2 {
display: flex;
flex-wrap: wrap;
margin-top: 20px;
.el-form-item {
width: 50%;
}
.el-cascader,
.el-input,
.el-date-editor,
.el-select {
width: 320px;
}
/deep/ .el-upload--picture-card {
width: 128px;
height: 128px;
}
/deep/ .el-upload-list--picture-card {
.el-upload-list__item {
width: 128px;
height: 128px;
}
}
/deep/ .mycascader {
.el-input__inner {
color: #272d45;
background-color: transparent;
cursor: auto;
border: none;
padding: 0;
}
.el-input__suffix {
display: none;
}
}
}
.boundalready_box {
padding: 4px 10px;
background-color: rgba(71, 195, 147, 0.1);
font-size: 12px;
color: #47c393;
}
.boundalready {
background-color: rgba(113, 75, 0, 0.1) !important;
color: #714b00 !important;
}
.workticket_main1 {
.el-cascader {
width: 320px;
}
}
.header-title {
display: flex;
align-items: center;
margin-bottom: 20px;
> div {
font-size: 14px;
color: #272d45;
span {
color: #5181f6;
}
}
> div:not(:first-child) {
margin-left: 50px;
}
}
.status-box {
font-weight: 500;
font-size: 11px;
padding: 4px 10px;
border-radius: 2px;
border: 1px solid #f1f1f1;
}
.wks_active {
background-color: #898989;
color: #1a1a1a;
}
.sgz_active {
background-color: #bed0fa;
color: #5181f6;
}
.ztz_active {
background-color: #c38100;
color: #ffffff;
}
.ywg_acitve {
background-color: #88cf65;
color: #1a1a1a;
}
.checkPoint {
/deep/ .el-form-item {
margin-bottom: 20px;
}
.el-input,
.el-cascader {
width: 192px;
}
.el-date-editor {
width: 247px;
}
}
.tables {
min-height: initial;
}
.ml-8 {
margin-left: 8px;
}
.check_box {
display: flex;
font-size: 14px;
> .el-button:hover {
color: #5181f6 !important;
}
> .el-button {
padding: 0;
position: relative;
// margin-left: 10px;
}
// > .el-button:first-child {
// color: #eb4047;
// }
> .el-button:first-child::before {
content: " ";
position: absolute;
top: 50%;
right: -10px;
transform: translateY(-50%);
width: 1px;
height: 90%;
background-color: #d9d9d9;
}
}
.flex {
display: flex;
}
.flex2 {
display: flex;
align-items: center;
}
.checkPoint {
padding: 16px 20px;
box-sizing: border-box;
position: relative;
height: 100%;
.pagination-container {
padding: 0;
width: 100%;
position: absolute;
bottom: 16px;
left: 50%;
transform: translateX(-50%);
}
.edit {
width: 100%;
justify-content: center;
cursor: pointer;
img {
margin-right: 5px;
}
/deep/ .el-button {
> span {
color: #262d49;
}
}
}
}
</style>