From 20b0ce2db27b64a60de60aee05dedd448099e330 Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期一, 08 七月 2024 10:12:16 +0800 Subject: [PATCH] xiugai --- src/views/specialWorkSystem/specialIndex/index.vue | 951 ++++++++++++++++++++++++++++++++-------------------------- 1 files changed, 527 insertions(+), 424 deletions(-) diff --git a/src/views/specialWorkSystem/specialIndex/index.vue b/src/views/specialWorkSystem/specialIndex/index.vue index 6866f0e..fb47fb3 100644 --- a/src/views/specialWorkSystem/specialIndex/index.vue +++ b/src/views/specialWorkSystem/specialIndex/index.vue @@ -20,7 +20,7 @@ <div class="chart-tit"> <span class="tit">八大作业各分类分布图</span> <div class="filter-part filter-part2"> - <el-cascader :teleported="false" v-model="chartSearch1.searchDep" :options="departmentList" :props="casProps" :show-all-levels="false" size="small"/> + <el-cascader :teleported="false" v-model="chartSearch1.depId" @change="changeDep1()" :options="departmentList" :props="casProps" :show-all-levels="false" size="small"/> </div> </div> <div class="chart" :id="zyfb"></div> @@ -36,8 +36,8 @@ <div class="chart-tit"> <span class="tit">各事业部关联作业分析</span> <div class="filter-part"> - <el-cascader :teleported="false" v-model="chartSearch2.searchDep" :options="departmentList" :props="casProps" :show-all-levels="false" size="small"/> - <el-select v-model="chartSearch2.type" size="small" :teleported="false"> + <el-cascader :teleported="false" v-model="chartSearch2.depId" @change="changeDep2()" :options="departmentList" :props="casProps" :show-all-levels="false" size="small"/> + <el-select v-model="chartSearch2.type" size="small" :teleported="false" @change="changeType2()"> <el-option v-for="item in workType1" :key="item.id" @@ -56,7 +56,7 @@ <div class="chart-tit"> <span class="tit">关联作业趋势图</span> <div class="filter-part filter-part2"> - <el-cascader :teleported="false" v-model="chartSearch3.searchDep" :options="departmentList" :props="casProps" :show-all-levels="false" size="small"/> + <el-cascader :teleported="false" v-model="chartSearch3.depId" @change="changeDep3()" :options="departmentList" :props="casProps" :show-all-levels="false" size="small"/> </div> </div> <div class="chart" :id="zyqs"></div> @@ -64,22 +64,22 @@ <div class="chart-item"> <dv-border-box10 v-if="isFull==true" class="item-bg"></dv-border-box10> <div class="chart-tit"> - <span class="tit">异常警报关联人</span> + <span class="tit">作业警报记录</span> <div class="filter-part"> - <el-switch - v-model="chartSearch4.type" - inline-prompt - style="--el-switch-on-color: #13ce66; --el-switch-off-color: #13ce66" - active-text="作业人" - inactive-text="监护人" - /> - <el-select :teleported="false" v-model="chartSearch4.period" size="small"> - <el-option label="近7天" value="week"/> - <el-option label="近30天" value="month"/> - <el-option label="近90天" value="season"/> - <el-option label="近1年" value="year"/> +<!-- <el-switch--> +<!-- v-model="chartSearch4.type"--> +<!-- inline-prompt--> +<!-- style="--el-switch-on-color: #13ce66; --el-switch-off-color: #13ce66"--> +<!-- active-text="作业人"--> +<!-- inactive-text="监护人"--> +<!-- />--> + <el-select :teleported="false" v-model="chartSearch4.days" size="small" @change="(value)=>changeTime4(value)"> + <el-option label="近7天" :value="7"/> + <el-option label="近30天" :value="30"/> + <el-option label="近90天" :value="90"/> + <el-option label="近1年" :value="365"/> </el-select> - <el-select :teleported="false" v-model="chartSearch4.workType" size="small"> + <el-select :teleported="false" v-model="chartSearch4.workType" size="small" @change="changeType4()"> <el-option v-for="item in workType1" :key="item.id" @@ -91,17 +91,17 @@ </div> <div class="chart"> <el-table ref="multipleTableRef" :data="warningData" style="width: 100%" stripe border :header-cell-style="{ background: '#fafafa' }"> - <el-table-column property="name" label="姓名" align="center"/> - <el-table-column property="dep" label="所属部门" align="center"/> - <el-table-column property="warning" label="异常报警次数" align="center"/> - <el-table-column property="role" label="角色" align="center"/> - <el-table-column property="isCard" label="是否持证" align="center"> - <template #default="scope"> - <span>{{scope.row.isCard == 1?'是':'否'}}</span> - </template> - </el-table-column> + <el-table-column property="operatorUname" label="姓名" align="center"/> + <el-table-column property="deptName" label="所属部门" align="center"/> + <el-table-column property="warningCount" label="异常报警次数" align="center"/> +<!-- <el-table-column property="role" label="角色" align="center"/>--> +<!-- <el-table-column property="isCard" label="是否持证" align="center">--> +<!-- <template #default="scope">--> +<!-- <span>{{scope.row.isCard == 1?'是':'否'}}</span>--> +<!-- </template>--> +<!-- </el-table-column>--> </el-table> - <el-button type="text" size="small" style="margin-top: 10px">所有记录>></el-button> +<!-- <el-button type="text" size="small" style="margin-top: 10px">所有记录>></el-button>--> </div> <!-- <div class="chart" :id="slfx"></div>--> </div> @@ -110,12 +110,12 @@ <div class="homeCard"> <dv-border-box10 v-if="isFull==true" class="item-bg"></dv-border-box10> <el-row> - <el-col :span="5" style="display:flex;align-items: center"> + <el-col :span="4" style="display:flex;align-items: center"> <span style="white-space: nowrap">作业类型:</span> <div class="grid-content topInfo"> - <el-select :teleported="false" v-model="searchWord" size="small"> + <el-select :teleported="false" v-model="searchParams.workType" size="small"> <el-option - v-for="item in workType" + v-for="item in workTypeList" :key="item.id" :label="item.name" :value="item.id" @@ -123,12 +123,12 @@ </el-select> </div> </el-col> - <el-col :span="5" style="display:flex;align-items: center"> + <el-col :span="4" style="display:flex;align-items: center"> <span style="white-space: nowrap">作业状态:</span> <div class="grid-content topInfo"> - <el-select :teleported="false" v-model="searchStatus" size="small"> + <el-select :teleported="false" v-model="searchParams.workAllStatus" size="small"> <el-option - v-for="item in workStatus" + v-for="item in workStatusList" :key="item.value" :label="item.name" :value="item.value" @@ -136,12 +136,12 @@ </el-select> </div> </el-col> - <el-col :span="5" style="display:flex;align-items: center"> - <span style="white-space: nowrap">作业部门:</span> - <div class="grid-content topInfo"> - <el-cascader :teleported="false" size="small" v-model="searchDep" :options="departmentList" :props="casProps" :show-all-levels="false"/> - </div> - </el-col> +<!-- <el-col :span="4" style="display:flex;align-items: center">--> +<!-- <span style="white-space: nowrap">作业部门:</span>--> +<!-- <div class="grid-content topInfo">--> +<!-- <el-cascader :teleported="false" size="small" v-model="searchParams.workDepId" :options="departmentList" :props="casProps" :show-all-levels="false"/>--> +<!-- </div>--> +<!-- </el-col>--> <el-col :span="6" style="display:flex;align-items: center;"> <span style="white-space: nowrap;margin-left: 20px">申请时间:</span> <div class="grid-content topInfo"> @@ -158,82 +158,124 @@ /> </div> </el-col> + <el-col :span="4" style="display:flex;align-items: center"> + <span style="white-space: nowrap;margin-left: 20px">作业票编号:</span> + <div class="grid-content topInfo"> + <el-input + v-model="searchParams.workPermitNo" + placeholder="请输入作业票编号" + size="small" + /> + </div> + </el-col> <el-button type="primary" style="margin-left: 20px" @click="searchRecord" size="small">查询</el-button> <el-button plain @click="clearSearch" size="small">重置</el-button> </el-row> <div class="main-card"> - <el-row class="cardTop" style="justify-content: space-between"> - <el-col :span="2" class="mainCardBtn"> - <el-button type="primary" :icon="Plus" size="default" @click="toApply()">新作业申请</el-button> - </el-col> - <el-col :span="22" style="display: flex;justify-content: end;align-items: center"> - <div class="top-info"> - <el-icon :size="18" color="#F3001E" style="margin-right: 4px"><BellFilled /></el-icon> - 作业编号 - <div v-if="unchecked != 0"> - <el-tooltip - class="box-item" - effect="light" - content="查看预警详情" - placement="bottom-start" - ><span>123456</span></el-tooltip> - </div> - 可燃气体浓度超过18% - ,请及时处理! - </div> - <el-button type="primary" :icon="Refresh" size="default" @click="reLoadData()" /> - </el-col> - </el-row> +<!-- <el-row class="cardTop" style="justify-content: space-between">--> +<!-- <el-col :span="2" class="mainCardBtn">--> +<!-- <el-button type="primary" :icon="Plus" size="default" @click="toApply()">新作业申请</el-button>--> +<!-- </el-col>--> +<!-- <el-col :span="22" style="display: flex;justify-content: end;align-items: center">--> +<!-- <div class="top-info">--> +<!-- <el-icon :size="18" color="#F3001E" style="margin-right: 4px"><BellFilled /></el-icon>--> +<!-- 作业编号--> +<!-- <div v-if="unchecked != 0">--> +<!-- <el-tooltip--> +<!-- class="box-item"--> +<!-- effect="light"--> +<!-- content="查看预警详情"--> +<!-- placement="bottom-start"--> +<!-- ><span>123456</span></el-tooltip>--> +<!-- </div>--> +<!-- 可燃气体浓度超过18%--> +<!-- ,请及时处理!--> +<!-- </div>--> +<!-- <el-button type="primary" :icon="Refresh" size="default" @click="reLoadData()" />--> +<!-- </el-col>--> +<!-- </el-row>--> <el-table ref="multipleTableRef" stripe border :data="workData" style="width: 100%" :header-cell-style="{ background: '#fafafa' }"> - <el-table-column property="num" label="作业证编号" align="center"/> - <el-table-column property="dep" label="部门" align="center"/> - <el-table-column property="applyer" label="申请人" align="center"/> - <el-table-column property="worker" label="作业人" align="center"/> - <el-table-column property="type" label="作业类型" align="center"/> - <el-table-column property="level" label="作业等级" align="center"/> + <el-table-column property="workPermitNo" label="作业证编号" align="center"/> + <el-table-column label="作业单位" align="center"> + <template #default="scope"> + <span v-if="scope.row.workDepList && scope.row.workDepList.length>0">{{scope.row.workDepList.map(i=>i.workDepName).join(',')}}</span> + <span v-else>{{scope.row.workDepName }}</span> + </template> + </el-table-column> + <el-table-column property="applyUname" label="申请人" align="center"/> + <el-table-column property="applyDepName" label="申请单位" align="center"/> <el-table-column property="applyTime" label="申请时间" align="center"/> - <el-table-column property="startTime" label="作业开始时间" align="center"/> - <el-table-column property="endTime" label="作业结束时间" align="center"/> - <el-table-column label="作业状态" align="center"> + <el-table-column property="startUname" label="开始人" align="center"> <template #default="scope"> - <el-tag>{{ scope.row.status==0?'进行中':scope.row.status==1?'作业中止':scope.row.status==2?'作业结束验收': '作业完成'}}</el-tag> + <span>{{scope.row.startUname?scope.row.startUname:'--'}}</span> </template> </el-table-column> - <el-table-column property="reason" label="中止原因" align="center"/> - <el-table-column label="安全预警" align="center"> + <el-table-column property="finishUname" label="结束人" align="center"> <template #default="scope"> - <el-tag :type="scope.row.warning==0?'success':(scope.row.warning==1||scope.row.warning==2)?'warning':'danger'">{{ scope.row.warning==0?'正常':'报警' }}</el-tag> + <span>{{scope.row.finishUname?scope.row.finishUname:'--'}}</span> </template> </el-table-column> - <el-table-column property="message" label="报警信息" align="center"> + <el-table-column property="workStartTime" label="作业开始时间" align="center"> <template #default="scope"> - <el-button type="text" size="small" v-if="scope.row.message == 1">查看</el-button> - <span v-else>无</span> + <span>{{scope.row.workStartTime?scope.row.workStartTime:'--'}}</span> </template> </el-table-column> + <el-table-column property="workFinishTime" label="作业结束时间" align="center"> + <template #default="scope"> + <span>{{scope.row.workFinishTime?scope.row.workFinishTime:'--'}}</span> + </template> + </el-table-column> + <el-table-column property="acceptUname" label="验收人" align="center"> + <template #default="scope"> + <span>{{scope.row.acceptUname?scope.row.acceptUname:'--'}}</span> + </template> + </el-table-column> + <el-table-column property="workAcceptContent" label="验收内容" align="center"> + <template #default="scope"> + <span>{{scope.row.workAcceptContent?scope.row.workAcceptContent:'--'}}</span> + </template> + </el-table-column> + <el-table-column property="workAcceptTime" label="验收时间" align="center"> + <template #default="scope"> + <span>{{scope.row.workAcceptTime?scope.row.workAcceptTime:'--'}}</span> + </template> + </el-table-column> + <el-table-column property="workTypeDesc" label="作业类型" align="center"/> + <el-table-column property="workLevelDesc" label="作业等级" align="center"/> + <el-table-column property="abortReason" label="中止原因" align="center"> + <template #default="scope"> + <span>{{scope.row.abortReason?scope.row.abortReason:'--'}}</span> + </template> + </el-table-column> + <el-table-column property="workAllStatusDesc" label="作业状态" align="center"/> <el-table-column fixed="right" label="操作" align="center" width="250"> <template #default="scope"> - <el-button link type="primary" size="small" :icon="View" @click="viewRecord(scope.row)">查看作业票</el-button> - <el-button link type="primary" size="small" :icon="FolderChecked" @click="handleReview(scope.row)">验收</el-button> - <el-button link type="primary" size="small" :icon="VideoPlay" @click="openVideo(scope.row)">查看实时监控</el-button> + <el-button link + v-if="scope.row.workAllStatus == -1|| scope.row.workAllStatus == 1 || scope.row.workAllStatus == 3 || scope.row.workAllStatus == 7" + type="primary" size="small" :icon="VideoPlay" @click="openVideo(scope.row)">查看监控视频</el-button> + <el-button link type="primary" size="small" :icon="View" @click="viewRecord(scope.row.workApplyId)">查看记录</el-button> + <el-button link type="primary" size="small" :icon="View" @click="viewTicket(scope.row)">查看作业票</el-button> + <el-button link type="primary" size="small" :icon="Download" @click="downLoadTicket(scope.row)">导出作业票</el-button> +<!-- <el-button link type="primary" size="small" :icon="FolderChecked" @click="handleReview(scope.row)">验收</el-button>--> </template> </el-table-column> </el-table> <div class="pageBtn"> - <el-pagination v-model:currentPage="pageIndex1" v-model:page-size="pageSize1" :page-sizes="[10, 15]" small="false" background layout="total, sizes, prev, pager, next, jumper" :total="totalSize1" @size-change="handleSizeChange1" @current-change="handleCurrentChange1" /> + <el-pagination v-model:currentPage="pageIndex" v-model:page-size="pageSize" :page-sizes="[10, 15]" small="false" background layout="total, sizes, prev, pager, next, jumper" :total="totalSize" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </div> </div> </div> </div> <el-dialog v-model="dialogDetails" title="作业申请详情" center> - <fire v-if="dialogType == 1" :details = details></fire> - <space v-else-if="dialogType == 2" :details = details></space> - <hoist v-else-if="dialogType == 3" :details = details></hoist> - <ground v-else-if="dialogType == 4" :details = details></ground> - <broken v-else-if="dialogType == 5" :details = details></broken> - <height v-else-if="dialogType == 6" :details = details></height> - <power v-else-if="dialogType == 7" :details = details></power> - <plate v-else :details = details></plate> +<!-- <fire v-if="dialogType == 1" :details = details></fire>--> +<!-- <space v-else-if="dialogType == 2" :details = details></space>--> +<!-- <hoist v-else-if="dialogType == 3" :details = details></hoist>--> +<!-- <ground v-else-if="dialogType == 4" :details = details></ground>--> +<!-- <broken v-else-if="dialogType == 5" :details = details></broken>--> +<!-- <height v-else-if="dialogType == 6" :details = details></height>--> +<!-- <power v-else-if="dialogType == 7" :details = details></power>--> +<!-- <plate v-else :details = details></plate>--> +<!-- <detail-log :type=dialogType :statusList=statusList :details = details></detail-log>--> <template #footer> <span class="dialog-footer"> <el-button type="primary" @click="dialogDetails = false" @@ -242,24 +284,25 @@ </span> </template> </el-dialog> - <el-dialog v-model="dialogReview" title="填报验收意见" center> - <el-form ref="reviewFormRef" :model="reviewForm" :rules="reviewRules" label-width="120px"> - <el-form-item label="填报验收意见:" prop="advice"> - <el-input - v-model="reviewForm.advice" - :autosize="{ minRows: 4, maxRows: 10 }" - type="textarea" - placeholder="请填写验收意见" - /> - </el-form-item> - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button type="primary" @click="submitReview(reviewFormRef)">提交验收</el-button> - </span> - </template> - </el-dialog> +<!-- <el-dialog v-model="dialogReview" title="填报验收意见" center>--> +<!-- <el-form ref="reviewFormRef" :model="reviewForm" :rules="reviewRules" label-width="120px">--> +<!-- <el-form-item label="填报验收意见:" prop="advice">--> +<!-- <el-input--> +<!-- v-model="reviewForm.advice"--> +<!-- :autosize="{ minRows: 4, maxRows: 10 }"--> +<!-- type="textarea"--> +<!-- placeholder="请填写验收意见"--> +<!-- />--> +<!-- </el-form-item>--> +<!-- </el-form>--> +<!-- <template #footer>--> +<!-- <span class="dialog-footer">--> +<!-- <el-button type="primary" @click="submitReview(reviewFormRef)">提交验收</el-button>--> +<!-- </span>--> +<!-- </template>--> +<!-- </el-dialog>--> <video-detail ref="videoRef"></video-detail> + <Work-record ref="recordRef"></Work-record> </div> </template> @@ -273,16 +316,17 @@ import { Edit, View, Plus, Delete, Refresh, Search, Finished, Download, FolderChecked, VideoPlay } from '@element-plus/icons-vue'; import { ElTable, ElMessage } from 'element-plus'; import { specialIndexApi } from '/@/api/specialWorkSystem/specialIndex'; -import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; -import type { TabsPaneContext } from 'element-plus'; import type { FormInstance, FormRules } from 'element-plus' import {teamManageApi} from "/@/api/systemManage/basicDateManage/personShiftManage/teamManage"; +import { workApplyApi } from '/@/api/specialWorkSystem/workApply' import Cookies from 'js-cookie'; import axios from 'axios'; import * as echarts from "echarts"; import screenfull from "screenfull"; import VideoDetail from "/@/views/specialWorkSystem/specialIndex/components/videoDetail.vue"; +import WorkRecord from "/@/views/specialWorkSystem/specialIndex/components/workRecord.vue"; import { BorderBox10 as DvBorderBox10 } from '@kjgl77/datav-vue3' +import {productionDeviceApi} from "/@/api/doublePreventSystem/productionDevice"; // 定义接口来定义对象的类型 interface stateType { @@ -293,10 +337,11 @@ approveInfo: Object; dialogDetails: boolean; dialogReview: boolean; - pageIndex1: number; - pageSize1: number; - chosenIndex: null | number; - searchWord: number | null; + pageIndex: number; + pageSize: number; + searchParams: {}; + workStatusList: Array<status>; + workTypeList: Array<type>; searchStatus: number | null; chartSearch1: object; chartSearch2: object; @@ -305,23 +350,23 @@ searchDep2: number | null; searchDep: number | null; searchDate: Array<any>, - totalSize1: number; + totalSize: number; details: {}; - workType: Array<type>; workType1: Array<type>; dialogType: number | null; departmentList: Array<any>; departmentRecursionList: Array<DepartmentState>; - workStatus: Array<status>; reviewForm: object; reviewRules: object; warningData: Array<any>; isFull:boolean; themeColor:string; endTime:string + pieData: Array<status> + squareData: Array<status> } interface type { - id: number; + id: number | null; name: string; } interface status { @@ -341,133 +386,66 @@ name: 'specialIndex', components: { VideoDetail, - fire: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/fireLog.vue')), - space: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/spaceLog.vue')), - hoist: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/hoistLog.vue')), - ground: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/groundLog.vue')), - broken: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/brokenLog.vue')), - height: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/heightLog.vue')), - power: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/powerLog.vue')), - plate: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsq/components/plateLog.vue')) + WorkRecord, + // fire: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/fireLog.vue')), + // space: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/spaceLog.vue')), + // hoist: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/hoistLog.vue')), + // ground: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/groundLog.vue')), + // broken: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/brokenLog.vue')), + // height: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/heightLog.vue')), + // power: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/powerLog.vue')), + // plate: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/plateLog.vue')) }, setup() { - const userInfo = useUserInfo(); - const { userInfos } = storeToRefs(userInfo); - const router = useRouter(); + const userInfo = useUserInfo() + const { userInfos } = storeToRefs(userInfo) + const router = useRouter() const reviewFormRef = ref<FormInstance>() const zyfb = ref("eChartZyfb" + Date.now() + Math.random()) const slfx = ref("eChartSlfx" + Date.now() + Math.random()) const zyqs = ref("eChartZyqs" + Date.now() + Math.random()) - const videoRef = ref(); + const videoRef = ref() + const recordRef = ref() const state = reactive<stateType>({ - pageIndex1: 1, - pageSize1: 10, - totalSize1: 0, + pageIndex: 1, + pageSize: 10, + totalSize: 0, dialogType: null, + searchParams: { + workType: null, + workDepId: null, + workPermitNo: '', + startTime: '', + endTime: '', + workAllStatus: null + }, dialogReview: false, departmentList: [], departmentRecursionList: [], - chosenIndex: null, - searchWord: null, searchStatus: null, endTime: '', chartSearch1: { - searchDep: null, + depId: 1, startTime: '', days: 30 }, chartSearch2: { - searchDep: null, - type: 0 + depId: 1, + // startTime: '', + type: null }, chartSearch3: { - searchDep: null + depId: 1 }, chartSearch4: { - searchDep: null, startTime: '', - days: 30 + days: 30, + workType: 1 }, searchDep2: null, searchDep: null, searchDate: [], - workData: [ - { - num: '111', - dep: '部门1', - applyer: '张凤', - worker: '李羽飞', - type: '动火作业', - level: '一级', - applyTime: '2023-03-08', - startTime: '2023-03-08', - endTime: '2023-03-08', - status: 0, - reason: '分析超时', - warning: 0, - message: 1 - }, - { - num: '222', - dep: '部门2', - applyer: '张凤', - worker: '李羽飞', - type: '动土作业', - level: '一级', - applyTime: '2023-03-08', - startTime: '2023-03-08', - endTime: '2023-03-08', - status: 1, - reason: '分析超时', - warning: 1, - message: 0 - }, - { - num: '333', - dep: '部门3', - applyer: '张凤', - worker: '李羽飞', - type: '动火作业', - level: '一级', - applyTime: '2023-03-08', - startTime: '2023-03-08', - endTime: '2023-03-08', - status: 2, - reason: '分析超时', - warning: 2, - message: 0 - }, - { - num: '222', - dep: '部门2', - applyer: '张凤', - worker: '李羽飞', - type: '动土作业', - level: '一级', - applyTime: '2023-03-08', - startTime: '2023-03-08', - endTime: '2023-03-08', - status: 1, - reason: '分析超时', - warning: 1, - message: 0 - }, - { - num: '333', - dep: '部门3', - applyer: '张凤', - worker: '李羽飞', - type: '动火作业', - level: '一级', - applyTime: '2023-03-08', - startTime: '2023-03-08', - endTime: '2023-03-08', - status: 2, - reason: '分析超时', - warning: 2, - message: 0 - } - ], + workData: [], isFull: false, themeColor: '#333', workTimeList: [], @@ -486,7 +464,7 @@ dialogDetails: false, details: {}, workType1: [ - { id: 0, name: '所有作业' }, + { id: null, name: '所有作业' }, { id: 1, name: '动火作业' }, { id: 2, name: '受限空间作业' }, { id: 3, name: '吊装作业' }, @@ -496,7 +474,7 @@ { id: 7, name: '临时用电作业' }, { id: 8, name: '盲板抽堵作业' } ], - workType: [ + workTypeList: [ { id: 1, name: '动火作业' }, { id: 2, name: '受限空间作业' }, { id: 3, name: '吊装作业' }, @@ -506,47 +484,23 @@ { id: 7, name: '临时用电作业' }, { id: 8, name: '盲板抽堵作业' } ], - workStatus: [ + workStatusList: [ { - name: '作业进行中', - value: 0 + name: '未开始', + value: -1 }, { - name: '作业终止', + name: '开始', value: 1 }, { - name: '作业结束待验收', + name: '结束', value: 2 - }, - { - name: '作业完成', - value: 3 } ], - warningData: [ - { - name: '黄公子', - dep: '有机事业部', - warning: 69, - role: '作业人', - isCard: 1 - }, - { - name: '李飞飞', - dep: '有机事业部', - warning: 51, - role: '监护人', - isCard: 0 - }, - { - name: '黄公子', - dep: '有机事业部', - warning: 69, - role: '作业人', - isCard: 1 - } - ], + pieData: [], + squareData: [], + warningData: [], reviewForm: { advice: '' }, @@ -556,34 +510,56 @@ }); // 页面载入时执行方法 onMounted(() => { - // getListByPage(); + initTime() + getMydepList() getAllDepartment(); - initZyfb() - initSlfx() - initZyqs() - state.endTime = formatDate(new Date()) - // state.chartSearch1.startTime = getPeriod(30) - console.log(state.chartSearch1.startTime,state.endTime,'默认时间段') + getTypePie() + getWorkDep() + getDepMonth() + getWarningList() }); + const initTime =()=>{ + state.chartSearch1.startTime = getPeriod(30) + state.chartSearch2.startTime = getPeriod(30) + state.chartSearch4.startTime = getPeriod(30) + state.endTime = formatDate(new Date()) + } const getPeriod =(num)=> { const currentDate = new Date(); const startTime = new Date(); - startTime.setDate(currentDate.getDate() - num); + startTime.setDate(currentDate.getDate() - num - 1); return formatDate(startTime) } const formatDate =(date)=> { - const year = date.getFullYear().toString().slice(-2); + const year = date.getFullYear().toString(); const month = ('0' + (date.getMonth() + 1)).slice(-2); const day = ('0' + date.getDate()).slice(-2); - return `${year}-${month}-${day} 00:00:00`; + return `${year}-${month}-${day} 23:59:59`; } const changeTime1=(value:number)=>{ state.chartSearch1.startTime = getPeriod(value) - console.log(state.chartSearch1.startTime,state.endTime,'结束段') + getTypePie() } - const changeTime2=(value:number)=>{ + const changeTime4=(value:number)=>{ state.chartSearch4.startTime = getPeriod(value) console.log(state.chartSearch4.startTime,state.endTime,'结束段') + getWarningList() + } + const changeDep1=()=>{ + getTypePie() + } + + const changeDep2=()=>{ + getWorkDep() + } + const changeType2=()=>{ + getWorkDep() + } + const changeType4=()=>{ + getWarningList() + } + const changeDep3=()=>{ + getDepMonth() } const toFullscreen =()=>{ const element = document.getElementById('bigScreen') @@ -598,14 +574,95 @@ }else{ state.themeColor = '#333' } - initZyfb() - initSlfx() - initZyqs() + initTime() + getMydepList() + getAllDepartment(); + getTypePie() + getWorkDep() + getDepMonth() } const getTypePie = async ()=>{ - let res = await specialIndexApi().analyseType(state.chartSearch1.startTime,state.chartSearch1.endTime,state.chartSearch1.searchDep); + const data = { + startTime: state.chartSearch1.startTime, + endTime:state.endTime, + depId:state.chartSearch1.depId + } + let res = await specialIndexApi().analyseType(data); if (res.data.code === '200') { - console.log(res.data,'666666666') + // console.log('饼图数据>>>', res.data.data) + state.pieData = JSON.parse(JSON.stringify(res.data.data)) + initZyfb() + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + const getWorkDep = async ()=>{ + const data = { + // startTime: state.chartSearch2.startTime, + // endTime: state.endTime, + depId:state.chartSearch2.depId, + type: state.chartSearch2.type + } + let res = await specialIndexApi().analyseAllWork(data); + if (res.data.code === '200') { + state.squareData = JSON.parse(JSON.stringify(res.data.data)) + let names = state.squareData.map(i=>i.name) + let vals = state.squareData.map(i=>i.value) + initSlfx(names,vals) + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + const getDepMonth = async ()=>{ + let res = await specialIndexApi().analyseDepMonth(state.chartSearch3.depId); + if (res.data.code === '200') { + state.squareData = JSON.parse(JSON.stringify(res.data.data)) + let names = state.squareData.map(i=>i.name) + let vals = state.squareData.map(i=>i.value) + initZyqs(names,vals) + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + const getMydepList = async()=>{ + const dateRange = JSON.parse(JSON.stringify(state.searchDate)) + if(dateRange[1]){ + dateRange[1] = dateRange[1].replace('00:00:00','23:59:59') + state.searchParams.startTime = dateRange[0] + state.searchParams.endTime = dateRange[1] + }else{ + state.searchParams.startTime = '' + state.searchParams.endTime = '' + } + let res = await specialIndexApi().getMydepList({pageIndex: state.pageIndex,pageSize: state.pageSize,searchParams: state.searchParams}) + if (res.data.code === '200') { + state.workData = JSON.parse(JSON.stringify(res.data.data)) + state.totalSize = res.data.total + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + const getWarningList = async()=>{ + const data = { + startTime: state.chartSearch4.startTime, + endTime: state.endTime, + workType:state.chartSearch4.workType + } + let res = await specialIndexApi().getWorkWarning(data) + if (res.data.code === '200') { + state.warningData = JSON.parse(JSON.stringify(res.data.data)) } else { ElMessage({ type: 'warning', @@ -637,7 +694,7 @@ }, series: [ { - name: 'Access From', + name: '', type: 'pie', radius: ['40%', '70%'], avoidLabelOverlap: false, @@ -668,16 +725,7 @@ shadowColor: 'rgba(0, 0, 0, 0.5)' }, }, - data: [ - { value: 1048, name: '动火作业' }, - { value: 735, name: '受限空间作业' }, - { value: 580, name: '吊装作业' }, - { value: 484, name: '动土作业' }, - { value: 735, name: '断路作业' }, - { value: 580, name: '高处作业' }, - { value: 484, name: '临时用电作业' }, - { value: 300, name: '盲板抽堵作业' } - ] + data: state.pieData } ] } @@ -687,7 +735,7 @@ myChart.resize(); }); } - const initSlfx =()=>{ + const initSlfx =(names:Array<string>,vals:Array<any>)=>{ let dom = document.getElementById(slfx.value); let myChart = echarts.init(dom); let option: EChartsOption; @@ -707,7 +755,7 @@ xAxis: [ { type: 'category', - data: ['事业部1', '事业部2', '事业部3', '事业部4', '事业部5', '事业部6', '事业部7'], + data: names, axisTick: { alignWithLabel: true }, @@ -726,7 +774,7 @@ name: 'Direct', type: 'bar', barWidth: '60%', - data: [10, 52, 200, 334, 390, 330, 220] + data: vals, } ] } @@ -736,14 +784,14 @@ myChart.resize(); }); } - const initZyqs =()=>{ + const initZyqs =(names:Array<string>,vals:Array<any>)=>{ let dom = document.getElementById(zyqs.value); let myChart = echarts.init(dom); let option: EChartsOption; option = { xAxis: { type: 'category', - data: ['四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月', '一月', '二月', '三月'], + data: names, axisLabel: { color: state.themeColor } @@ -767,7 +815,7 @@ }, series: [ { - data: [150, 230, 224, 218, 135, 147, 230, 224, 218, 135, 147, 260], + data: vals, type: 'line', label:{ show: true @@ -783,7 +831,7 @@ } // 刷新 const reLoadData = async () => { - // getListByPage(); + getMydepList() }; // 填写表单 @@ -832,107 +880,153 @@ // } // }; - // 表格数据格式化 - const toNames = (row, column, cellValue, index) => { - if (row.list == []) { - return []; - } else { - const nameList = []; - for (let i = 0; i < row.list.length; i++) { - for (let t = 0; t < state.workTimeList.length; t++) { - if (row.list[i] == state.workTimeList[t].id) { - nameList.push(state.workTimeList[t].name); - } - } - } - return nameList.join(); - } - }; - // 关键词查询记录 const searchRecord = async () => { - if (state.searchWord == null && state.searchStatus == null && state.searchDep == null && state.searchDate == []) { - ElMessage({ - type: 'warning', - message: '请输入查询关键词' - }); - } else { - // getListByPage(); - } + getMydepList() }; // 重置搜索 const clearSearch = async () => { - state.searchWord = null; - state.searchDep = null; + state.searchParams = { + workType:null, + workDepId:null, + workPermitNo: '', + startTime: '', + endTime: '', + workAllStatus: null + } state.searchDate = [] - // getListByPage(); + state.pageIndex = 1 + getMydepList() }; - const handleSizeChange1 = (val: number) => { - state.pageSize1 = val; - // getListByPage(); + const handleSizeChange = (val: number) => { + state.pageSize = val; + getMydepList() }; - const handleCurrentChange1 = (val: number) => { - state.pageIndex1 = val; - // getListByPage(); + const handleCurrentChange = (val: number) => { + state.pageIndex = val; + getMydepList() }; // 查看记录 - const viewRecord = (row: any) => { - state.dialogType = row.workType - state.details = JSON.parse(JSON.stringify(row)); - if(state.details.workDetail.otherSpecialWork == '' || !state.details.workDetail.otherSpecialWork){ - state.details.workDetail.otherSpecialWork=[] - } - else { - const a = state.details.workDetail.otherSpecialWork - state.details.workDetail.otherSpecialWork = a.split(',').map((item) => { - return state.workType.find((i: { id: number }) => i.id === Number(item))?.name; - }); - } - if(state.details.workDetail.involvedDepIds == '' || !state.details.workDetail.involvedDepIds){ - state.details.workDetail.involvedDepIds=[] - } - else { - const a = state.details.workDetail.involvedDepIds - state.details.workDetail.involvedDepIds = a.split(',').map((item) => { - return state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(item))?.depName; - }); - } - if(state.details.workDetail.csDepId){ - state.details.workDetail.csDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.csDepId))?.depName; - } - if(state.details.workDetail.operationDepId){ - state.details.workDetail.operationDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.operationDepId))?.depName; - } - if(state.details.workDetail.gbPath){ - state.details.workDetail.gbPath = state.details.workDetail.gbPath.split(',') - } - if(state.details.workDetail.bcPath){ - state.details.workDetail.bcPath = state.details.workDetail.bcPath.split(',') - } - if(state.details.workDetail.bpLocationMapPath){ - state.details.workDetail.bpLocationMapPath = state.details.workDetail.bpLocationMapPath.split(',') - } - state.dialogDetails = true; - }; + // const viewDetail = (row: any) => { + // state.dialogType = row.workType + // state.details = JSON.parse(JSON.stringify(row)); + // if(state.details.workDetail.otherSpecialWork == '' || !state.details.workDetail.otherSpecialWork){ + // state.details.workDetail.otherSpecialWork=[] + // } + // else { + // const a = state.details.workDetail.otherSpecialWork + // state.details.workDetail.otherSpecialWork = a.split(',').map((item) => { + // return state.workTypeList.find((i: { id: number }) => i.id === Number(item))?.name; + // }); + // } + // if(state.details.workDetail.involvedDepIds == '' || !state.details.workDetail.involvedDepIds){ + // state.details.workDetail.involvedDepIds=[] + // } + // else { + // const a = state.details.workDetail.involvedDepIds + // state.details.workDetail.involvedDepIds = a.split(',').map((item) => { + // return state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(item))?.depName; + // }); + // } + // if(state.details.workDetail.csDepId){ + // state.details.workDetail.csDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.csDepId))?.depName; + // } + // if(state.details.workDetail.operationDepId){ + // state.details.workDetail.operationDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.operationDepId))?.depName; + // } + // if(state.details.workDetail.gbPath){ + // state.details.workDetail.gbPath = state.details.workDetail.gbPath.split(',') + // } + // if(state.details.workDetail.bcPath){ + // state.details.workDetail.bcPath = state.details.workDetail.bcPath.split(',') + // } + // if(state.details.workDetail.bpLocationMapPath){ + // state.details.workDetail.bpLocationMapPath = state.details.workDetail.bpLocationMapPath.split(',') + // } + // state.dialogDetails = true; + // }; - const handleReview = (row)=>{ - state.dialogReview = true + // const handleReview = (row: object)=>{ + // state.dialogReview = true + // } + const openVideo = (row:object)=>{ + videoRef.value.openDialog(row) } - const openVideo = ()=>{ - videoRef.value.openDialog() + + const viewRecord = (id: string | null)=>{ + recordRef.value.openDialog(id) } - const submitReview = async (formEl: FormInstance | undefined) => { - if (!formEl) return - await formEl.validate((valid, fields) => { - if (valid) { - console.log('submit!') + + const viewTicket = async(row)=>{ + let res = await workApplyApi().viewTicket({id:row.workApplyId}) + if(res.data.code == 200){ + console.log(res.data,666) + } + axios.post(import.meta.env.VITE_API_URL + `/specialwork9step/work/down/load/pdf`,{id: row.workApplyId},{headers:{'Content-Type': 'application/json','Authorization': `${Cookies.get('token')}`,'uid':`${Cookies.get('uid')}`},responseType: 'blob'}).then(res=>{ + if (res) { + const link = document.createElement('a') + let blob = new Blob([res.data],{type: 'application/pdf'}) + link.style.display = "none"; + link.href = URL.createObjectURL(blob); // 创建URL + link.setAttribute("download", row.workPermitNo + "(" + row.workTypeDesc +")作业证.pdf"); + window.open(link) } else { - console.log('error submit!', fields) + ElMessage({ + type: 'warning', + message: '预览失败' + }); } }) } + + // 导出方法 + const downLoadTicket = async (row) => { + // let res = await workApplyApi().postPrinting(data); + axios.post(import.meta.env.VITE_API_URL + `/specialwork9step/work/down/load/pdf`,{id: row.workApplyId},{headers:{'Content-Type': 'application/json','Authorization': `${Cookies.get('token')}`,'uid':`${Cookies.get('uid')}`},responseType: 'blob'}).then(res=>{ + if (res) { + const link = document.createElement('a') + let blob = new Blob([res.data],{type: 'application/pdf'}) + link.style.display = "none"; + link.href = URL.createObjectURL(blob); // 创建URL + link.setAttribute("download", row.workPermitNo + "(" + row.workTypeDesc +")作业证.pdf"); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } else { + ElMessage({ + type: 'warning', + message: '导出失败' + }); + } + }) + } + + // const submitReview = async (formEl: FormInstance | undefined) => { + // if (!formEl) return + // await formEl.validate(async(valid, fields) => { + // if (valid) { + // let res = await workApplyApi().acceptWork(state.reviewForm); + // if (res.data.code === '200') { + // ElMessage({ + // type: 'success', + // message: '作业验收成功', + // duration: 2000 + // }); + // state.dialogReview = false; + // await getMydepList() + // } else { + // ElMessage({ + // type: 'warning', + // message: res.data.msg + // }); + // } + // } else { + // console.log('error submit!', fields) + // } + // }) + // } // 折线图 const renderMenu = async (value: string) => { @@ -953,24 +1047,32 @@ VideoPlay, reviewFormRef, videoRef, + recordRef, zyfb, slfx, zyqs, changeTime1, - changeTime2, + changeTime4, + changeDep1, + changeDep2, + changeType2, + changeType4, + changeDep3, toFullscreen, - handleReview, + // handleReview, openVideo, - submitReview, + // submitReview, reLoadData, toApply, - toNames, searchRecord, clearSearch, + // viewDetail, viewRecord, + viewTicket, + downLoadTicket, // getListByPage, - handleSizeChange1, - handleCurrentChange1, + handleSizeChange, + handleCurrentChange, ...toRefs(state) }; } @@ -1075,57 +1177,57 @@ .chart{ width: 100%; height: 85%; + overflow-y: scroll; .el-table{ - height: 90% !important; - :deep(.el-table__inner-wrapper){ - height: 100% !important; - .el-table__header-wrapper { - height: 20% !important; - .el-table__header{ - height: 100% !important; - th{ - height: 100% !important; - padding: 0 0 !important; - .cell{ - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - } - } - } - .el-table__body-wrapper { - height: 80% !important; - .el-scrollbar__view{ - height: 100% !important; - .el-table__body{ - height: 100% !important; - tbody{ - height: 100% !important; - .el-table__row{ - height: 25% !important; - td{ - height: 25% !important; - padding: 0 0 !important; - .left-info{ - display: flex; - align-items: center; - } - .cell{ - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - .el-button{ - padding: 0 !important; - } - } - } - } - } - } - } - } + //:deep(.el-table__inner-wrapper){ + // height: 100% !important; + // .el-table__header-wrapper { + // height: 20% !important; + // .el-table__header{ + // height: 100% !important; + // th{ + // height: 100% !important; + // padding: 0 0 !important; + // .cell{ + // white-space: nowrap; + // overflow: hidden; + // text-overflow: ellipsis; + // } + // } + // } + // } + // .el-table__body-wrapper { + // height: 80% !important; + // .el-scrollbar__view{ + // height: 100% !important; + // .el-table__body{ + // height: 100% !important; + // tbody{ + // height: 100% !important; + // .el-table__row{ + // height: 25% !important; + // td{ + // height: 25% !important; + // padding: 0 0 !important; + // .left-info{ + // display: flex; + // align-items: center; + // } + // .cell{ + // white-space: nowrap; + // overflow: hidden; + // text-overflow: ellipsis; + // } + // .el-button{ + // padding: 0 !important; + // } + // } + // } + // } + // } + // } + // } + //} } } .el-radio-group{ @@ -1441,6 +1543,7 @@ .container{ padding: 20px; background: url('../../../assets/spwbg.png') no-repeat center; + background-size: 100% 100%; .full{ position:fixed; -- Gitblit v1.9.2