From 01f3e49f3763a25ef67a4c3e5786491703a1aece Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期四, 13 七月 2023 14:39:58 +0800 Subject: [PATCH] 特殊作业对接修改 --- src/api/systemManage/user/index.ts | 46 src/views/newSpecialWorkSystem/workTicket/zysq/index.vue | 65 src/views/specialWorkSystem/workTicket/zysq/components/broken.vue | 2 src/views/system/appVersion/index.vue | 4 src/views/system/user/component/dialogCertificate.vue | 198 ++ src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue | 101 src/views/newHome/index.vue | 1 src/views/specialWorkSystem/workTicket/zysq/components/ground.vue | 2 src/views/specialWorkSystem/alarm/zyyjjl/index.vue | 22 src/api/specialWorkSystem/workerManage/index.ts | 32 src/views/newSpecialWorkSystem/workerManage/aqyBase/index.vue | 339 +++ src/views/specialWorkSystem/specialIndex/index.vue | 337 +- src/views/specialWorkSystem/process/components/dialogPermitNo.vue | 9 src/router/route.ts | 40 src/views/newSpecialWorkSystem/workTicket/zysq/components/hoist.vue | 100 src/views/specialWorkSystem/specialIndex/components/videoDetail.vue | 194 + src/api/specialWorkSystem/workProcess/index.ts | 8 src/api/specialWorkSystem/workApply/index.ts | 81 src/views/newSpecialWorkSystem/workerManage/operatorBase/index.vue | 339 +++ src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue | 554 +---- src/views/doublePrevent/riskCheckManage/hiddenManagement/hiddenReport/index.vue | 2 src/views/newSpecialWorkSystem/workTicket/wdsq/components/jsaReportDialog.vue | 379 ++++ src/views/specialWorkSystem/workTicket/zysq/components/plate.vue | 2 src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue | 111 src/views/newSpecialWorkSystem/workTicket/zysq/components/broken.vue | 172 src/views/newSpecialWorkSystem/workTicket/zysq/components/height.vue | 100 src/views/newSpecialWorkSystem/workerManage/guardianBase/index.vue | 339 +++ src/views/specialWorkSystem/process/zyjcgl/index.vue | 130 src/views/system/user/component/userDialog.vue | 3 src/views/newSpecialWorkSystem/workerManage/component/userDialog.vue | 279 ++ src/views/system/user/index.vue | 14 src/views/newSpecialWorkSystem/workTicket/zysq/components/plate.vue | 159 src/views/newSpecialWorkSystem/workTicket/sbtj/index.vue | 401 ++++ src/views/newSpecialWorkSystem/workTicket/zysq/components/space.vue | 97 src/views/system/user/component/ctfDialog.vue | 355 +++ src/views/newSpecialWorkSystem/workTicket/zysq/components/power.vue | 101 src/views/specialWorkSystem/specialIndex/components/workRecord.vue | 161 + src/views/newSpecialWorkSystem/workTicket/zysq/components/workSelect.vue | 184 + src/api/specialWorkSystem/specialIndex/index.ts | 9 src/views/newSpecialWorkSystem/workTicket/zysq/components/ground.vue | 144 40 files changed, 4,218 insertions(+), 1,398 deletions(-) diff --git a/src/api/specialWorkSystem/specialIndex/index.ts b/src/api/specialWorkSystem/specialIndex/index.ts index b57ff7e..5affc2d 100644 --- a/src/api/specialWorkSystem/specialIndex/index.ts +++ b/src/api/specialWorkSystem/specialIndex/index.ts @@ -24,7 +24,14 @@ }, getMydepList: (data: object) => { return request({ - url: import.meta.env.VITE_API_URL + `/work/page/my-dep/list`, + url: import.meta.env.VITE_API_URL + `/specialwork9step/working/page/my-dep/list`, + method: 'post', + data: data + }); + }, + getWorkRecord: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/specialwork9step/work/log`, method: 'post', data: data }); diff --git a/src/api/specialWorkSystem/workApply/index.ts b/src/api/specialWorkSystem/workApply/index.ts index 7a86f70..6e99bea 100644 --- a/src/api/specialWorkSystem/workApply/index.ts +++ b/src/api/specialWorkSystem/workApply/index.ts @@ -29,6 +29,42 @@ }); }, + // 上传研判报告 + uploadJsaReport: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/specialwork9step/work/apply/risk/assessment`, + method: 'post', + data: data + }); + }, + + // 查看研判报告 + viewJsaReport: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/specialwork9step/work/risk/assessment/record`, + method: 'post', + data: data + }); + }, + + // 新正式办票 + checkTicket: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/specialwork9step/work/apply/ticket/processing`, + method: 'post', + data: data + }); + }, + + // 新作废办票 + abolishTicket: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/specialwork9step/work/apply/abolish`, + method: 'post', + data: data + }); + }, + // 获取基础数据 getFormData: (type: number) => { return request({ @@ -213,6 +249,24 @@ }); }, + // 获取八种作业 + getOtherWork: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/specialwork9step/work/involve/other/work/list`, + method: 'post', + data: data + }); + }, + + // 查看作业票 + viewTicket: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/specialwork9step/work/view`, + method: 'post', + data: data + }); + }, + // 查询进度 getStatus: (data: object) => { return request({ @@ -226,6 +280,15 @@ getAllStatus: (data: object) => { return request({ url: import.meta.env.VITE_API_URL + `/work/apply/others/view`, + method: 'post', + data: data + }); + }, + + // 作业验收 + acceptWork: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/specialwork9step/working/accept`, method: 'post', data: data }); @@ -286,6 +349,22 @@ method: 'post', data: data }); - } + }, + // 申报统计饼图 + getSbtjPie: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/specialwork9step/statistic/workType`, + method: 'post', + data: data + }); + }, + // 申报统计饼图 + getSbtjTable: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/specialwork9step/statistic/dep`, + method: 'post', + data: data + }); + }, }; } diff --git a/src/api/specialWorkSystem/workProcess/index.ts b/src/api/specialWorkSystem/workProcess/index.ts index 0cd1ff0..e1c32c5 100644 --- a/src/api/specialWorkSystem/workProcess/index.ts +++ b/src/api/specialWorkSystem/workProcess/index.ts @@ -14,7 +14,7 @@ // 分页获取检查列表 getCheckListPage: (data: object) => { return request({ - url: import.meta.env.VITE_API_URL + `/work/process/check/page/list`, + url: import.meta.env.VITE_API_URL + `/specialwork9step/process/check/page/list`, method: 'post', data: data }); @@ -32,7 +32,7 @@ // 检查上报 postCheckReport: (data: object) => { return request({ - url: import.meta.env.VITE_API_URL + `/work/process/check/report`, + url: import.meta.env.VITE_API_URL + `/specialwork9step/process/check/report`, method: 'post', data: data }); @@ -41,7 +41,7 @@ // 获取可上报作业列表 postReportList: (data: object) => { return request({ - url: import.meta.env.VITE_API_URL + `/work/process/workApply/list`, + url: import.meta.env.VITE_API_URL + `/specialwork9step/process/workApply/list`, method: 'post', data: data }); @@ -50,7 +50,7 @@ // 获取预警记录 postAlertList: (data: object) => { return request({ - url: import.meta.env.VITE_API_URL + `/work/process/warning/page/list`, + url: import.meta.env.VITE_API_URL + `/specialwork9step/process/warning/page/list`, method: 'post', data: data }); diff --git a/src/api/specialWorkSystem/workerManage/index.ts b/src/api/specialWorkSystem/workerManage/index.ts new file mode 100644 index 0000000..3b092a0 --- /dev/null +++ b/src/api/specialWorkSystem/workerManage/index.ts @@ -0,0 +1,32 @@ +import request from '/@/utils/request'; + +export function workerManageApi() { + return { + // 分页获取作业人列表 + getOperatorListPage: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/account/operator/page/list`, + method: 'post', + data: data + }); + }, + + // 分页获取安全员列表 + getHeaderListPage: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/account/header/page/list`, + method: 'post', + data: data + }); + }, + + // 分页获取监护人列表 + getGuardianListPage: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/account/guardian/page/list`, + method: 'post', + data: data + }); + }, + }; +} diff --git a/src/api/systemManage/user/index.ts b/src/api/systemManage/user/index.ts index 52370a6..bc6d4fe 100644 --- a/src/api/systemManage/user/index.ts +++ b/src/api/systemManage/user/index.ts @@ -41,11 +41,55 @@ method: 'get' }); }, + getAllUser: () => { return request({ url: import.meta.env.VITE_API_URL + `/account/list`, method: 'get' }); - } + }, + + // 获取图片上传路径 + getPresignUrl: (name: string) => { + return request({ + url: import.meta.env.VITE_API_URL + `/account/file/getPresignUrl`, + method: 'post', + data: { prefixName: name.split('.')[0], suffixName: name.split('.')[1] } + }); + }, + + // 根据uid获取用户证书 + getCtf: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/account/cert/list`, + method: 'post', + data: data + }); + }, + + addCtf: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/account/cert/add`, + method: 'post', + data: data + }); + }, + + // v1 + modCtf: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/account/cert/update`, + method: 'post', + data: data + }); + }, + + delCtf: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/account/cert/delete`, + method: 'post', + data: data + }); + }, }; } diff --git a/src/router/route.ts b/src/router/route.ts index 0f289d4..27f6937 100644 --- a/src/router/route.ts +++ b/src/router/route.ts @@ -111,45 +111,5 @@ meta: { title: '安全物资与设备' } - }, - { - path: '/dhzy', - name: 'dhzy', - component: () => import('/@/views/newSpecialWorkSystem/workTicket/zysq/index.vue'), - meta: { - title: '作业申请' - } - }, - { - path: '/wdsq1', - name: 'wdsq1', - component: () => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/index.vue'), - meta: { - title: '我的申请' - } - }, - { - path: '/sqjl1', - name: 'sqjl1', - component: () => import('/@/views/newSpecialWorkSystem/workTicket/sqjl/index.vue'), - meta: { - title: '申请记录' - } - }, - { - path: '/sbtj', - name: 'sbtj', - component: () => import('/@/views/newSpecialWorkSystem/workTicket/sbtj/index.vue'), - meta: { - title: '申报统计' - } - }, - { - path: '/aqy', - name: 'aqy', - component: () => import('/@/views/newSpecialWorkSystem/workerManage/aqyBase/index.vue'), - meta: { - title: '安全员管理' - } } ]; diff --git a/src/views/doublePrevent/riskCheckManage/hiddenManagement/hiddenReport/index.vue b/src/views/doublePrevent/riskCheckManage/hiddenManagement/hiddenReport/index.vue index d958349..8015828 100644 --- a/src/views/doublePrevent/riskCheckManage/hiddenManagement/hiddenReport/index.vue +++ b/src/views/doublePrevent/riskCheckManage/hiddenManagement/hiddenReport/index.vue @@ -261,7 +261,7 @@ }; // 删除 const onDelProductionDevice = (row: any) => { - ElMessageBox.confirm(`此操作将永久该条隐患,是否继续?`, '提示', { + ElMessageBox.confirm(`此操作将永久删除该条隐患,是否继续?`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' diff --git a/src/views/newHome/index.vue b/src/views/newHome/index.vue index 98d1da9..e04132f 100644 --- a/src/views/newHome/index.vue +++ b/src/views/newHome/index.vue @@ -383,6 +383,7 @@ //调用菜单方法 const renderMenu = throttle(() => { + // debugger renderFun(); }, 2000); diff --git a/src/views/newSpecialWorkSystem/workTicket/sbtj/index.vue b/src/views/newSpecialWorkSystem/workTicket/sbtj/index.vue new file mode 100644 index 0000000..bd13c15 --- /dev/null +++ b/src/views/newSpecialWorkSystem/workTicket/sbtj/index.vue @@ -0,0 +1,401 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <div class="homeCard"> + <div class="topChart"> + <div class="chart-item"> + <div class="chart-tit"> + <span class="tit">申报特殊作业类别分布图</span> + </div> + <div class="chart" :id="zyfb"></div> + <div style="width: 100%;text-align: center"> + <el-radio-group v-model="days1" @change="(value)=>changeTime1(value)"> + <el-radio-button v-for="item in timeList" :label='item.value' border>{{item.label}}</el-radio-button> + </el-radio-group> + </div> + </div> + </div> + <div class="topChart"> + <div class="chart-item"> + <div class="chart-tit"> + <span class="tit">各事业部申报特殊作业情况</span> + <div class="filter-part"> + <el-select v-model="days2" size="large" :teleported="false" @change="changeTime2()"> + <el-option + v-for="item in timeList" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </div> + </div> + <el-table :data="tableData" style="width: 100%" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column property="seDepName" label="事业部" align="center"/> + <el-table-column property="totalCount" label="总数" align="center"/> + <el-table-column v-for="workType in workTypes" :key="workType.workType" :label="workType.workTypeDesc" :prop="`list.${workType.workType - 1}.count`"></el-table-column> + </el-table> + </div> + </div> + </div> + </div> + </div> +</template> + +<script lang="ts"> +import {toRefs, reactive, defineComponent, ref, onMounted, defineAsyncComponent} from 'vue'; +import { storeToRefs } from 'pinia'; +import { initBackEndControlRoutes } from '/@/router/backEnd'; +import { useUserInfo } from '/@/stores/userInfo'; +import { Session } from '/@/utils/storage'; +import { useRouter } from 'vue-router'; +import * as echarts from "echarts"; +import {specialIndexApi} from "/@/api/specialWorkSystem/specialIndex"; +import {ElMessage} from "element-plus/es"; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; + +// 定义接口来定义对象的类型 +interface stateType { + startTime1: string + startTime2: string + endTime: string + tableData: Array<any> + days1: number + days2: number + timeList: Array<timeType> + workTypes: Array<any> +} + +interface timeType{ + label: string, + value: number +} + +export default defineComponent({ + name: 'sbtj', + components: { + }, + setup() { + const userInfo = useUserInfo(); + const { userInfos } = storeToRefs(userInfo); + const router = useRouter(); + const zyfb = ref("eChartZyfb" + Date.now() + Math.random()) + const state = reactive<stateType>({ + startTime1: '', + startTime2: '', + days1: 30, + days2: 30, + endTime: '', + tableData: [], + timeList:[ + { + label: '昨日', + value: 1 + }, + { + label: '近七天', + value: 7 + }, + { + label: '近30天', + value: 30 + }, + { + label: '近180天', + value: 180 + } + ], + workTypes: [ // 定义工作类型的列表 + { workType: 1, workTypeDesc: '动火作业' }, + { workType: 2, workTypeDesc: '受限空间作业' }, + { workType: 3, workTypeDesc: '吊装作业' }, + { workType: 4, workTypeDesc: '动土作业' }, + { workType: 5, workTypeDesc: '断路作业' }, + { workType: 6, workTypeDesc: '高处作业' }, + { workType: 7, workTypeDesc: '临时用电作业' }, + { workType: 8, workTypeDesc: '盲板抽堵作业' }, + ], + }); + + // 折线图 + const renderMenu = async (value: string) => { + Session.set('projectId', value); + userInfos.value.projectId = value; + await initBackEndControlRoutes(); + }; + + // 页面载入时执行方法 + onMounted(() => { + initTime() + getTypePie() + getTableData() + }); + + const getTypePie = async ()=>{ + const data = { + startTime: state.startTime1, + endTime:state.endTime + } + let res = await workApplyApi().getSbtjPie(data); + if (res.data.code === '200') { + if(res.data.data && res.data.data.length>0){ + const pieData = res.data.data.map(({workTypeDesc,count})=>({ name: workTypeDesc,value: count})) + initZyfb(pieData) + } + else{ + initZyfb([]) + } + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + + const getTableData = async ()=>{ + const data = { + startTime: state.startTime2, + endTime:state.endTime + } + let res = await workApplyApi().getSbtjTable(data); + if (res.data.code === '200') { + state.tableData = res.data.data + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + + const initTime =()=>{ + state.startTime1 = getPeriod(30) + state.startTime2 = getPeriod(30) + state.endTime = formatDate(new Date()) + } + const getPeriod =(num)=> { + const currentDate = new Date(); + const startTime = new Date(); + startTime.setDate(currentDate.getDate() - num); + return formatDate(startTime) + } + const formatDate =(date)=> { + 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`; + } + + const changeTime1=(value:number)=>{ + state.startTime1 = getPeriod(value) + getTypePie() + } + + const changeTime2=()=>{ + state.startTime2 = getPeriod(state.days2) + getTableData() + } + + type EChartsOption = echarts.EChartsOption + const initZyfb =(data:Array<any>)=>{ + let dom = document.getElementById(zyfb.value); + let myChart = echarts.init(dom); + let option: EChartsOption; + option = { + tooltip: { + trigger: 'item' + }, + legend: { + orient: 'horizontal', + itemStyle: { + borderWidth: 0 // 设置图例边框宽度为0 + } + }, + series: [ + { + name: '作业分布', + type: 'pie', + radius: ['40%', '70%'], + center: ['50%', '52%'], + avoidLabelOverlap: false, + itemStyle: { + borderRadius: 1, + borderColor: '#fff', + borderWidth: 1 + }, + label: { + show: true, + position: 'outside', + overflow: 'truncate', + borderWidth: 0, + }, + labelLine: { + show: true, // 显示指示线 + lineStyle: { + color: '#ccc', + width: 1, + type: 'solid' + } + }, + emphasis: { + itemStyle: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + }, + }, + data: data + } + ] + } + + option && myChart.setOption(option); + window.addEventListener("resize",function (){ + myChart.resize(); + }); + } + + return { + zyfb, + changeTime1, + changeTime2, + ...toRefs(state) + }; + } +}); +</script> + +<style scoped lang="scss"> +$homeNavLengh: 8; +.home-container { + height: calc(100vh - 144px); + box-sizing: border-box; + overflow: hidden; + .homeCard { + width: 100%; + padding: 20px; + box-sizing: border-box; + border-radius: 4px; + + .topChart{ + width: 100%; + height: calc(50vh - 102px); + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 20px; + &:last-of-type{ + margin-bottom: 0; + } + + .chart-item{ + width: 100%; + height: 100%; + position: relative; + background: #fff; + padding: 20px; + + .chart-tit{ + width: 100%; + display: flex; + align-items: flex-start; + justify-content: space-between; + margin-bottom: 20px; + .tit{ + font-size: 1.33rem; + font-weight: bolder; + white-space: nowrap; + } + .filter-part{ + display: flex; + align-items: center; + justify-content: right; + :deep(.el-cascader){ + width: 35% !important; + } + .el-select{ + width: 100% !important; + } + .el-switch{ + width: 25% !important; + + :deep(.el-switch__core){ + width: 100% !important; + } + } + } + .filter-part2{ + :deep(.el-cascader){ + width: 100% !important; + } + } + + } + .chart{ + width: 100%; + height: 80%; + .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(.active-ring-info){ + .active-ring-name{ + font-size: 1.5rem !important; + text-align: center; + } + } + } + } + } +} +</style> diff --git a/src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue b/src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue index dcd2db8..6882547 100644 --- a/src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue +++ b/src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue @@ -4,28 +4,46 @@ <!-- <el-tab-pane label="申请中" name="1">--> <div style="height: 100%"> <el-row class="homeCard"> + <div class="basic-line" style="display:flex;white-space:nowrap;line-height: 40px"> + <span>时间筛选:</span> + <el-date-picker v-model="timeRange" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" @change="giveTime()" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" /> + </div> + <div class="basic-line" style="display:flex;white-space:nowrap;line-height: 40px"> + <span>负责人:</span> + <el-input v-model="searPara.headUserName" placeholder="负责人"/> + </div> + <div class="basic-line"> + <span>事业部:</span> + <el-select v-model="searPara.secondDepId"> + <el-option + v-for="item in dep4List" + :key="item.id" + :label="item.name" + :value="item.id" + /> + </el-select> + </div> + <div class="basic-line"> <span>作业类型:</span> - <el-col :span="10"> - <div class="grid-content topInfo"> - <el-select v-model="searchWord"> - <el-option - v-for="item in workType" - :key="item.id" - :label="item.name" - :value="item.id" - /> - </el-select> - - <el-button type="primary" @click="searchRecord">查询</el-button> - <el-button plain @click="clearSearch">重置</el-button> - </div> - </el-col> + <el-select v-model="searPara.workType"> + <el-option + v-for="item in workType" + :key="item.id" + :label="item.name" + :value="item.id" + /> + </el-select> + </div> + <div style="margin-left: 20px"> + <el-button type="primary" @click="searchRecord">查询</el-button> + <el-button plain @click="clearSearch">重置</el-button> + </div> </el-row> <div class="homeCard"> <div class="main-card"> <el-row class="cardTop"> <el-col :span="12" class="mainCardBtn"> - <el-button type="primary" :icon="Plus" size="default" @click="toApply()">申请</el-button> + <el-button type="primary" :icon="Plus" size="default" @click="toApply()">新增申报</el-button> <!-- <el-button type="danger" :icon="Delete" size="default">删除</el-button>--> <!-- <el-button type="success" size="default">设置分类</el-button>--> </el-col> @@ -76,10 +94,10 @@ </el-table-column> <el-table-column fixed="right" label="操作" align="center" width="300"> <template #default="scope"> - <el-button link type="danger" size="small" :icon="Delete" @click="deleteRecordBtn(scope.row)">作废</el-button> +<!-- <el-button link type="danger" size="small" :icon="Delete" @click="deleteRecordBtn(scope.row)">作废</el-button>--> <el-button link type="primary" size="small" :icon="View" @click="viewRecord(scope.row)">查看</el-button> - <el-button link type="success" size="small" :icon="Finished">修改</el-button> - <el-button link type="success" size="small" :icon="Download">正式办票</el-button> +<!-- <el-button link type="success" size="small" :icon="Finished">修改</el-button>--> +<!-- <el-button link type="success" size="small" :icon="Download">正式办票</el-button>--> <!-- <el-button :disabled="scope.row.status == 7 ? false : true" link type="primary" size="small" :icon="Download" @click="downLoadBtn(scope.row)">导出作业票</el-button>--> </template> </el-table-column> @@ -265,7 +283,6 @@ deleteId: null | number; downLoadId: null | number; downLoadName: string; - searchWord: string; totalSize1: number; activeName: string; addRecord: {}; @@ -276,6 +293,9 @@ departmentList: Array<any>; departmentRecursionList: Array<DepartmentState>; statusList: Array<any>; + dep4List: Array<type>; + searPara: {} + timeRange: Array<string>; } interface type { id: number; @@ -303,7 +323,13 @@ departmentList: [], departmentRecursionList: [], chosenIndex: null, - searchWord: '', + searPara:{ + startTime: '', + endTime: '', + workType: null, + headUserName: '', + secondDepId: null + }, applyData: [], workTimeList: [], multipleSelection: [], @@ -322,6 +348,12 @@ downLoadId: null, downLoadName: '', deleteArr: [], + dep4List: [ + {id:49,name:'电石事业部'}, + {id:50,name:'电力事业部'}, + {id:48,name:'有机化工事业部'}, + {id:32,name:'甲醇事业部'} + ], workType: [ { id: 1, name: '动火作业' }, { id: 2, name: '受限空间作业' }, @@ -377,13 +409,19 @@ value: 9, label: '安全措施确认,培训交底中' } - ] + ], + timeRange: [] }); - interface User { - name: string; - list: []; - info: string; + + const giveTime = () => { + if (state.timeRange && state.timeRange !== null) { + state.searPara.startTime = state.timeRange[0]; + state.searPara.endTime = state.timeRange[1]; + } else { + state.searPara.startTime = ''; + state.searPara.endTime = ''; } + }; // 刷新 const reLoadData = async () => { @@ -427,7 +465,7 @@ // 分页获取 const getListByPage = async () => { - const data = { pageSize: state.pageSize1, pageIndex: state.pageIndex1, searchParams: { workType: state.searchWord } }; + const data = { pageSize: state.pageSize1, pageIndex: state.pageIndex1, searchParams: state.searPara }; let res = await workApplyApi().getAllNewApplyListPage(data); if (res.data.code === '200') { state.applyData = JSON.parse(JSON.stringify(res.data.data)); @@ -467,18 +505,18 @@ // 关键词查询记录 const searchRecord = async () => { - if (state.searchWord == '') { - ElMessage({ - type: 'warning', - message: '请输入查询关键词' - }); - } else { - getListByPage(); - } + getListByPage(); }; // 重置搜索 const clearSearch = async () => { - state.searchWord = ''; + state.timeRange = [] + state.searPara = { + startTime: '', + endTime: '', + workType: null, + headUserName: '', + secondDepId: null + }; getListByPage(); }; @@ -601,6 +639,7 @@ Plus, Finished, Download, + giveTime, reLoadData, toApply, handleClick, diff --git a/src/views/newSpecialWorkSystem/workTicket/wdsq/components/jsaReportDialog.vue b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/jsaReportDialog.vue new file mode 100644 index 0000000..964fca9 --- /dev/null +++ b/src/views/newSpecialWorkSystem/workTicket/wdsq/components/jsaReportDialog.vue @@ -0,0 +1,379 @@ +<template> + <div class="system-add-menu-container"> + <el-dialog v-model="ifShowApproveRuleDialog" :title="title" :close-on-click-modal="false" @close="clearFile()"> + <el-form v-if="disabled" :model="jsaForm" label-width="170px" ref="jsaFormRef" :rules="jsaFormRules"> + <el-row :gutter="20"> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="jsa风险研判结论" prop="judgeRecord"> + <el-input + v-model="jsaForm.judgeRecord" + :autosize="{ minRows: 3 }" + type="textarea" + placeholder="请输入jsa风险研判结论" + /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="风险研判报告记录附件" prop="judgePicturePath"> + <el-upload accept="image/*" :auto-upload="true" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :before-remove="beforeRemove" :before-upload="getUploadUrl"> + <el-icon><Plus /></el-icon> + <template #tip> + <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传3张</div> + </template> + </el-upload> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <div v-show="disabled" class="dialog-footer"> + <el-button type="warning" @click="ifShowApproveRuleDialog = false" size="default" plain>取消</el-button> + <el-button type="primary" @click="submitApproveRule()" size="default">确认</el-button> + </div> + </template> + <div class="d-container" v-if="!disabled"> + <div class="d-row"> + <div class="d-tit">jsa风险研判结论</div><div class="d-cont">{{detail.judgeRecord}}</div> + </div> + <div class="d-row"> + <div class="d-tit">风险研判报告记录附件</div> + <div class="d-cont"> + <el-image v-for="item in detail.judgePicturePath?.split(',')" :preview-src-list="[item]" style="width: 150px; height: 150px;margin-right: 50px;margin-bottom: 20px" :src="item" fit="cover" /> + </div> + </div> + <div class="d-row"> + <div class="d-tit">研判人</div><div class="d-cont">{{detail.judgeUname}}</div> + </div> + <div class="d-row"> + <div class="d-tit">研判时间</div><div class="d-cont">{{detail.judgeTime}}</div> + </div> + </div> + </el-dialog> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, ref } from 'vue'; +import { ElMessage } from 'element-plus/es'; +import { approveRuleApi } from '/@/api/specialWorkSystem/approveRule'; +import { Edit, View, Plus, Delete, Refresh, Search, Download } from '@element-plus/icons-vue'; +import {ElMessageBox, UploadProps} from "element-plus"; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; +import axios from "axios"; +interface dataState { + title: string; + disabled: boolean; + ifShowApproveRuleDialog: boolean; + jsaForm: { + workApplyId: number | null; + judgeRecord: string + judgePicturePath: Array<string> + }; + jsaFormRules: {}; + fileList: Array<file>, + uploadUrl: string, + dialogVisible: Boolean, + dialogImageUrl: string | null, + imgLimit: number, + detail:{} +} +interface file { + url: string +} +export default { + name: 'jsaReportDialog', + components: { Plus }, + setup(props: any, context: any) { + const jsaFormRef = ref(); + const approveLevelDialogRef = ref(); + const state = reactive<dataState>({ + title: '', + disabled: true, + ifShowApproveRuleDialog: false, + jsaForm: { + workApplyId: null, + judgeRecord: '', + judgePicturePath: [] + }, + jsaFormRules: { + judgeRecord: [{ required: true, message: '请填写jsa风险研判结论', trigger: 'blur' }], + judgePicturePath: [{ required: true, message: '请上传风险研判报告附件', trigger: 'blur' }] + }, + fileList: [], + imgLimit: 3, + uploadUrl: '', + dialogVisible: false, + dialogImageUrl: null, + detail: {} + }); + + const showReportDialog = (type: string, value: {}) => { + state.ifShowApproveRuleDialog = true; + if (type === '上传') { + state.disabled = true; + state.title = '上传风险研判报告'; + console.log(value.id,'id') + state.jsaForm = { + workApplyId: value.id, + judgeRecord: '', + judgePicturePath: [] + }; + } else { + state.disabled = false; + state.title = '查看风险研判报告'; + getReport(value.id.toString()) + } + }; + + const getReport = async(id:string) => { + let res = await workApplyApi().viewJsaReport({id:id}); + if (res.data.code === '200') { + state.detail = res.data.data + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + + const submitApproveRule = () => { + jsaFormRef.value.validate(async (valid: Boolean) => { + if (valid) { + state.jsaForm.judgePicturePath = state.jsaForm.judgePicturePath.join(',') + let res = await workApplyApi().uploadJsaReport(state.jsaForm); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '研判报告上传成功', + duration: 2000 + }); + state.ifShowApproveRuleDialog = false; + state.jsaForm.judgePicturePath = [] + state.fileList = [] + context.emit('refresh'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + state.jsaForm.judgePicturePath = state.jsaForm.judgePicturePath.split(',') + } + } else { + ElMessage({ + type: 'warning', + message: '请完善基本信息' + }); + } + }); + }; + + const handlePreview: UploadProps['onPreview'] = (uploadFile) => { + console.log(uploadFile); + }; + + const handlePictureCardPreview = (uploadFile: { url: string }) => { + state.dialogImageUrl = uploadFile.url!; + state.dialogVisible = true; + }; + + const getUploadUrl = async (rawFile: any) => { + // const fileSize = rawFile.size / 1024 / 1024 < 5 ? '1' : '0' + if(rawFile.size / 1024 / 1024 > 5){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过5M。' + }); + return Promise.reject(false) + }else{ + const res = await workApplyApi().getUpload9Url(rawFile.name); + state.jsaForm.judgePicturePath.push(res.data.data.fileName) + state.uploadUrl = res.data.data.uploadUrl; + } + }; + + const upload = async (params: any) => { + let reader = new FileReader(); + reader.readAsArrayBuffer(params.file); + reader.onload = async () => { + axios + .put(state.uploadUrl, reader.result, { + header: { 'Content-Type': 'multipart/form-data' } + }) + .then(() => { + // if (state.fileList.length === 2) { + // state.fileList.splice(0, 1); + // } + console.log(state.jsaForm.judgePicturePath,'judgePicturePath') + }); + }; + }; + + const beforeRemove = (file: {}, fileList: []) => { + if (file && file.status === "success") { + const result = new Promise((resolve, reject) => { + ElMessageBox.confirm('此操作将删除该图片, 是否继续?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }) + .then(() => { + const list = JSON.parse(JSON.stringify(state.jsaForm.judgePicturePath)) + fileList.map((item, index) => { + if (item.uid === file.uid) { + fileList.splice(index, 1) + state.jsaForm.judgePicturePath.splice(index, 1) + // 请求删除接口 + deletePic(list[index]) + } + }) + }) + .catch(() => { + reject(false); + }); + }); + return result; + } + }; + + // 删除图片接口 + const deletePic = async(fileName:string)=>{ + const res = await workApplyApi().deleteFile({fileName: fileName}) + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '删除成功!' + }); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + + const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); + } + + const clearFile = ()=>{ + state.fileList = [] + } + + return { + ...toRefs(state), + Plus, + jsaFormRef, + approveLevelDialogRef, + getReport, + submitApproveRule, + showReportDialog, + handlePreview, + getUploadUrl, + upload, + showTip, + handlePictureCardPreview, + beforeRemove, + clearFile + }; + } +}; +</script> + +<style scoped lang="scss"> +$homeNavLengh: 8; +.home-container { + height: calc(100vh - 144px); + box-sizing: border-box; + overflow: hidden; + .homeCard { + width: 100%; + padding: 20px; + box-sizing: border-box; + background: #fff; + border-radius: 4px; + + .main-card { + width: 100%; + height: 100%; + .cardTop { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + .mainCardBtn { + margin: 0; + } + } + .pageBtn { + height: 60px; + display: flex; + align-items: center; + justify-content: right; + + .demo-pagination-block + .demo-pagination-block { + margin-top: 10px; + } + .demo-pagination-block .demonstration { + margin-bottom: 16px; + } + } + } + &:last-of-type { + height: calc(100% - 100px); + } + } + .el-row { + display: flex; + align-items: center; + margin-bottom: 20px; + &:last-child { + margin-bottom: 0; + } + .grid-content { + align-items: center; + min-height: 36px; + } + + .topInfo { + display: flex; + align-items: center; + font-size: 16px; + font-weight: bold; + + & > div { + white-space: nowrap; + margin-right: 20px; + } + } + } +} + +.d-container{ + width: 100%; + .d-row{ + width: 100%; + display: flex; + align-items: flex-start; + .d-tit{ + width: 150px; + text-align: right; + padding-right: 12px; + } + .d-cont{ + width: calc(100% - 150px); + border: 1px solid #dcdfe6; + margin-bottom: 22px; + border-radius: var(--el-input-border-radius,var(--el-border-radius-base)); + padding: 5px 11px; + } + } +} + +:deep(.el-date-editor) { + width: 100%; +} +</style> diff --git a/src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue b/src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue index 9863772..7798f8d 100644 --- a/src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue +++ b/src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue @@ -4,30 +4,46 @@ <!-- <el-tab-pane label="申请中" name="1">--> <div style="height: 100%"> <el-row class="homeCard"> + <div class="basic-line" style="display:flex;white-space:nowrap;line-height: 40px"> + <span>时间筛选:</span> + <el-date-picker v-model="timeRange" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" @change="giveTime()" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" /> + </div> + <div class="basic-line" style="display:flex;white-space:nowrap;line-height: 40px"> + <span>负责人:</span> + <el-input v-model="searPara.headUserName" placeholder="负责人"/> + </div> + <div class="basic-line"> + <span>事业部:</span> + <el-select v-model="searPara.secondDepId"> + <el-option + v-for="item in dep4List" + :key="item.id" + :label="item.name" + :value="item.id" + /> + </el-select> + </div> + <div class="basic-line"> <span>作业类型:</span> - <el-col :span="10"> - <div class="grid-content topInfo"> - <el-select v-model="searchWord"> - <el-option - v-for="item in workType" - :key="item.id" - :label="item.name" - :value="item.id" - /> - </el-select> - - <el-button type="primary" @click="searchRecord">查询</el-button> - <el-button plain @click="clearSearch">重置</el-button> - </div> - </el-col> + <el-select v-model="searPara.workType"> + <el-option + v-for="item in workType" + :key="item.id" + :label="item.name" + :value="item.id" + /> + </el-select> + </div> + <div style="margin-left: 20px"> + <el-button type="primary" @click="searchRecord">查询</el-button> + <el-button plain @click="clearSearch">重置</el-button> + </div> </el-row> <div class="homeCard"> <div class="main-card"> <el-row class="cardTop"> <el-col :span="12" class="mainCardBtn"> <el-button type="primary" :icon="Plus" size="default" @click="toApply()">申请</el-button> - <!-- <el-button type="danger" :icon="Delete" size="default">删除</el-button>--> - <!-- <el-button type="success" size="default">设置分类</el-button>--> </el-col> <el-button type="primary" :icon="Refresh" size="default" @click="reLoadData()" /> </el-row> @@ -71,15 +87,18 @@ </el-table-column> <el-table-column label="风险研判" align="center"> <template #default="scope"> - <el-tag>{{ statusList.find(i=>i.value === scope.row.status)?.label }}</el-tag> + <el-button v-if="scope.row.status == 0" link type="primary" size="small" @click="openReport('上传', scope.row)">上传研判报告</el-button> + <el-tag type="danger" v-else-if="scope.row.status == -1">已废止</el-tag> + <el-button v-else link type="primary" size="small" @click="openReport('查看', scope.row)">查看研判报告</el-button> </template> </el-table-column> <el-table-column fixed="right" label="操作" align="center" width="300"> <template #default="scope"> - <el-button link type="danger" size="small" :icon="Delete" @click="deleteRecordBtn(scope.row)">作废</el-button> - <el-button link type="primary" size="small" :icon="View" @click="viewRecord(scope.row)">查看</el-button> - <el-button link type="success" size="small" :icon="Finished">修改</el-button> - <el-button link type="success" size="small" :icon="Download">正式办票</el-button> + <span v-if="scope.row.status == -1">已废止</span> + <el-button v-if="scope.row.status == 0 || scope.row.status == 1" link type="danger" size="small" :icon="Delete" @click="abortRecordBtn(scope.row)">作废</el-button> + <el-button v-if="scope.row.status !== -1" link type="primary" size="small" :icon="View" @click="viewRecord(scope.row)">查看</el-button> +<!-- <el-button link type="success" size="small" :icon="Finished">修改</el-button>--> + <el-button v-if="scope.row.status == 1" link type="success" size="small" :icon="Download" @click="checkTicket(scope.row)">正式办票</el-button> <!-- <el-button :disabled="scope.row.status == 7 ? false : true" link type="primary" size="small" :icon="Download" @click="downLoadBtn(scope.row)">导出作业票</el-button>--> </template> </el-table-column> @@ -108,127 +127,7 @@ </span> </template> </el-dialog> - <el-dialog v-model="dialogStatus" title="作业申请进度" width="60%"> - <el-form v-if="approveInfo.operators.length > 0" style="margin-bottom: 40px"> - <el-form-item label="申请作业人"> - <el-input v-model="approveInfo.operators" readonly type="textarea" /> - </el-form-item> - </el-form> - <div style="display: flex; flex-direction: column-reverse"> - <div v-for="(item, index) in approveInfo.approvalSteps" class="stepItem"> - <div class="stepNum">{{ item.stepSerial }}</div> - <div class="stepCard"> - <el-card class="box-card" shadow="always"> - <div class="text"> - 审批结果:<span class="bold-text">{{ item.approvalResultDesc }}</span> - </div> - <div class="text"> - 审批类型:<span class="bold-text">{{ item.typeDesc }}</span> - </div> - <div class="text" v-if="item.auditTypeDesc"> - 审批类型:<span class="bold-text">{{ item.auditTypeDesc }}</span> - </div> - <div class="text" v-show="item.startApprovalTime != null"> - 开始时间:<span>{{ item.startApprovalTime }}</span> - </div> - <div class="approveUnit"> - <div class="item-tit"><span>审批人</span><span>审批状态</span></div> - <div class="item-cont" v-for="i in item.stepUnits"> - <span>{{ i.approvalUname }}</span - ><span>{{ i.resultDesc }}</span> - </div> - </div> - <div class="approveItem"> - <div class="item-tit"> - <span>审批项目</span> -<!-- <span>类型</span>--> - <div>措施标准</div> - </div> - <div class="item-cont" v-for="i in item.stepItems"> - <span>{{ i.itemName }}</span> -<!-- <span>{{ i.typeDesc }}</span>--> - <div v-if="i.measure !== null"> - <div> - <span>作业类型:</span><span>{{ i.measure.workTypeDesc }}</span> - </div> - <div> - <span>措施内容:</span><span>{{ i.measure.context }}</span> - </div> - </div> - <div v-if="i.stand !== null"> - <div> - <span>标题名称:</span><span>{{ i.stand.title }}</span> - </div> - <div> - <span>标准内容:</span><span>{{ i.stand.typeDesc }}</span> - </div> - </div> - </div> - </div> - <div class="text" v-show="item.expFinishApprovalTime && item.expFinishApprovalTime != null"> - 期望结束时间:<span>{{ item.expFinishApprovalTime }}</span> - </div> - <div class="text" v-show="item.finishApprovalTime != null"> - 结束时间:<span>{{ item.finishApprovalTime }}</span> - </div> - </el-card> - </div> - </div> - </div> - </el-dialog> - <el-dialog v-model="deleteDialog" title="提示" width="30%" center> - <span>您确定要取消该条申请吗?</span> - <template #footer> - <span class="dialog-footer"> - <el-button @click="deleteDialog = false" size="default">取消</el-button> - <el-button type="primary" @click="conFirmDelete" size="default">确认</el-button> - </span> - </template> - </el-dialog> - <el-dialog v-model="downLoadDialog" title="提示" width="30%" center> - <span>您确定要导出该条记录吗?</span> - <template #footer> - <span class="dialog-footer"> - <el-button @click="downLoadDialog = false" size="default">取消</el-button> - <el-button type="primary" @click="conFirmDownLoad" size="default">确认</el-button> - </span> - </template> - </el-dialog> -<!-- </el-tab-pane>--> -<!-- <el-tab-pane label="已通过" name="2">--> -<!-- <div style="height: 100%">--> -<!-- <el-row class="homeCard">--> -<!-- <el-col :span="8">--> -<!-- <div class="grid-content topInfo">--> -<!-- <el-input v-model="searchWord" placeholder="作业证名称"></el-input>--> -<!-- <el-button type="primary">查询</el-button>--> -<!-- <el-button plain>重置</el-button>--> -<!-- </div>--> -<!-- </el-col>--> -<!-- </el-row>--> -<!-- <div class="homeCard">--> -<!-- <div class="main-card">--> -<!-- <el-table ref="multipleTableRef" :data="passedData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }" @selection-change="handleSelectionChange">--> -<!-- <el-table-column type="selection" width="55" />--> -<!-- <el-table-column type="index" label="编号" width="200" />--> -<!-- <el-table-column property="level" label="作业证等级" width="180" sortable />--> -<!-- <el-table-column property="applyDate" label="申请日期" sortable />--> -<!-- <el-table-column property="name" label="申请人" width="180" />--> -<!-- <el-table-column property="department" label="申请部门" width="180" />--> -<!-- <el-table-column label="申请状态" width="180">--> -<!-- <template #default="scope">--> -<!-- <el-tag type="success">{{ scope.row.status }}</el-tag>--> -<!-- </template>--> -<!-- </el-table-column>--> -<!-- </el-table>--> -<!-- <div class="pageBtn">--> -<!-- <el-pagination v-model:currentPage="pageIndex2" v-model:page-size="pageSize2" :page-sizes="[10, 15]" small="false" background layout="total, sizes, prev, pager, next, jumper" :total="totalSize2" @size-change="handleSizeChange2" @current-change="handleCurrentChange2" />--> -<!-- </div>--> -<!-- </div>--> -<!-- </div>--> -<!-- </div>--> -<!-- </el-tab-pane>--> -<!-- </el-tabs>--> + <report-log ref="reportDialogRef" @refresh="getListByPage"></report-log> </div> </template> @@ -241,7 +140,7 @@ import { useRouter } from 'vue-router'; import { Edit, View, Plus, Delete, Refresh, Search, Finished, Download } from '@element-plus/icons-vue'; import { ElTable } from 'element-plus'; -import { FormInstance, FormRules, ElMessage } from 'element-plus'; +import { FormInstance, FormRules, ElMessage, ElMessageBox } from 'element-plus'; import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; import type { TabsPaneContext } from 'element-plus'; import {teamManageApi} from "/@/api/systemManage/basicDateManage/personShiftManage/teamManage"; @@ -257,15 +156,11 @@ approveInfo: Object; dialogDetails: boolean; dialogStatus: boolean; - deleteDialog: boolean; - downLoadDialog: boolean; pageIndex1: number; pageSize1: number; chosenIndex: null | number; - deleteId: null | number; downLoadId: null | number; downLoadName: string; - searchWord: string; totalSize1: number; activeName: string; addRecord: {}; @@ -276,6 +171,9 @@ departmentList: Array<any>; departmentRecursionList: Array<DepartmentState>; statusList: Array<any>; + searPara: {} + timeRange: Array<string>; + dep4List: Array<type>; } interface type { id: number; @@ -288,20 +186,14 @@ export default defineComponent({ name: 'myApply', components: { - // 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')) - detailLog: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/detailLog.vue')) + detailLog: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/detailLog.vue')), + reportLog: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/jsaReportDialog.vue')) }, setup() { const userInfo = useUserInfo(); const { userInfos } = storeToRefs(userInfo); const router = useRouter(); + const reportDialogRef = ref(); const state = reactive<stateType>({ pageIndex1: 1, pageSize1: 10, @@ -311,7 +203,14 @@ departmentList: [], departmentRecursionList: [], chosenIndex: null, - searchWord: '', + searPara:{ + startTime: '', + endTime: '', + workType: null, + headUserName: '', + secondDepId: null + }, + timeRange: [], applyData: [], workTimeList: [], multipleSelection: [], @@ -321,12 +220,9 @@ }, dialogDetails: false, dialogStatus: false, - deleteDialog: false, - downLoadDialog: false, addRecord: {}, details: {}, statusInfo: {}, - deleteId: null, downLoadId: null, downLoadName: '', deleteArr: [], @@ -340,6 +236,12 @@ { id: 7, name: '临时用电作业' }, { id: 8, name: '盲板抽堵作业' } ], + dep4List: [ + {id:49,name:'电石事业部'}, + {id:50,name:'电力事业部'}, + {id:48,name:'有机化工事业部'}, + {id:32,name:'甲醇事业部'} + ], statusList: [ { value: -1, @@ -387,11 +289,15 @@ } ] }); - interface User { - name: string; - list: []; - info: string; - } + const giveTime = () => { + if (state.timeRange && state.timeRange !== null) { + state.searPara.startTime = state.timeRange[0]; + state.searPara.endTime = state.timeRange[1]; + } else { + state.searPara.startTime = ''; + state.searPara.endTime = ''; + } + }; // 刷新 const reLoadData = async () => { @@ -435,7 +341,7 @@ // 分页获取 const getListByPage = async () => { - const data = { pageSize: state.pageSize1, pageIndex: state.pageIndex1, searchParams: { workType: state.searchWord } }; + const data = { pageSize: state.pageSize1, pageIndex: state.pageIndex1, searchParams: state.searPara }; let res = await workApplyApi().getNewApplyListPage(data); if (res.data.code === '200') { state.applyData = JSON.parse(JSON.stringify(res.data.data)); @@ -475,19 +381,19 @@ // 关键词查询记录 const searchRecord = async () => { - if (state.searchWord == '') { - ElMessage({ - type: 'warning', - message: '请输入查询关键词' - }); - } else { - getListByPage(); - } + getListByPage(); }; // 重置搜索 const clearSearch = async () => { - state.searchWord = ''; - getListByPage(); + state.timeRange = [] + state.searPara = { + startTime: '', + endTime: '', + workType: null, + headUserName: '', + secondDepId: null + }; + getListByPage(); }; // 查看进度 @@ -510,38 +416,69 @@ } }; - const deleteRecordBtn = (row) => { - state.deleteId = row.workApplyId; - state.deleteDialog = true; - }; - - // 取消申请方法 - const deleteRecord = async (data: any) => { - let res = await workApplyApi().cancelApply(data); - if (res.data.code === '200') { - ElMessage({ + const abortRecordBtn = (row:object) => { + ElMessageBox.confirm( + '是否作废该项申报?', + '申报作废', + { + confirmButtonText: '确认', + cancelButtonText: '取消' + } + ) + .then(async () => { + let res = await workApplyApi().abolishTicket({id: row.id}); + if (res.data.code === '200') { + ElMessage({ type: 'success', - message: '删除成功!' - }); - getListByPage(); - } else { - ElMessage({ + message: '作废成功!' + }); + getListByPage(); + } else { + ElMessage({ type: 'warning', message: res.data.msg - }); - } + }); + } + }) + .catch(() => { + console.log('取消废票') + }) }; - const conFirmDelete = () => { - deleteRecord({ workApplyId: state.deleteId }); - state.deleteDialog = false; - }; + // 正式办票 + const checkTicket = (row:object) =>{ + ElMessageBox.confirm( + '是否进行正式办票操作?', + '正式办票', + { + confirmButtonText: '确认', + cancelButtonText: '取消' + } + ) + .then(async () => { + let res = await workApplyApi().checkTicket({id: row.id}); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '办票成功!' + }); + getListByPage(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch(() => { + console.log('取消办票') + }) + } // 导出图表 const downLoadBtn = (row:any) =>{ state.downLoadId = row.workApplyId; state.downLoadName = row.workTypeDesc + row.workPermitNo - state.downLoadDialog = true; } // 导出方法 @@ -567,11 +504,6 @@ }; - const conFirmDownLoad = () => { - downLoadRecord({ applyWorkId: state.downLoadId }); - state.downLoadDialog = false; - }; - const handleSizeChange1 = (val: number) => { state.pageSize1 = val; getListByPage(); @@ -579,6 +511,10 @@ const handleCurrentChange1 = (val: number) => { state.pageIndex1 = val; getListByPage(); + }; + + const openReport = (type: string, value: {}) => { + reportDialogRef.value.showReportDialog(type, value); }; // 查看记录 @@ -609,18 +545,20 @@ Plus, Finished, Download, + reportDialogRef, + checkTicket, + giveTime, reLoadData, toApply, handleClick, toNames, searchRecord, clearSearch, + openReport, viewRecord, viewStatus, - deleteRecordBtn, + abortRecordBtn, downLoadBtn, - conFirmDelete, - conFirmDownLoad, getListByPage, handleSizeChange1, handleCurrentChange1, @@ -683,208 +621,6 @@ } &:last-of-type { height: calc(100% - 100px); - } - } - .stepItem { - display: flex; - align-items: flex-start; - margin-top: 30px; - margin-left: 30px; - padding-bottom: 30px; - padding-left: 40px; - border-left: 1px solid #a0cfff; - position: relative; - &:first-of-type { - margin-top: 30px; - } - &:first-of-type { - margin-bottom: 0; - border-left: none; - } - .stepNum { - position: absolute; - width: 40px; - height: 40px; - border-radius: 20px; - box-sizing: border-box; - font-size: 18px; - color: #333; - border: 1px solid #a0cfff; - line-height: 38px; - text-align: center; - left: -20px; - top: -30px; - background: #d9ecff; - } - .stepCard { - width: 100%; - margin-top: -30px; - - .box-card { - width: 100%; - - .card-header { - display: flex; - justify-content: space-between; - align-items: center; - - span { - font-weight: bold; - margin-left: 10px; - } - } - - .text { - width: 100%; - font-size: 14px; - margin-bottom: 10px; - padding-left: 10px; - - span { - color: #409eff; - } - - .bold-text{ - font-weight: bolder; - } - - &:last-of-type { - margin-bottom: 0; - } - } - .approveUnit { - width: 100%; - font-size: 14px; - margin-bottom: 20px; - padding: 10px 15px; - border: 1px solid #fff; - background: #ecf8ff; - border-radius: 6px; - .item-tit { - width: 100%; - display: flex; - color: #409eff; - align-items: flex-start; - justify-content: space-between; - padding-bottom: 10px; - border-bottom: 1px solid #a0cfff; - - & > span { - flex: 1; - &:last-of-type{ - text-align: center; - } - } - & > div { - flex: 1; - text-align: center; - } - } - .item-cont { - width: 100%; - display: flex; - align-items: center; - justify-content: space-between; - padding: 10px 0; - border-bottom: 1px solid #c6e2ff; - - & > span { - flex: 1; - &:last-of-type{ - text-align: center; - } - } - & > div { - flex: 1; - text-align: center; - - & > div { - text-align: left; - width: 100%; - display: flex; - justify-content: center; - align-items: center; - span { - width: 45%; - &:first-of-type { - width: 30%; - } - } - } - } - &:last-of-type { - border-bottom: 0; - } - } - } - .approveItem { - width: 100%; - font-size: 14px; - margin-bottom: 20px; - padding: 10px 15px; - background: #ecf8ff; - border: 1px solid #fff; - border-radius: 6px; - .item-tit { - width: 100%; - display: flex; - color: #409eff; - align-items: flex-start; - justify-content: space-between; - padding-bottom: 10px; - border-bottom: 1px solid #a0cfff; - - & > span { - flex: 1; - } - & > div { - flex: 2; - text-align: center; - } - } - .item-cont { - width: 100%; - display: flex; - align-items: center; - justify-content: space-between; - padding: 10px 0; - border-bottom: 1px solid #c6e2ff; - - & > span { - flex: 1; - } - & > div { - flex: 2; - text-align: center; - - & > div { - text-align: left; - width: 100%; - display: flex; - justify-content: center; - align-items: flex-start; - margin-bottom: 10px; - span { - width: 50%; - &:first-of-type { - width: 25%; - } - } - } - } - &:last-of-type { - border-bottom: 0; - } - } - } - } - } - &:hover .card-header { - color: #0098f5; - } - &:hover .stepNum { - border: 2px solid #0098f5; - color: #0098f5; } } .el-row { diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/broken.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/broken.vue index 3610826..d33fb44 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/broken.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/broken.vue @@ -94,15 +94,19 @@ </el-col> </el-row> <el-row> - <el-col :span="12"> + <el-col :span="12" class="valueSelect"> <el-form-item label="关联其他特殊作业" prop="involveOtherWork"> - <el-select v-model="form.involveOtherWork" multiple clearable> - <el-option - v-for="item in otherWorkList" - :key="item.value" - :label="item.label" - :value="item.label" - /> +<!-- <el-select v-model="form.involveOtherWork" multiple clearable>--> +<!-- <el-option--> +<!-- v-for="item in otherWorkList"--> +<!-- :key="item.value"--> +<!-- :label="item.label"--> +<!-- :value="item.label"--> +<!-- />--> +<!-- </el-select>--> + <el-select v-model="form.involveOtherWork" multiple clearable :teleported="false" @click="openWorkSelect"> + <el-option v-for="item in otherWorks" :key="item.workApplyId" :label="item.workContent" :value="item.workApplyId"> + </el-option> </el-select> </el-form-item> </el-col> @@ -132,10 +136,10 @@ </el-col> <el-col :span="12"> <el-form-item label="断路地段示意图" prop="workDetail.bcPath"> - <el-upload accept="image/*" :auto-upload="true" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :on-remove="handleRemove" :before-remove="beforeRemove" :before-upload="getUploadUrl"> + <el-upload accept="image/*" :auto-upload="true" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :before-remove="beforeRemove" :before-upload="getUploadUrl"> <el-icon><Plus /></el-icon> <template #tip> - <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传3张</div> + <div class="el-upload__tip">上传jpg/png图片尺寸小于2M,最多可上传3张</div> </template> </el-upload> </el-form-item> @@ -203,7 +207,7 @@ <el-row style="display: flex;justify-content: center"> <el-table :data="safetyMeasureBasicList" style="width: 90%" border> <el-table-column type="index" label="序号" width="100px" align="center"/> - <el-table-column prop="measureContent" label="安全措施" align="center"/> + <el-table-column prop="measureContent" label="安全措施"/> <!-- <el-table-column prop="address" label="确认人">--> <!-- <template #default="scope">--> @@ -304,11 +308,26 @@ </el-form-item> </el-col> </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="签字人" prop="workDetail.signUid"> + <el-select v-model="form.workDetail.signUid" clearable> + <el-option + v-for="item in workerList" + :key="item.uid" + :label="item.username" + :value="item.uid" + /> + </el-select> + </el-form-item> + </el-col> + </el-row> </div> </el-form> <div class="applyBtn"> <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">提交申报</el-button> </div> + <work-select ref="workSelectRef" @refreshWorks="getSelected()"></work-select> </div> </template> @@ -322,11 +341,11 @@ import { ElMessage, ElMessageBox } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus' import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; + import workSelect from "/@/views/newSpecialWorkSystem/workTicket/zysq/components/workSelect.vue"; import {UploadProps} from "element-plus/es"; import axios from "axios"; interface stateType { form: Object, - otherWorkList: Array<any>, equipmentDialog: boolean, props:{}, depProps:{}, @@ -343,8 +362,8 @@ } export default defineComponent({ name: 'brokenForm', - components: {}, - props:['departList','departList2','workerList','deviceList'], + components: {workSelect}, + props:['departList','departList2','workerList','deviceList','otherWorks'], setup(props: any, context: any) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); @@ -366,7 +385,7 @@ workContent: '', workLocation: '', riskIdentification: '', - involveOtherWork: '', + involveOtherWork: [], safetyMeasureUids: [], approvalDepBasicList: [], acceptUid: null, @@ -376,43 +395,10 @@ involvedDepIds: [], bcReason: '', bcExplain: '', - bcPath: [] + bcPath: [], + signUid: null } }, - otherWorkList: [ - { - label: "动火作业", - value: 1 - }, - { - label: "受限空间作业", - value: 2 - }, - { - label: "吊装作业", - value: 3 - }, - { - label: "动土作业", - value: 4 - }, - { - label: "断路作业", - value: 5 - }, - { - label: "高处作业", - value: 6 - }, - { - label: "临时用电作业", - value: 7 - }, - { - label: "盲板抽堵作业", - value: 8 - } - ], props:{ expandTrigger: 'hover', label: 'depName', @@ -462,13 +448,20 @@ "workDetail.involvedDepIds": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], "workDetail.bcReason": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], "workDetail.bcExplain": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.bcPath": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] + "workDetail.bcPath": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + "workDetail.signUid": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] }); - + const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { }); + const openWorkSelect = ()=>{ + workSelectRef.value.openDialog(state.form.involveOtherWork) + } + const getSelected = ()=>{ + state.form.involveOtherWork = workSelectRef.value.selected + } const findParent = ()=>{ state.form.seDepId = findNearestDepLevel2DepId(props.departList2,state.form.applyDepId) console.log(state.form.seDepId,'state.form.seDepId') @@ -592,13 +585,13 @@ }; const getUploadUrl = async (rawFile: any) => { - const fileSize = rawFile.size / 1024 / 1024 < 5 ? '1' : '0' - if(fileSize === '0'){ + // const fileSize = rawFile.size / 1024 / 1024 < 5 ? '1' : '0' + if(rawFile.size / 1024 / 1024 > 2){ ElMessage({ type: 'warning', - message: '文件大小不能超过5M。' + message: '文件大小不能超过2M。' }); - return false + return Promise.reject(false) }else{ const res = await workApplyApi().getUpload9Url(rawFile.name); state.form.workDetail.bcPath.push(res.data.data.fileName) @@ -623,29 +616,31 @@ }; const beforeRemove = (file: {}, fileList: []) => { - const result = new Promise((resolve, reject) => { - ElMessageBox.confirm('此操作将删除该图片, 是否继续?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }) - .then(() => { - // console.log(state.workDetail.bcPath,'path') - const list = JSON.parse(JSON.stringify(state.form.workDetail.bcPath)) - fileList.map((item,index)=>{ - if(item.uid === file.uid){ - fileList.splice(index,1) - state.form.workDetail.bcPath.splice(index,1) - // 请求删除接口 - deletePic(false,list[index]) - } + if (file && file.status === "success") { + const result = new Promise((resolve, reject) => { + ElMessageBox.confirm('此操作将删除该图片, 是否继续?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }) + .then(() => { + // console.log(state.workDetail.bcPath,'path') + const list = JSON.parse(JSON.stringify(state.form.workDetail.bcPath)) + fileList.map((item, index) => { + if (item.uid === file.uid) { + fileList.splice(index, 1) + state.form.workDetail.bcPath.splice(index, 1) + // 请求删除接口 + deletePic(list[index]) + } + }) }) - }) - .catch(() => { - reject(false); - }); - }); - return result; + .catch(() => { + reject(false); + }); + }); + return result; + } }; // 删除图片接口 @@ -690,6 +685,9 @@ showTip, handlePictureCardPreview, beforeRemove, + openWorkSelect, + getSelected, + workSelectRef, Search, ruleFormRef, applyRules, @@ -704,9 +702,13 @@ width: 100%; height: 100vh; overflow: hidden; - position: relative; overflow-y: scroll; - padding: 0 0 120px; + + &::-webkit-scrollbar{ + width: 0; + background-color: transparent; + } + .homeCard{ width: 100%; padding: 20px; @@ -716,10 +718,6 @@ margin-bottom: 20px; } .applyBtn{ - position: fixed; - left: 0; - bottom: 0; - z-index: 999; width: 100%; background: #fff; padding: 20px 0; @@ -747,7 +745,11 @@ width: 100% !important; } } - + .valueSelect{ + ::v-deep(.el-popper){ + display: none !important; + } + } .tab-i{ margin-bottom: 15px; diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue index 24af233..f227b4c 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue @@ -99,15 +99,11 @@ </el-select> </el-form-item> </el-col> - <el-col :span="12"> + <el-col :span="12" class="valueSelect"> <el-form-item label="关联其他特殊作业" prop="involveOtherWork"> - <el-select v-model="form.involveOtherWork" multiple clearable> - <el-option - v-for="item in otherWorkList" - :key="item.value" - :label="item.label" - :value="item.label" - /> + <el-select v-model="form.involveOtherWork" multiple clearable :teleported="false" @click="openWorkSelect"> + <el-option v-for="item in otherWorks" :key="item.workApplyId" :label="item.workContent" :value="item.workApplyId"> + </el-option> </el-select> </el-form-item> </el-col> @@ -200,7 +196,7 @@ <el-row style="display: flex;justify-content: center"> <el-table :data="safetyMeasureBasicList" style="width: 90%" border> <el-table-column type="index" label="序号" width="100px" align="center"/> - <el-table-column prop="measureContent" label="安全措施" align="center"/> + <el-table-column prop="measureContent" label="安全措施"/> <!-- <el-table-column prop="address" label="确认人">--> <!-- <template #default="scope">--> @@ -306,6 +302,7 @@ <div class="applyBtn"> <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">提交申报</el-button> </div> + <work-select ref="workSelectRef" @refreshWorks="getSelected()"></work-select> </div> </template> @@ -319,10 +316,10 @@ import { ElMessage, ElMessageBox } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus' import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; + import workSelect from "/@/views/newSpecialWorkSystem/workTicket/zysq/components/workSelect.vue"; interface stateType { form: Object, workLevelList: Array<any>, - otherWorkList: Array<any>, equipmentDialog: boolean, props:{}, depProps:{}, @@ -330,8 +327,8 @@ } export default defineComponent({ name: 'fireForm', - components: {}, - props:['departList','departList2','workerList','deviceList'], + components: {workSelect}, + props:['departList','departList2','workerList','deviceList','otherWorks'], setup(props: any, context: any) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); @@ -353,7 +350,7 @@ workContent: '', workLocation: '', riskIdentification: '', - involveOtherWork: '', + involveOtherWork: [], safetyMeasureUids: [], approvalDepBasicList: [], acceptUid: null, @@ -375,40 +372,6 @@ { label: "特级动火作业", value: 3 - } - ], - otherWorkList: [ - { - label: "动火作业", - value: 1 - }, - { - label: "受限空间作业", - value: 2 - }, - { - label: "吊装作业", - value: 3 - }, - { - label: "动土作业", - value: 4 - }, - { - label: "断路作业", - value: 5 - }, - { - label: "高处作业", - value: 6 - }, - { - label: "临时用电作业", - value: 7 - }, - { - label: "盲板抽堵作业", - value: 8 } ], props:{ @@ -446,11 +409,20 @@ startOrEndUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], "workDetail.workMethod": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] }); + const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { getBasicData() }); + + const openWorkSelect = ()=>{ + workSelectRef.value.openDialog(state.form.involveOtherWork) + } + + const getSelected = ()=>{ + state.form.involveOtherWork = workSelectRef.value.selected + } const findParent = ()=>{ state.form.seDepId = findNearestDepLevel2DepId(props.departList2,state.form.applyDepId) @@ -494,6 +466,7 @@ } const submitForm = async (formEl: FormInstance | undefined) => { + console.log(state.form.involveOtherWork,555) if (!formEl) return await formEl.validate(async (valid, fields) => { if (valid) { @@ -506,9 +479,9 @@ return } } - if(Array.isArray(state.form.involveOtherWork)){ - state.form.involveOtherWork = state.form.involveOtherWork.join(',') - } + // if(Array.isArray(state.form.involveOtherWork)){ + // state.form.involveOtherWork = state.form.involveOtherWork.join(',') + // } const res = await workApplyApi().submitFireApply(state.form) if (res.data.code === '200') { ElMessage({ @@ -522,7 +495,7 @@ type: 'warning', message: res.data.msg }); - state.form.involveOtherWork = state.form.involveOtherWork.split(',') + // state.form.involveOtherWork = state.form.involveOtherWork.split(',') } } else { console.log('error submit!', fields) @@ -532,12 +505,10 @@ const findNearestDepLevel2DepId = (data, targetDepId) => { let nearestDepId = null; - const traverseTree = (node) => { if (node.depId === targetDepId) { return true; } - if (node.children && node.children.length > 0) { for (const child of node.children) { const found = traverseTree(child); @@ -549,14 +520,11 @@ } } } - return false; }; - for (const root of data) { traverseTree(root); } - return nearestDepId; }; @@ -574,6 +542,9 @@ isFirstRow, submitForm, findParent, + openWorkSelect, + getSelected, + workSelectRef, Search, ruleFormRef, applyRules, @@ -588,9 +559,12 @@ width: 100%; height: 100vh; overflow: hidden; - position: relative; overflow-y: scroll; - padding: 0 0 120px; + &::-webkit-scrollbar{ + width: 0; + background-color: transparent; + } + .homeCard{ width: 100%; padding: 20px; @@ -598,12 +572,9 @@ background: #fff; border-radius: 4px; margin-bottom: 20px; + position: relative; } .applyBtn{ - position: fixed; - left: 0; - bottom: 0; - z-index: 999; width: 100%; background: #fff; padding: 20px 0; @@ -631,7 +602,11 @@ width: 100% !important; } } - + .valueSelect{ + ::v-deep(.el-popper){ + display: none !important; + } + } .tab-i{ margin-bottom: 15px; diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/ground.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/ground.vue index d1fd79e..1981325 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/ground.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/ground.vue @@ -63,15 +63,19 @@ /> </el-form-item> </el-col> - <el-col :span="12"> + <el-col :span="12" class="valueSelect"> <el-form-item label="关联其他特殊作业" prop="involveOtherWork"> - <el-select v-model="form.involveOtherWork" multiple clearable> - <el-option - v-for="item in otherWorkList" - :key="item.value" - :label="item.label" - :value="item.label" - /> +<!-- <el-select v-model="form.involveOtherWork" multiple clearable>--> +<!-- <el-option--> +<!-- v-for="item in otherWorkList"--> +<!-- :key="item.value"--> +<!-- :label="item.label"--> +<!-- :value="item.label"--> +<!-- />--> +<!-- </el-select>--> + <el-select v-model="form.involveOtherWork" multiple clearable :teleported="false" @click="openWorkSelect"> + <el-option v-for="item in otherWorks" :key="item.workApplyId" :label="item.workContent" :value="item.workApplyId"> + </el-option> </el-select> </el-form-item> </el-col> @@ -115,10 +119,10 @@ </el-col> <el-col :span="12"> <el-form-item label="作业简图" prop="workDetail.gbPath"> - <el-upload accept="image/*" :auto-upload="true" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :on-remove="handleRemove" :before-remove="beforeRemove" :before-upload="getUploadUrl"> + <el-upload accept="image/*" :auto-upload="true" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :before-remove="beforeRemove" :before-upload="getUploadUrl"> <el-icon><Plus /></el-icon> <template #tip> - <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传3张</div> + <div class="el-upload__tip">上传jpg/png图片尺寸小于2M,最多可上传3张</div> </template> </el-upload> </el-form-item> @@ -186,7 +190,7 @@ <el-row style="display: flex;justify-content: center"> <el-table :data="safetyMeasureBasicList" style="width: 90%" border> <el-table-column type="index" label="序号" width="100px" align="center"/> - <el-table-column prop="measureContent" label="安全措施" align="center"/> + <el-table-column prop="measureContent" label="安全措施"/> <!-- <el-table-column prop="address" label="确认人">--> <!-- <template #default="scope">--> @@ -287,11 +291,26 @@ </el-form-item> </el-col> </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="签字人" prop="workDetail.signUid"> + <el-select v-model="form.workDetail.signUid" clearable> + <el-option + v-for="item in workerList" + :key="item.uid" + :label="item.username" + :value="item.uid" + /> + </el-select> + </el-form-item> + </el-col> + </el-row> </div> </el-form> <div class="applyBtn"> <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">提交申报</el-button> </div> + <work-select ref="workSelectRef" @refreshWorks="getSelected()"></work-select> <el-dialog v-model="dialogVisible"> <img w-full :src="dialogImageUrl" alt="Preview Image" /> </el-dialog> @@ -308,10 +327,10 @@ import {ElMessage, ElMessageBox, UploadProps, UploadUserFile} from 'element-plus' import type { FormInstance, FormRules } from 'element-plus' import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; + import workSelect from "/@/views/newSpecialWorkSystem/workTicket/zysq/components/workSelect.vue"; import axios from "axios"; interface stateType { form: Object, - otherWorkList: Array<any>, equipmentDialog: boolean, props:{}, depProps:{}, @@ -327,8 +346,8 @@ } export default defineComponent({ name: 'groundForm', - components: {}, - props:['departList','departList2','workerList','deviceList'], + components: {workSelect}, + props:['departList','departList2','workerList','deviceList','otherWorks'], setup(props: any, context: any) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); @@ -349,7 +368,7 @@ workContent: '', workLocation: '', riskIdentification: '', - involveOtherWork: '', + involveOtherWork: [], safetyMeasureUids: [], approvalDepBasicList: [], acceptUid: null, @@ -357,43 +376,10 @@ cameraIds: [], workDetail: { gbDesc: '', - gbPath: [] + gbPath: [], + signUid: null } }, - otherWorkList: [ - { - label: "动火作业", - value: 1 - }, - { - label: "受限空间作业", - value: 2 - }, - { - label: "吊装作业", - value: 3 - }, - { - label: "动土作业", - value: 4 - }, - { - label: "断路作业", - value: 5 - }, - { - label: "高处作业", - value: 6 - }, - { - label: "临时用电作业", - value: 7 - }, - { - label: "盲板抽堵作业", - value: 8 - } - ], props:{ expandTrigger: 'hover', label: 'depName', @@ -432,13 +418,20 @@ acceptUid: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], startOrEndUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], "workDetail.gbDesc": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.gbPath": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] + "workDetail.gbPath": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + "workDetail.signUid": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] }); - + const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { }); + const openWorkSelect = ()=>{ + workSelectRef.value.openDialog(state.form.involveOtherWork) + } + const getSelected = ()=>{ + state.form.involveOtherWork = workSelectRef.value.selected + } const findParent = ()=>{ state.form.seDepId = findNearestDepLevel2DepId(props.departList2,state.form.applyDepId) console.log(state.form.seDepId,'state.form.seDepId') @@ -560,18 +553,17 @@ state.dialogVisible = true; }; - const getUploadUrl = async (rawFile: any) => { - const fileSize = rawFile.size / 1024 / 1024 < 5 ? '1' : '0' - if(fileSize === '0'){ + const getUploadUrl = async(rawFile: any) => { + if(rawFile.size / 1024 / 1024 > 2){ ElMessage({ type: 'warning', - message: '文件大小不能超过5M。' + message: '文件大小不能超过2M。' }); - return false + return Promise.reject(false) }else{ - const res = await workApplyApi().getUpload9Url(rawFile.name); + const res = await workApplyApi().getUpload9Url(rawFile.name) state.form.workDetail.gbPath.push(res.data.data.fileName) - state.uploadUrl = res.data.data.uploadUrl; + state.uploadUrl = res.data.data.uploadUrl } }; @@ -587,12 +579,12 @@ // if (state.fileList.length === 2) { // state.fileList.splice(0, 1); // } - console.log(state.form.workDetail.gbPath,'gbpath') }); }; }; const beforeRemove = (file: {}, fileList: []) => { + if (file && file.status === "success") { const result = new Promise((resolve, reject) => { ElMessageBox.confirm('此操作将删除该图片, 是否继续?', '提示', { confirmButtonText: '确定', @@ -602,21 +594,22 @@ .then(() => { // console.log(state.workDetail.gbPath,'path') const list = JSON.parse(JSON.stringify(state.form.workDetail.gbPath)) - fileList.map((item,index)=>{ - if(item.uid === file.uid){ - fileList.splice(index,1) - state.form.workDetail.gbPath.splice(index,1) + fileList.map((item, index) => { + if (item.uid === file.uid) { + fileList.splice(index, 1) + state.form.workDetail.gbPath.splice(index, 1) // 请求删除接口 - deletePic(false,list[index]) + deletePic(list[index]) } }) - console.log(state.form.workDetail.gbPath,'gbpath') + console.log(state.form.workDetail.gbPath, 'gbpath') }) .catch(() => { reject(false); }); }); return result; + } }; // 删除图片接口 @@ -662,6 +655,9 @@ showTip, handlePictureCardPreview, beforeRemove, + openWorkSelect, + getSelected, + workSelectRef, Search, ruleFormRef, applyRules, @@ -676,9 +672,11 @@ width: 100%; height: 100vh; overflow: hidden; - position: relative; overflow-y: scroll; - padding: 0 0 120px; + &::-webkit-scrollbar{ + width: 0; + background-color: transparent; + } .homeCard{ width: 100%; padding: 20px; @@ -688,10 +686,6 @@ margin-bottom: 20px; } .applyBtn{ - position: fixed; - left: 0; - bottom: 0; - z-index: 999; width: 100%; background: #fff; padding: 20px 0; @@ -719,7 +713,11 @@ width: 100% !important; } } - + .valueSelect{ + ::v-deep(.el-popper){ + display: none !important; + } + } .tab-i{ margin-bottom: 15px; diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/height.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/height.vue index eb3e76d..84f054a 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/height.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/height.vue @@ -98,15 +98,19 @@ </el-select> </el-form-item> </el-col> - <el-col :span="12"> + <el-col :span="12" class="valueSelect"> <el-form-item label="关联其他特殊作业" prop="involveOtherWork"> - <el-select v-model="form.involveOtherWork" multiple clearable> - <el-option - v-for="item in otherWorkList" - :key="item.value" - :label="item.label" - :value="item.label" - /> +<!-- <el-select v-model="form.involveOtherWork" multiple clearable>--> +<!-- <el-option--> +<!-- v-for="item in otherWorkList"--> +<!-- :key="item.value"--> +<!-- :label="item.label"--> +<!-- :value="item.label"--> +<!-- />--> +<!-- </el-select>--> + <el-select v-model="form.involveOtherWork" multiple clearable :teleported="false" @click="openWorkSelect"> + <el-option v-for="item in otherWorks" :key="item.workApplyId" :label="item.workContent" :value="item.workApplyId"> + </el-option> </el-select> </el-form-item> </el-col> @@ -174,7 +178,7 @@ <el-row style="display: flex;justify-content: center"> <el-table :data="safetyMeasureBasicList" style="width: 90%" border> <el-table-column type="index" label="序号" width="100px" align="center"/> - <el-table-column prop="measureContent" label="安全措施" align="center"/> + <el-table-column prop="measureContent" label="安全措施"/> </el-table> </el-row> <el-row> @@ -250,6 +254,7 @@ <div class="applyBtn"> <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">提交申报</el-button> </div> + <work-select ref="workSelectRef" @refreshWorks="getSelected()"></work-select> </div> </template> @@ -263,10 +268,10 @@ import { ElMessage, ElMessageBox } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus' import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; + import workSelect from "/@/views/newSpecialWorkSystem/workTicket/zysq/components/workSelect.vue"; interface stateType { form: Object, workLevelList: Array<any>, - otherWorkList: Array<any>, equipmentDialog: boolean, props:{}, depProps:{}, @@ -274,8 +279,8 @@ } export default defineComponent({ name: 'heightForm', - components: {}, - props:['departList','departList2','workerList','deviceList'], + components: {workSelect}, + props:['departList','departList2','workerList','deviceList','otherWorks'], setup(props: any, context: any) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); @@ -296,7 +301,7 @@ workContent: '', workLocation: '', riskIdentification: '', - involveOtherWork: '', + involveOtherWork: [], safetyMeasureUids: [], approvalDepBasicList: [], acceptUid: null, @@ -324,40 +329,6 @@ value: 7 } ], - otherWorkList: [ - { - label: "动火作业", - value: 1 - }, - { - label: "受限空间作业", - value: 2 - }, - { - label: "吊装作业", - value: 3 - }, - { - label: "动土作业", - value: 4 - }, - { - label: "断路作业", - value: 5 - }, - { - label: "高处作业", - value: 6 - }, - { - label: "临时用电作业", - value: 7 - }, - { - label: "盲板抽堵作业", - value: 8 - } - ], props:{ expandTrigger: 'hover', label: 'depName', @@ -392,12 +363,18 @@ startOrEndUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], "workDetail.hight": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] }); - + const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { }); + const openWorkSelect = ()=>{ + workSelectRef.value.openDialog(state.form.involveOtherWork) + } + const getSelected = ()=>{ + state.form.involveOtherWork = workSelectRef.value.selected + } const findParent = ()=>{ state.form.seDepId = findNearestDepLevel2DepId(props.departList2,state.form.applyDepId) } @@ -451,9 +428,9 @@ return } } - if(Array.isArray(state.form.involveOtherWork)){ - state.form.involveOtherWork = state.form.involveOtherWork.join(',') - } + // if(Array.isArray(state.form.involveOtherWork)){ + // state.form.involveOtherWork = state.form.involveOtherWork.join(',') + // } const res = await workApplyApi().submitHeightApply(state.form) if (res.data.code === '200') { ElMessage({ @@ -467,7 +444,7 @@ type: 'warning', message: res.data.msg }); - state.form.involveOtherWork = state.form.involveOtherWork.split(',') + // state.form.involveOtherWork = state.form.involveOtherWork.split(',') } } else { console.log('error submit!', fields) @@ -519,6 +496,9 @@ isFirstRow, submitForm, findParent, + openWorkSelect, + getSelected, + workSelectRef, Search, ruleFormRef, applyRules, @@ -533,9 +513,11 @@ width: 100%; height: 100vh; overflow: hidden; - position: relative; overflow-y: scroll; - padding: 0 0 120px; + &::-webkit-scrollbar{ + width: 0; + background-color: transparent; + } .homeCard{ width: 100%; padding: 20px; @@ -545,10 +527,6 @@ margin-bottom: 20px; } .applyBtn{ - position: fixed; - left: 0; - bottom: 0; - z-index: 999; width: 100%; background: #fff; padding: 20px 0; @@ -576,7 +554,11 @@ width: 100% !important; } } - + .valueSelect{ + ::v-deep(.el-popper){ + display: none !important; + } + } .tab-i{ margin-bottom: 15px; diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/hoist.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/hoist.vue index bf9c233..27bd3ff 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/hoist.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/hoist.vue @@ -108,15 +108,19 @@ </el-select> </el-form-item> </el-col> - <el-col :span="12"> + <el-col :span="12" class="valueSelect"> <el-form-item label="关联其他特殊作业" prop="involveOtherWork"> - <el-select v-model="form.involveOtherWork" multiple clearable> - <el-option - v-for="item in otherWorkList" - :key="item.value" - :label="item.label" - :value="item.label" - /> +<!-- <el-select v-model="form.involveOtherWork" multiple clearable>--> +<!-- <el-option--> +<!-- v-for="item in otherWorkList"--> +<!-- :key="item.value"--> +<!-- :label="item.label"--> +<!-- :value="item.label"--> +<!-- />--> +<!-- </el-select>--> + <el-select v-model="form.involveOtherWork" multiple clearable :teleported="false" @click="openWorkSelect"> + <el-option v-for="item in otherWorks" :key="item.workApplyId" :label="item.workContent" :value="item.workApplyId"> + </el-option> </el-select> </el-form-item> </el-col> @@ -209,7 +213,7 @@ <el-row style="display: flex;justify-content: center"> <el-table :data="safetyMeasureBasicList" style="width: 90%" border> <el-table-column type="index" label="序号" width="100px" align="center"/> - <el-table-column prop="measureContent" label="安全措施" align="center"/> + <el-table-column prop="measureContent" label="安全措施"/> <!-- <el-table-column prop="address" label="确认人">--> <!-- <template #default="scope">--> @@ -315,6 +319,7 @@ <div class="applyBtn"> <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">提交申报</el-button> </div> + <work-select ref="workSelectRef" @refreshWorks="getSelected()"></work-select> </div> </template> @@ -328,10 +333,10 @@ import { ElMessage, ElMessageBox } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus' import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; + import workSelect from "/@/views/newSpecialWorkSystem/workTicket/zysq/components/workSelect.vue"; interface stateType { form: Object, workLevelList: Array<any>, - otherWorkList: Array<any>, equipmentDialog: boolean, props:{}, depProps:{}, @@ -339,8 +344,8 @@ } export default defineComponent({ name: 'hoistForm', - components: {}, - props:['departList','departList2','workerList','deviceList'], + components: {workSelect}, + props:['departList','departList2','workerList','deviceList','otherWorks'], setup(props: any, context: any) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); @@ -362,7 +367,7 @@ workContent: '', workLocation: '', riskIdentification: '', - involveOtherWork: '', + involveOtherWork: [], safetyMeasureUids: [], approvalDepBasicList: [], acceptUid: null, @@ -388,40 +393,6 @@ value: 10 } ], - otherWorkList: [ - { - label: "动火作业", - value: 1 - }, - { - label: "受限空间作业", - value: 2 - }, - { - label: "吊装作业", - value: 3 - }, - { - label: "动土作业", - value: 4 - }, - { - label: "断路作业", - value: 5 - }, - { - label: "高处作业", - value: 6 - }, - { - label: "临时用电作业", - value: 7 - }, - { - label: "盲板抽堵作业", - value: 8 - } - ], props:{ expandTrigger: 'hover', label: 'depName', @@ -459,12 +430,18 @@ "workDetail.weightMass": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], "workDetail.solicitorUids": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] }); - + const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { }); + const openWorkSelect = ()=>{ + workSelectRef.value.openDialog(state.form.involveOtherWork) + } + const getSelected = ()=>{ + state.form.involveOtherWork = workSelectRef.value.selected + } const findParent = ()=>{ state.form.seDepId = findNearestDepLevel2DepId(props.departList2,state.form.applyDepId) console.log(state.form.seDepId,'state.form.seDepId') @@ -519,9 +496,9 @@ return } } - if(Array.isArray(state.form.involveOtherWork)){ - state.form.involveOtherWork = state.form.involveOtherWork.join(',') - } + // if(Array.isArray(state.form.involveOtherWork)){ + // state.form.involveOtherWork = state.form.involveOtherWork.join(',') + // } state.form.workDetail.solicitorUids = state.form.workDetail.solicitorUids.join(',') const res = await workApplyApi().submitHoistApply(state.form) if (res.data.code === '200') { @@ -536,7 +513,7 @@ type: 'warning', message: res.data.msg }); - state.form.involveOtherWork = state.form.involveOtherWork.split(',') + // state.form.involveOtherWork = state.form.involveOtherWork.split(',') state.form.workDetail.solicitorUids = state.form.workDetail.solicitorUids.split(',') } } else { @@ -589,6 +566,9 @@ isFirstRow, submitForm, findParent, + openWorkSelect, + getSelected, + workSelectRef, Search, ruleFormRef, applyRules, @@ -603,9 +583,11 @@ width: 100%; height: 100vh; overflow: hidden; - position: relative; overflow-y: scroll; - padding: 0 0 120px; + &::-webkit-scrollbar{ + width: 0; + background-color: transparent; + } .homeCard{ width: 100%; padding: 20px; @@ -615,10 +597,6 @@ margin-bottom: 20px; } .applyBtn{ - position: fixed; - left: 0; - bottom: 0; - z-index: 999; width: 100%; background: #fff; padding: 20px 0; @@ -646,7 +624,11 @@ width: 100% !important; } } - + .valueSelect{ + ::v-deep(.el-popper){ + display: none !important; + } + } .tab-i{ margin-bottom: 15px; diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/plate.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/plate.vue index 4dddf76..f746c0e 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/plate.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/plate.vue @@ -132,10 +132,10 @@ </el-col> <el-col :span="12"> <el-form-item label="盲板位置示意图" prop="workDetail.bpLocationMapPath"> - <el-upload accept="image/*" :auto-upload="true" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :on-remove="handleRemove" :before-remove="beforeRemove" :before-upload="getUploadUrl"> + <el-upload accept="image/*" :auto-upload="true" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :before-remove="beforeRemove" :before-upload="getUploadUrl"> <el-icon><Plus /></el-icon> <template #tip> - <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传3张</div> + <div class="el-upload__tip">上传jpg/png图片尺寸小于2M,最多可上传3张</div> </template> </el-upload> </el-form-item> @@ -154,15 +154,19 @@ </el-select> </el-form-item> </el-col> - <el-col :span="12"> + <el-col :span="12" class="valueSelect"> <el-form-item label="关联其他特殊作业" prop="involveOtherWork"> - <el-select v-model="form.involveOtherWork" multiple clearable> - <el-option - v-for="item in otherWorkList" - :key="item.value" - :label="item.label" - :value="item.label" - /> +<!-- <el-select v-model="form.involveOtherWork" multiple clearable>--> +<!-- <el-option--> +<!-- v-for="item in otherWorkList"--> +<!-- :key="item.value"--> +<!-- :label="item.label"--> +<!-- :value="item.label"--> +<!-- />--> +<!-- </el-select>--> + <el-select v-model="form.involveOtherWork" multiple clearable :teleported="false" @click="openWorkSelect"> + <el-option v-for="item in otherWorks" :key="item.workApplyId" :label="item.workContent" :value="item.workApplyId"> + </el-option> </el-select> </el-form-item> </el-col> @@ -282,7 +286,7 @@ <el-row style="display: flex;justify-content: center"> <el-table :data="safetyMeasureBasicList" style="width: 90%" border> <el-table-column type="index" label="序号" width="100px" align="center"/> - <el-table-column prop="measureContent" label="安全措施" align="center"/> + <el-table-column prop="measureContent" label="安全措施"/> </el-table> </el-row> <el-row> @@ -358,6 +362,7 @@ <div class="applyBtn"> <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">提交申报</el-button> </div> + <work-select ref="workSelectRef" @refreshWorks="getSelected()"></work-select> </div> </template> @@ -371,12 +376,12 @@ import { ElMessage, ElMessageBox } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus' import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; + import workSelect from "/@/views/newSpecialWorkSystem/workTicket/zysq/components/workSelect.vue"; import {UploadProps} from "element-plus/es"; import axios from "axios"; interface stateType { form: Object, workLevelList: Array<any>, - otherWorkList: Array<any>, equipmentDialog: boolean, props:{}, depProps:{}, @@ -392,8 +397,8 @@ } export default defineComponent({ name: 'fireForm', - components: {}, - props:['departList','departList2','workerList','deviceList'], + components: {workSelect}, + props:['departList','departList2','workerList','deviceList','otherWorks'], setup(props: any, context: any) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); @@ -414,7 +419,7 @@ workContent: '', workLocation: '', riskIdentification: '', - involveOtherWork: '', + involveOtherWork: [], safetyMeasureUids: [], approvalDepBasicList: [], acceptUid: null, @@ -444,40 +449,6 @@ value: 12 } ], - otherWorkList: [ - { - label: "动火作业", - value: 1 - }, - { - label: "受限空间作业", - value: 2 - }, - { - label: "吊装作业", - value: 3 - }, - { - label: "动土作业", - value: 4 - }, - { - label: "断路作业", - value: 5 - }, - { - label: "高处作业", - value: 6 - }, - { - label: "临时用电作业", - value: 7 - }, - { - label: "盲板抽堵作业", - value: 8 - } - ], props:{ expandTrigger: 'hover', label: 'depName', @@ -527,11 +498,18 @@ "workDetail.preparedByName": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], "workDetail.preparedTime": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] }); - + const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { }); + const openWorkSelect = ()=>{ + workSelectRef.value.openDialog(state.form.involveOtherWork) + } + + const getSelected = ()=>{ + state.form.involveOtherWork = workSelectRef.value.selected + } const findParent = ()=>{ state.form.seDepId = findNearestDepLevel2DepId(props.departList2,state.form.applyDepId) @@ -587,9 +565,9 @@ return } } - if(Array.isArray(state.form.involveOtherWork)){ - state.form.involveOtherWork = state.form.involveOtherWork.join(',') - } + // if(Array.isArray(state.form.involveOtherWork)){ + // state.form.involveOtherWork = state.form.involveOtherWork.join(',') + // } state.form.workDetail.bpLocationMapPath = state.form.workDetail.bpLocationMapPath.join(',') const res = await workApplyApi().submitPlateApply(state.form) if (res.data.code === '200') { @@ -606,7 +584,7 @@ type: 'warning', message: res.data.msg }); - state.form.involveOtherWork = state.form.involveOtherWork.split(',') + // state.form.involveOtherWork = state.form.involveOtherWork.split(',') state.form.workDetail.bpLocationMapPath = state.form.workDetail.bpLocationMapPath.split(',') } } else { @@ -655,13 +633,13 @@ }; const getUploadUrl = async (rawFile: any) => { - const fileSize = rawFile.size / 1024 / 1024 < 5 ? '1' : '0' - if(fileSize === '0'){ + // const fileSize = rawFile.size / 1024 / 1024 < 5 ? '1' : '0' + if(rawFile.size / 1024 / 1024 > 2){ ElMessage({ type: 'warning', - message: '文件大小不能超过5M。' + message: '文件大小不能超过2M。' }); - return false + return Promise.reject(false) }else{ const res = await workApplyApi().getUpload9Url(rawFile.name); state.form.workDetail.bpLocationMapPath.push(res.data.data.fileName) @@ -686,29 +664,31 @@ }; const beforeRemove = (file: {}, fileList: []) => { - const result = new Promise((resolve, reject) => { - ElMessageBox.confirm('此操作将删除该图片, 是否继续?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }) - .then(() => { - // console.log(state.workDetail.bpLocationMapPath,'path') - const list = JSON.parse(JSON.stringify(state.form.workDetail.bpLocationMapPath)) - fileList.map((item,index)=>{ - if(item.uid === file.uid){ - fileList.splice(index,1) - state.form.workDetail.bpLocationMapPath.splice(index,1) - // 请求删除接口 - deletePic(false,list[index]) - } + if (file && file.status === "success") { + const result = new Promise((resolve, reject) => { + ElMessageBox.confirm('此操作将删除该图片, 是否继续?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }) + .then(() => { + // console.log(state.workDetail.bpLocationMapPath,'path') + const list = JSON.parse(JSON.stringify(state.form.workDetail.bpLocationMapPath)) + fileList.map((item, index) => { + if (item.uid === file.uid) { + fileList.splice(index, 1) + state.form.workDetail.bpLocationMapPath.splice(index, 1) + // 请求删除接口 + deletePic(list[index]) + } + }) }) - }) - .catch(() => { - reject(false); - }); - }); - return result; + .catch(() => { + reject(false); + }); + }); + return result; + } }; // 删除图片接口 @@ -754,6 +734,9 @@ showTip, handlePictureCardPreview, beforeRemove, + openWorkSelect, + getSelected, + workSelectRef, Search, ruleFormRef, applyRules, @@ -768,9 +751,11 @@ width: 100%; height: 100vh; overflow: hidden; - position: relative; overflow-y: scroll; - padding: 0 0 120px; + &::-webkit-scrollbar{ + width: 0; + background-color: transparent; + } .homeCard{ width: 100%; padding: 20px; @@ -780,10 +765,6 @@ margin-bottom: 20px; } .applyBtn{ - position: fixed; - left: 0; - bottom: 0; - z-index: 999; width: 100%; background: #fff; padding: 20px 0; @@ -811,7 +792,11 @@ width: 100% !important; } } - + .valueSelect{ + ::v-deep(.el-popper){ + display: none !important; + } + } .tab-i{ margin-bottom: 15px; diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/power.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/power.vue index 5e3a2a4..5bfd61f 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/power.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/power.vue @@ -122,15 +122,19 @@ </el-select> </el-form-item> </el-col> - <el-col :span="12"> + <el-col :span="12" class="valueSelect"> <el-form-item label="关联其他特殊作业" prop="involveOtherWork"> - <el-select v-model="form.involveOtherWork" multiple clearable> - <el-option - v-for="item in otherWorkList" - :key="item.value" - :label="item.label" - :value="item.label" - /> +<!-- <el-select v-model="form.involveOtherWork" multiple clearable>--> +<!-- <el-option--> +<!-- v-for="item in otherWorkList"--> +<!-- :key="item.value"--> +<!-- :label="item.label"--> +<!-- :value="item.label"--> +<!-- />--> +<!-- </el-select>--> + <el-select v-model="form.involveOtherWork" multiple clearable :teleported="false" @click="openWorkSelect"> + <el-option v-for="item in otherWorks" :key="item.workApplyId" :label="item.workContent" :value="item.workApplyId"> + </el-option> </el-select> </el-form-item> </el-col> @@ -223,7 +227,7 @@ <el-row style="display: flex;justify-content: center"> <el-table :data="safetyMeasureBasicList" style="width: 90%" border> <el-table-column type="index" label="序号" width="100px" align="center"/> - <el-table-column prop="measureContent" label="安全措施" align="center"/> + <el-table-column prop="measureContent" label="安全措施"/> <!-- <el-table-column prop="address" label="确认人">--> <!-- <template #default="scope">--> @@ -329,6 +333,7 @@ <div class="applyBtn"> <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">提交申报</el-button> </div> + <work-select ref="workSelectRef" @refreshWorks="getSelected()"></work-select> </div> </template> @@ -342,9 +347,9 @@ import { ElMessage, ElMessageBox } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus' import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; + import workSelect from "/@/views/newSpecialWorkSystem/workTicket/zysq/components/workSelect.vue"; interface stateType { form: Object, - otherWorkList: Array<any>, equipmentDialog: boolean, props:{}, depProps:{}, @@ -352,8 +357,8 @@ } export default defineComponent({ name: 'powerForm', - components: {}, - props:['departList','departList2','workerList','deviceList'], + components: {workSelect}, + props:['departList','departList2','workerList','deviceList','otherWorks'], setup(props: any, context: any) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); @@ -375,7 +380,7 @@ workContent: '', workLocation: '', riskIdentification: '', - involveOtherWork: '', + involveOtherWork: [], safetyMeasureUids: [], approvalDepBasicList: [], acceptUid: null, @@ -388,40 +393,6 @@ electricityUids: [] } }, - otherWorkList: [ - { - label: "动火作业", - value: 1 - }, - { - label: "受限空间作业", - value: 2 - }, - { - label: "吊装作业", - value: 3 - }, - { - label: "动土作业", - value: 4 - }, - { - label: "断路作业", - value: 5 - }, - { - label: "高处作业", - value: 6 - }, - { - label: "临时用电作业", - value: 7 - }, - { - label: "盲板抽堵作业", - value: 8 - } - ], props:{ expandTrigger: 'hover', label: 'depName', @@ -460,12 +431,17 @@ "workDetail.equipmentAndPower": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], "workDetail.electricityUids": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] }); - + const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { }); - + const openWorkSelect = ()=>{ + workSelectRef.value.openDialog(state.form.involveOtherWork) + } + const getSelected = ()=>{ + state.form.involveOtherWork = workSelectRef.value.selected + } const findParent = ()=>{ state.form.seDepId = findNearestDepLevel2DepId(props.departList2,state.form.applyDepId) console.log(state.form.seDepId,'state.form.seDepId') @@ -520,9 +496,9 @@ return } } - if(Array.isArray(state.form.involveOtherWork)){ - state.form.involveOtherWork = state.form.involveOtherWork.join(',') - } + // if(Array.isArray(state.form.involveOtherWork)){ + // state.form.involveOtherWork = state.form.involveOtherWork.join(',') + // } state.form.workDetail.electricityUids = state.form.workDetail.electricityUids.join(',') const res = await workApplyApi().submitPowerApply(state.form) if (res.data.code === '200') { @@ -537,7 +513,7 @@ type: 'warning', message: res.data.msg }); - state.form.involveOtherWork = state.form.involveOtherWork.split(',') + // state.form.involveOtherWork = state.form.involveOtherWork.split(',') state.form.workDetail.electricityUids = state.form.workDetail.electricityUids.split(',') } } else { @@ -590,6 +566,9 @@ isFirstRow, submitForm, findParent, + openWorkSelect, + getSelected, + workSelectRef, Search, ruleFormRef, applyRules, @@ -604,9 +583,11 @@ width: 100%; height: 100vh; overflow: hidden; - position: relative; overflow-y: scroll; - padding: 0 0 120px; + &::-webkit-scrollbar{ + width: 0; + background-color: transparent; + } .homeCard{ width: 100%; padding: 20px; @@ -616,10 +597,6 @@ margin-bottom: 20px; } .applyBtn{ - position: fixed; - left: 0; - bottom: 0; - z-index: 999; width: 100%; background: #fff; padding: 20px 0; @@ -647,7 +624,11 @@ width: 100% !important; } } - + .valueSelect{ + ::v-deep(.el-popper){ + display: none !important; + } + } .tab-i{ margin-bottom: 15px; diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/space.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/space.vue index 7f0331c..5ad736a 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/space.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/space.vue @@ -99,15 +99,11 @@ </el-select> </el-form-item> </el-col> - <el-col :span="12"> + <el-col :span="12" class="valueSelect"> <el-form-item label="关联其他特殊作业" prop="involveOtherWork"> - <el-select v-model="form.involveOtherWork" multiple clearable> - <el-option - v-for="item in otherWorkList" - :key="item.value" - :label="item.label" - :value="item.label" - /> + <el-select v-model="form.involveOtherWork" multiple clearable :teleported="false" @click="openWorkSelect"> + <el-option v-for="item in otherWorks" :key="item.workApplyId" :label="item.workContent" :value="item.workApplyId"> + </el-option> </el-select> </el-form-item> </el-col> @@ -200,7 +196,7 @@ <el-row style="display: flex;justify-content: center"> <el-table :data="safetyMeasureBasicList" style="width: 90%" border> <el-table-column type="index" label="序号" width="100px" align="center"/> - <el-table-column prop="measureContent" label="安全措施" align="center"/> + <el-table-column prop="measureContent" label="安全措施"/> </el-table> </el-row> <el-row> @@ -276,11 +272,12 @@ <div class="applyBtn"> <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">提交申报</el-button> </div> + <work-select ref="workSelectRef" @refreshWorks="getSelected()"></work-select> </div> </template> <script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent, onMounted } from 'vue'; +import {toRefs, reactive, defineComponent, ref, defineAsyncComponent, onMounted, onUnmounted} from 'vue'; import { storeToRefs } from 'pinia'; import { initBackEndControlRoutes } from '/@/router/backEnd'; import {useUserInfo} from "/@/stores/userInfo"; @@ -289,9 +286,9 @@ import { ElMessage, ElMessageBox } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus' import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; + import workSelect from "/@/views/newSpecialWorkSystem/workTicket/zysq/components/workSelect.vue"; interface stateType { form: Object, - otherWorkList: Array<any>, equipmentDialog: boolean, props:{}, depProps:{}, @@ -299,8 +296,8 @@ } export default defineComponent({ name: 'spaceForm', - components: {}, - props:['departList','departList2','workerList','deviceList'], + components: {workSelect}, + props:['departList','departList2','workerList','deviceList', 'otherWorks'], setup(props: any, context: any) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); @@ -322,7 +319,7 @@ workContent: '', workLocation: '', riskIdentification: '', - involveOtherWork: '', + involveOtherWork: [], safetyMeasureUids: [], approvalDepBasicList: [], acceptUid: null, @@ -333,40 +330,6 @@ csOriginalName: '' } }, - otherWorkList: [ - { - label: "动火作业", - value: 1 - }, - { - label: "受限空间作业", - value: 2 - }, - { - label: "吊装作业", - value: 3 - }, - { - label: "动土作业", - value: 4 - }, - { - label: "断路作业", - value: 5 - }, - { - label: "高处作业", - value: 6 - }, - { - label: "临时用电作业", - value: 7 - }, - { - label: "盲板抽堵作业", - value: 8 - } - ], props:{ expandTrigger: 'hover', label: 'depName', @@ -403,10 +366,19 @@ "workDetail.csName": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], "workDetail.csOriginalName": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] }); - + const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { + }); + + const openWorkSelect = ()=>{ + workSelectRef.value.openDialog(state.form.involveOtherWork) + } + + const getSelected = ()=>{ + state.form.involveOtherWork = workSelectRef.value.selected + } const findParent = ()=>{ state.form.seDepId = findNearestDepLevel2DepId(props.departList2,state.form.applyDepId) @@ -461,9 +433,9 @@ return } } - if(Array.isArray(state.form.involveOtherWork)){ - state.form.involveOtherWork = state.form.involveOtherWork.join(',') - } + // if(Array.isArray(state.form.involveOtherWork)){ + // state.form.involveOtherWork = state.form.involveOtherWork.join(',') + // } const res = await workApplyApi().submitSpaceApply(state.form) if (res.data.code === '200') { ElMessage({ @@ -477,7 +449,7 @@ type: 'warning', message: res.data.msg }); - state.form.involveOtherWork = state.form.involveOtherWork.split(',') + // state.form.involveOtherWork = state.form.involveOtherWork.split(',') } } else { console.log('error submit!', fields) @@ -529,6 +501,9 @@ isFirstRow, submitForm, findParent, + openWorkSelect, + getSelected, + workSelectRef, Search, ruleFormRef, applyRules, @@ -543,9 +518,11 @@ width: 100%; height: 100vh; overflow: hidden; - position: relative; overflow-y: scroll; - padding: 0 0 120px; + &::-webkit-scrollbar{ + width: 0; + background-color: transparent; + } .homeCard{ width: 100%; padding: 20px; @@ -555,10 +532,6 @@ margin-bottom: 20px; } .applyBtn{ - position: fixed; - left: 0; - bottom: 0; - z-index: 999; width: 100%; background: #fff; padding: 20px 0; @@ -586,7 +559,11 @@ width: 100% !important; } } - + .valueSelect{ + ::v-deep(.el-popper){ + display: none !important; + } + } .tab-i{ margin-bottom: 15px; diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/workSelect.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/workSelect.vue new file mode 100644 index 0000000..15a2e29 --- /dev/null +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/workSelect.vue @@ -0,0 +1,184 @@ +<template> + <el-dialog :title="title" v-model="isShowDialog" width="80%"> + <el-row style="margin-bottom: 20px"> + <div class="basic-line" style="display:flex;white-space:nowrap;line-height: 40px"> + <span>作业编号:</span> + <el-input v-model="searPara.workPermitNo" placeholder="作业编号"/> + </div> + <div class="basic-line"> + <span>作业类型:</span> + <el-select v-model="searPara.workType"> + <el-option + v-for="item in workType" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </div> + <div style="margin-left: 20px"> + <el-button type="primary" @click="getData">查询</el-button> + <el-button plain @click="clearSearch">重置</el-button> + </div> + </el-row> + <el-table ref="TableRef" :data="otherWorks" style="width: 100%" border @selection-change="handleSelectionChange" :row-key="(row) => { return row.workApplyId }"> + <el-table-column type="selection" width="55" /> +<!-- <el-table-column type="index" label="序号" width="60" />--> + <el-table-column prop="workTypeDesc" label="作业类型" show-overflow-tooltip></el-table-column> + <el-table-column prop="workLevelDesc" label="作业等级" show-overflow-tooltip></el-table-column> + <el-table-column prop="workPermitNo" label="作业编号" show-overflow-tooltip></el-table-column> + <el-table-column prop="workLocation" label="作业地点" show-overflow-tooltip></el-table-column> + <el-table-column prop="workContent" label="作业内容" show-overflow-tooltip></el-table-column> +<!-- <el-table-column label="操作" width="150">--> +<!-- <template #default="scope">--> +<!-- <el-button size="small" text type="primary" @click="onOpenDialogRef('新增', '')">新增</el-button>--> +<!-- <el-button size="small" text type="primary" @click="onOpenDialogRef('修改', scope.row)">修改</el-button>--> +<!-- <el-button size="small" style="color: red" text type="primary" @click="onRowDel(scope.row)">删除</el-button>--> +<!-- </template>--> +<!-- </el-table-column>--> + </el-table> + <template #footer> + <span class="dialog-footer"> + <el-button @click="isShowDialog = !isShowDialog" size="default">取 消</el-button> + <el-button type="primary" v-throttle @click="onSubmit" size="default">确 定</el-button> + </span> + </template> + </el-dialog> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import { userApi } from '/@/api/systemManage/user'; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; + +// 定义接口来定义对象的类型 +interface type {} +interface WorkSelectState { + title: string + isShowDialog: boolean + searPara: object + otherWorks: [] + workType: Array<any> + selected: Array<any> +} +interface User { + +} +export default defineComponent({ + name: 'workSelect', + setup(props, context) { + const userRef = ref() + const state = reactive<WorkSelectState>({ + title: '', + isShowDialog: false, + searPara: { + workPermitNo: '', + workType: null + }, + otherWorks: [], + selected: [], + workType: [ + { + label: "动火作业", + value: 1 + }, + { + label: "受限空间作业", + value: 2 + }, + { + label: "吊装作业", + value: 3 + }, + { + label: "动土作业", + value: 4 + }, + { + label: "断路作业", + value: 5 + }, + { + label: "高处作业", + value: 6 + }, + { + label: "临时用电作业", + value: 7 + }, + { + label: "盲板抽堵作业", + value: 8 + } + ] + }); + const TableRef = ref() + const multipleSelection = ref<User[]>([]) + // 打开弹窗 + const openDialog = (works: Array<String>) => { + state.isShowDialog = true + getData().then(()=>refreshTableSelection(works)) + }; + + const refreshTableSelection = (works) => { + if (TableRef.value) { + for (let i = 0; i < state.otherWorks.length; i++) { + if (works.includes(state.otherWorks[i].workApplyId)){ + TableRef.value.toggleRowSelection(state.otherWorks[i], true) + } else{ + TableRef.value.toggleRowSelection(state.otherWorks[i], false) + } + } + } + } + + // 获取相关作业列表 + const getData = async () => { + let res = await workApplyApi().getOtherWork(state.searPara); + if (res.data.code === '200') { + state.otherWorks = JSON.parse(JSON.stringify(res.data.data)) + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + + const clearSearch = ()=>{ + state.searPara = { + workPermitNo: '', + workType: null + } + getData() + } + + const handleSelectionChange = (val: User[]) => { + multipleSelection.value = val + state.selected = JSON.parse(JSON.stringify(val)).map(i=>i.workApplyId) + } + + const onSubmit = ()=>{ + context.emit('refreshWorks') + state.selected = [] + clearSearch() + state.isShowDialog = false + } + + // 页面加载时 + onMounted(() => {}); + return { + userRef, + TableRef, + handleSelectionChange, + openDialog, + getData, + clearSearch, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/index.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/index.vue index 2b44843..3659ad6 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/index.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/index.vue @@ -1,29 +1,29 @@ <template> <div class="home-container"> - <el-tabs type="border-card" @tab-change="switchTab" v-model="activeName" @tab-click="handleClick"> + <el-tabs type="border-card" v-model="activeName" @tab-click="handleClick"> <el-tab-pane label="动火作业" name="fire"> - <fire-form ref="fire" :workerList = allWorkers :deviceList = allDevices :departList=departmentList :departList2=departmentList2></fire-form> + <fire-form ref="fire" :workerList = allWorkers :deviceList = allDevices :departList=departmentList :departList2=departmentList2 :otherWorks="otherWorks"></fire-form> </el-tab-pane> <el-tab-pane label="受限空间作业" name="space"> - <space-form ref="space" :workerList = allWorkers :departList = departmentList :departList2=departmentList2 :deviceList = allDevices></space-form> + <space-form ref="space" :workerList = allWorkers :departList = departmentList :departList2=departmentList2 :deviceList = allDevices :otherWorks="otherWorks"></space-form> </el-tab-pane> <el-tab-pane label="吊装作业" name="hoist"> - <hoist-form ref="hoist" :workerList = allWorkers :departList = departmentList :departList2=departmentList2 :deviceList = allDevices></hoist-form> + <hoist-form ref="hoist" :workerList = allWorkers :departList = departmentList :departList2=departmentList2 :deviceList = allDevices :otherWorks="otherWorks"></hoist-form> </el-tab-pane> <el-tab-pane label="动土作业" name="ground"> - <ground-form ref="ground" :workerList = allWorkers :departList = departmentList :departList2=departmentList2 :deviceList = allDevices></ground-form> + <ground-form ref="ground" :workerList = allWorkers :departList = departmentList :departList2=departmentList2 :deviceList = allDevices :otherWorks="otherWorks"></ground-form> </el-tab-pane> <el-tab-pane label="断路作业" name="broken"> - <broken-form ref="broken" :workerList = allWorkers :departList = departmentList :departList2=departmentList2 :deviceList = allDevices></broken-form> + <broken-form ref="broken" :workerList = allWorkers :departList = departmentList :departList2=departmentList2 :deviceList = allDevices :otherWorks="otherWorks"></broken-form> </el-tab-pane> <el-tab-pane label="高处作业" name="height"> - <height-form ref="height" :workerList = allWorkers :departList = departmentList :departList2=departmentList2 :deviceList = allDevices></height-form> + <height-form ref="height" :workerList = allWorkers :departList = departmentList :departList2=departmentList2 :deviceList = allDevices :otherWorks="otherWorks"></height-form> </el-tab-pane> <el-tab-pane label="临时用电作业" name="power"> - <power-form ref="power" :workerList = allWorkers :departList = departmentList :departList2=departmentList2 :deviceList = allDevices></power-form> + <power-form ref="power" :workerList = allWorkers :departList = departmentList :departList2=departmentList2 :deviceList = allDevices :otherWorks="otherWorks"></power-form> </el-tab-pane> <el-tab-pane label="盲板抽堵作业" name="plate"> - <plate-form ref="plate" :workerList = allWorkers :departList = departmentList :departList2=departmentList2 :deviceList = allDevices></plate-form> + <plate-form ref="plate" :workerList = allWorkers :departList = departmentList :departList2=departmentList2 :deviceList = allDevices :otherWorks="otherWorks"></plate-form> </el-tab-pane> </el-tabs> <!-- <material-dialog ref="material"></material-dialog>--> @@ -47,6 +47,7 @@ allWorkers: Array<any> departmentList: Array<any> departmentList2: Array<any> + otherWorks: Array<any> allDevices: Array<any> } export default defineComponent({ @@ -69,6 +70,7 @@ allWorkers: [], departmentList: [], departmentList2:[], + otherWorks: [], allDevices: [] }); const fire = ref() @@ -90,6 +92,15 @@ if(tab.index == 6){power.value.getBasicData()} if(tab.index == 7){plate.value.getBasicData()} } + + // 页面载入时执行方法 + onMounted(() => { + getAll(); + getAllDepartment(); + getAllDevice(); + getOtherWork() + }); + // 获取用户列表 const getAll = async ()=>{ const res = await workApplyApi().getAllUsers() @@ -117,6 +128,19 @@ } }; + // 获取相关作业列表 + const getOtherWork = async () => { + let res = await workApplyApi().getOtherWork({workPermitNo: '',workType: null}); + if (res.data.code === '200') { + state.otherWorks = JSON.parse(JSON.stringify(res.data.data)) + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + // 获取设备列表 const getAllDevice = async ()=>{ const res = await workApplyApi().getAllDevices() @@ -130,25 +154,6 @@ } }; - const switchTab = (name)=>{ - // if(name == 'fire'){fire.value.getBasicData()} - // if(name == 'space'){space.value.getBasicData()} - // if(name == 'hoist'){hoist.value.getBasicData()} - // if(name == 'ground'){ground.value.getBasicData()} - // if(name == 'broken'){broken.value.getBasicData()} - // if(name == 'height'){height.value.getBasicData()} - // if(name == 'power'){power.value.getBasicData()} - // if(name == 'plate'){plate.value.getBasicData()} - } - - - // 页面载入时执行方法 - onMounted(() => { - getAll(); - getAllDepartment(); - getAllDevice(); - }); - return { ...toRefs(state), fire, @@ -159,8 +164,8 @@ hoist, plate, power, - switchTab, - handleClick + handleClick, + getOtherWork }; }, }); diff --git a/src/views/newSpecialWorkSystem/workerManage/aqyBase/index.vue b/src/views/newSpecialWorkSystem/workerManage/aqyBase/index.vue new file mode 100644 index 0000000..ec8a832 --- /dev/null +++ b/src/views/newSpecialWorkSystem/workerManage/aqyBase/index.vue @@ -0,0 +1,339 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <el-row class="homeCard"> + <el-cascader + v-model="userTableData.listQuery.searchParams.depId" + :props="props" + :options="departmentList" + :show-all-levels="false" + placeholder="请选择部门" + clearable + size="default" + ></el-cascader> + <el-input size="default" v-model.trim="userTableData.listQuery.searchParams.username" placeholder="请输入用户名" style="max-width: 180px;margin-left: 10px;margin-right: 10px"> </el-input> + <el-input size="default" v-model.trim="userTableData.listQuery.searchParams.realName" placeholder="请输入真实姓名" style="max-width: 180px"> </el-input> + <el-button size="default" type="primary" class="ml10" @click="initUserTableData"> + <el-icon> + <ele-Search /> + </el-icon> + 查询 + </el-button> + </el-row> + <div class="homeCard"> + <div class="main-card"> + <el-table :data="userTableData.data" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column type="index" label="序号" width="60" /> + <el-table-column prop="username" label="用户名" show-overflow-tooltip></el-table-column> + <el-table-column prop="realName" label="真实姓名" show-overflow-tooltip></el-table-column> + <el-table-column prop="depName" label="部门" show-overflow-tooltip></el-table-column> + <el-table-column prop="phone" label="手机号" show-overflow-tooltip></el-table-column> + <el-table-column prop="email" label="证书编号" show-overflow-tooltip></el-table-column> + <el-table-column prop="gmtCreate" label="证书有效期至" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> + <el-button :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onOpenUserDialog('查看', scope.row)">查看</el-button> + <el-button size="small" text type="primary" @click="onCertificate(scope.row)">证书管理</el-button> +<!-- <el-button style="color: red" :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onRowDel(scope.row)">删除</el-button>--> + </template> + </el-table-column> + </el-table> + <div class="pageBtn"> + <el-pagination @size-change="onHandleSizeChange" small="false" @current-change="onHandleCurrentChange" class="page-position" :pager-count="5" :page-sizes="[10, 20, 30]" v-model:current-page="userTableData.listQuery.pageIndex" background v-model:page-size="userTableData.listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="userTableData.total"> </el-pagination> + </div> + </div> + </div> + </div> + <userDialog ref="userRef" @getUserList="initUserTableData" /> + <dialog-certificate ref="ctfRef" @getUserList="initUserTableData"></dialog-certificate> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import userDialog from '/@/views/newSpecialWorkSystem/workerManage/component/userDialog.vue'; +import dialogCertificate from "/@/views/system/user/component/dialogCertificate.vue"; +import { userApi } from '/@/api/systemManage/user'; +import { dutyApi } from '/@/api/systemManage/duty'; +import { departmentApi } from '/@/api/systemManage/department'; +import { useRoleApi } from '/@/api/systemManage/role'; +import {workerManageApi} from "/@/api/specialWorkSystem/workerManage"; + +// 定义接口来定义对象的类型 +interface TableDataRow { + userName: string; + userNickname: string; + roleSign: string; + department: string[]; + phone: string; + email: string; + sex: string; + password: string; + overdueTime: Date; + status: boolean; + describe: string; + createTime: string; +} +interface DepartmentDataRow {} +interface TableDataState { + userTableData: { + data: Array<TableDataRow>; + total: number; + loading: boolean; + listQuery: { + searchParams: { + depId: string | null; + username: string | null; + realName: string | null; + }; + pageIndex: number; + pageSize: number; + }; + }; + departmentList: []; + roleList: []; + dutyList: []; + userTypeList: Array<{id:number,name:string}>; + props:{} +} + +export default defineComponent({ + name: 'systemUser', + components: { userDialog, dialogCertificate }, + setup() { + const userRef = ref(); + const ctfRef = ref() + const state = reactive<TableDataState>({ + userTableData: { + data: [], + total: 0, + loading: false, + listQuery: { + searchParams: { + depId: null, + username: null, + realName: null + }, + pageIndex: 1, + pageSize: 10 + } + }, + departmentList: [], + roleList: [], + dutyList: [], + props: { + label: 'depName', + value: 'depId', + checkStrictly: true, + emitPath: false + }, + userTypeList: [ + { id: 1, name: '超级管理员' }, + { id: 2, name: '管理员' }, + { id: 3, name: '普通员工' } + ] + }); + // 初始化表格数据 + const initUserTableData = async () => { + let res = await workerManageApi().getHeaderListPage(state.userTableData.listQuery); + if (res.data.code === '200') { + state.userTableData.data = res.data.data; + state.userTableData.total = res.data.total; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + // 回显职务信息 + const parseNumber = (value: number) => { + return state.dutyList.find((i) => i.positionId === value)?.positionName; + }; + const getDepartmentData = async () => { + let res = await departmentApi().getDepartmentList(); + if (res.data.code === '200') { + state.departmentList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + const getRoleData = async () => { + let res = await useRoleApi().getRoleList(); + if (res.data.code === '200') { + state.roleList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + const getDutyData = async () => { + let res = await dutyApi().getAllList({positionName: '',positionCode: ''}); + if (res.data.code === '200') { + state.dutyList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + // 打开新增修改用户弹窗 + const onOpenUserDialog = (type: string, value: any) => { + userRef.value.openDialog(type, value, state.departmentList, state.roleList, state.dutyList); + }; + + const onCertificate = (value: any)=>{ + ctfRef.value.openDialog(value); + } + + // 删除用户 + const onRowDel = (row: TableDataRow) => { + ElMessageBox.confirm(`此操作将永久删除账户名称:“${row.realName}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await userApi().deleteUser({ uid: row.uid }); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + duration: 2000, + message: '删除成功' + }); + await initUserTableData(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.userTableData.listQuery.pageSize = val; + initUserTableData(); + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.userTableData.listQuery.pageIndex = val; + initUserTableData(); + }; + // 页面加载时 + onMounted(() => { + initUserTableData(); + getDepartmentData(); + getRoleData(); + getDutyData() + }); + return { + userRef, + ctfRef, + onOpenUserDialog, + onCertificate, + onRowDel, + parseNumber, + onHandleSizeChange, + initUserTableData, + onHandleCurrentChange, + ...toRefs(state) + }; + } +}); +</script> +<style lang="scss" scoped> +.home-container { + height: calc(100vh - 144px); + box-sizing: border-box; + overflow: hidden; + .demo-tabs { + width: 100%; + height: 100%; + + &::v-deep(.el-tabs__content) { + height: calc(100% - 60px); + } + + .el-tab-pane { + height: 100%; + } + } + .homeCard { + width: 100%; + padding: 20px; + box-sizing: border-box; + background: #fff; + border-radius: 4px; + + .main-card { + width: 100%; + height: 100%; + .cardTop { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + .mainCardBtn { + margin: 0; + } + } + .pageBtn { + height: 60px; + display: flex; + align-items: center; + justify-content: right; + + .demo-pagination-block + .demo-pagination-block { + margin-top: 10px; + } + .demo-pagination-block .demonstration { + margin-bottom: 16px; + } + } + } + &:last-of-type { + height: calc(100% - 100px); + } + } + .el-row { + display: flex; + align-items: center; + margin-bottom: 20px; + &:last-child { + margin-bottom: 0; + } + .grid-content { + align-items: center; + min-height: 36px; + } + + .topInfo { + display: flex; + align-items: center; + font-size: 16px; + font-weight: bold; + + & > div { + white-space: nowrap; + margin-right: 20px; + } + } + } + .el-card { + border: 0; + } +} +</style> diff --git a/src/views/newSpecialWorkSystem/workerManage/component/userDialog.vue b/src/views/newSpecialWorkSystem/workerManage/component/userDialog.vue new file mode 100644 index 0000000..e978c9d --- /dev/null +++ b/src/views/newSpecialWorkSystem/workerManage/component/userDialog.vue @@ -0,0 +1,279 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowUserDialog" width="769px"> + <el-form :model="userForm" size="default" ref="userRef" :rules="userFormRules" label-width="90px"> + <el-row :gutter="35"> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-if="disabled"> + <el-form-item label="用户名" prop="username"> + <el-input v-model.trim="userForm.username" :disabled="disabled" placeholder="" clearable></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="真实姓名" prop="realName"> + <el-input v-model.trim="userForm.realName" :disabled="allDisabled" placeholder="请输入真实姓名" clearable></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="关联角色" prop="roleIds"> + <el-select v-model="userForm.roleIds" placeholder="请选择" clearable class="w100" multiple :disabled="allDisabled"> + <el-option v-for="item in roleData" :key="item.roleId" :label="item.roleName" :value="item.roleId"> </el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="部门" prop="depId"> + <el-cascader :options="departmentData" :props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName' }" placeholder="请选择部门" clearable class="w100" v-model="userForm.depId" :disabled="allDisabled"> </el-cascader> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="职务" prop="positionIds"> + <el-select v-model="userForm.positionIds" placeholder="请选择" clearable class="w100" multiple :disabled="allDisabled"> + <el-option v-for="item in dutyData" :key="item.positionId" :label="item.positionName" :value="item.positionId"> </el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="手机号" prop="phone"> + <el-input v-model.trim="userForm.phone" placeholder="请输入手机号" clearable :disabled="allDisabled"></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="身份证"> + <el-input v-model.trim="userForm.identify" placeholder="请输入身份证" clearable :disabled="allDisabled"></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="邮箱"> + <el-input v-model.trim="userForm.email" placeholder="请输入" clearable :disabled="allDisabled"></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="性别" prop="gender"> + <el-select v-model="userForm.gender" placeholder="请选择" clearable class="w100" :disabled="allDisabled"> + <el-option v-for="item in sexList" :key="item.id" :value="item.id" :label="item.name"> </el-option> + </el-select> + </el-form-item> + </el-col> +<!-- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">--> +<!-- <el-form-item label="账户过期" prop="expireTime">--> +<!-- <el-date-picker v-model="userForm.expireTime" type="date" placeholder="请选择" class="w100"> </el-date-picker>--> +<!-- </el-form-item>--> +<!-- </el-col>--> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-if="!disabled"> + <el-form-item label="账户密码" prop="password"> + <el-input v-model.trim="userForm.password" placeholder="请输入" type="password" show-password> + </el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="用户类型" prop="type"> + <el-select v-model="userForm.type" placeholder="请选择" clearable class="w100" :disabled="allDisabled"> + <el-option v-for="item in userTypeList.filter(item => userForm.type === 1 ? item.id === 1 : item.id !== 1)" :key="item.id" :label="item.name" :value="item.id"> </el-option> + </el-select> + </el-form-item> + </el-col> + <!-- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">--> + <!-- <el-form-item label="用户状态">--> + <!-- <el-switch v-model="userForm.status" inline-prompt active-value = 1 inactive-value= 0 active-text="启" inactive-text="禁"></el-switch>--> + <!-- </el-form-item>--> + <!-- </el-col>--> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="isShowUserDialog = !isShowUserDialog" size="default">取 消</el-button> + <el-button type="primary" v-throttle @click="onSubmit" size="default" v-if="!allDisabled">确 定</el-button> + </span> + </template> + </el-dialog> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import { userApi } from '/@/api/systemManage/user'; + +// 定义接口来定义对象的类型 +interface DeptData {} +interface roleData {} +interface dutyData {} +interface sexData {} +interface type {} +interface UserState { + title: string; + disabled: boolean; + allDisabled: boolean; + isShowUserDialog: boolean; + userForm: { + username: string; + realName: string; + roleIds: Array<number> + depId: number | null; + positionIds: Array<number> + phone: string; + email: string; + gender: number | null; + type: number | null; + password: string; + status: number; + identify: string; + }; + userFormRules:{ + + }, + departmentData: Array<DeptData>; + roleData: Array<roleData>; + dutyData: Array<dutyData>; + sexList: Array<sexData>; + userTypeList: Array<type>; +} + +export default defineComponent({ + name: 'user', + setup(props, context) { + const userRef = ref() + const state = reactive<UserState>({ + title: '', + disabled: false, + allDisabled: false, + isShowUserDialog: false, + userForm: { + username: '', // 账户名称 + realName: '', // 用户昵称 + roleIds: [], // 关联角色 + depId: null, // 部门 + phone: '', // 手机号 + email: '', // 邮箱 + identify: '', + gender: null, // 性别 + password: '', // 账户密码 + positionIds: [], // 岗位 + type: null, // 用户类型 + status: 1 // 用户状态 + }, + userFormRules:{ + username: [{ required: true, message: '请填写用户名', trigger: 'blur' }], + realName: [{ required: true, message: '请填写真实姓名', trigger: 'blur' }], + roleIds: [{ required: true, message: '请选择用户角色', trigger: 'change' }], + depId: [{ required: true, message: '请选择部门', trigger: 'change' }], + positionIds: [{ required: true, message: '请选择职务', trigger: 'change' }], + phone: [{ required: true, message: '请填写手机号', trigger: 'blur' }], + type: [{ required: true, message: '请填写用户类型', trigger: 'blur' }], + gender: [{ required: true, message: '请选择性别', trigger: 'change' }], + password: [{ required: true, message: '请输入账户密码', trigger: 'blur' }], + }, + departmentData: [], // 部门数据 + roleData: [], //角色数据 + dutyData:[], //职务数据 + sexList: [ + { id: 1, name: '男' }, + { id: 0, name: '女' } + ], + userTypeList: [ + { id: 1, name: '超级管理员' }, + { id: 2, name: '管理员' }, + { id: 3, name: '普通员工' } + ], + }); + // 打开弹窗 + const openDialog = (type: string, value: any, departmentList: [], roleList: [], dutyList:[]) => { + state.isShowUserDialog = true; + state.departmentData = departmentList; + state.roleData = roleList; + state.dutyData = dutyList + if (type === '新增') { + state.disabled = false + state.allDisabled = false + state.title = '新增用户'; + state.userForm = { + username: '', + realName: '', + roleIds: [], + depId: null, + phone: '', + email: '', + identify: '', + positionIds: [], + gender: null, + type: null, + password: '', + status: 1 + }; + } else{ + if(type === '修改'){ + state.disabled = true + state.allDisabled = false + state.title = '修改用户'; + state.userForm = JSON.parse(JSON.stringify(value)); + state.userForm.roleIds = JSON.parse(JSON.stringify(value)).roles?.map(obj=>obj.roleId) + state.userForm.positionIds = JSON.parse(JSON.stringify(value)).positions?.map(obj=>obj.positionId) + }else{ + state.disabled = true + state.allDisabled = true + state.title = '查看'; + state.userForm = JSON.parse(JSON.stringify(value)); + state.userForm.roleIds = JSON.parse(JSON.stringify(value)).roles?.map(obj=>obj.roleId) + state.userForm.positionIds = JSON.parse(JSON.stringify(value)).positions?.map(obj=>obj.positionId) + } + } + }; + + // 新增修改 + const onSubmit = async () => { + userRef.value.validate(async (valid:Boolean) => { + if(valid){ + if (state.title === '新增用户') { + let res = await userApi().addUser(state.userForm); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '用户新增成功', + duration: 2000 + }); + state.isShowUserDialog = false; + context.emit('getUserList'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } else { + let res = await userApi().modUser(state.userForm); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '用户修改成功', + duration: 2000 + }); + state.isShowUserDialog = false; + context.emit('getUserList'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + + }; + + // 页面加载时 + onMounted(() => {}); + return { + userRef, + openDialog, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/newSpecialWorkSystem/workerManage/guardianBase/index.vue b/src/views/newSpecialWorkSystem/workerManage/guardianBase/index.vue new file mode 100644 index 0000000..06c033a --- /dev/null +++ b/src/views/newSpecialWorkSystem/workerManage/guardianBase/index.vue @@ -0,0 +1,339 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <el-row class="homeCard"> + <el-cascader + v-model="userTableData.listQuery.searchParams.depId" + :props="props" + :options="departmentList" + :show-all-levels="false" + placeholder="请选择部门" + clearable + size="default" + ></el-cascader> + <el-input size="default" v-model.trim="userTableData.listQuery.searchParams.username" placeholder="请输入用户名" style="max-width: 180px;margin-left: 10px;margin-right: 10px"> </el-input> + <el-input size="default" v-model.trim="userTableData.listQuery.searchParams.realName" placeholder="请输入真实姓名" style="max-width: 180px"> </el-input> + <el-button size="default" type="primary" class="ml10" @click="initUserTableData"> + <el-icon> + <ele-Search /> + </el-icon> + 查询 + </el-button> + </el-row> + <div class="homeCard"> + <div class="main-card"> + <el-table :data="userTableData.data" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column type="index" label="序号" width="60" /> + <el-table-column prop="username" label="用户名" show-overflow-tooltip></el-table-column> + <el-table-column prop="realName" label="真实姓名" show-overflow-tooltip></el-table-column> + <el-table-column prop="depName" label="部门" show-overflow-tooltip></el-table-column> + <el-table-column prop="phone" label="手机号" show-overflow-tooltip></el-table-column> + <el-table-column prop="email" label="证书编号" show-overflow-tooltip></el-table-column> + <el-table-column prop="gmtCreate" label="证书有效期至" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> + <el-button :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onOpenUserDialog('查看', scope.row)">查看</el-button> + <el-button size="small" text type="primary" @click="onCertificate(scope.row)">证书管理</el-button> + <!-- <el-button style="color: red" :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onRowDel(scope.row)">删除</el-button>--> + </template> + </el-table-column> + </el-table> + <div class="pageBtn"> + <el-pagination @size-change="onHandleSizeChange" small="false" @current-change="onHandleCurrentChange" class="page-position" :pager-count="5" :page-sizes="[10, 20, 30]" v-model:current-page="userTableData.listQuery.pageIndex" background v-model:page-size="userTableData.listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="userTableData.total"> </el-pagination> + </div> + </div> + </div> + </div> + <userDialog ref="userRef" @getUserList="initUserTableData" /> + <dialog-certificate ref="ctfRef" @getUserList="initUserTableData"></dialog-certificate> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import userDialog from '/@/views/newSpecialWorkSystem/workerManage/component/userDialog.vue'; +import dialogCertificate from "/@/views/system/user/component/dialogCertificate.vue"; +import { userApi } from '/@/api/systemManage/user'; +import { dutyApi } from '/@/api/systemManage/duty'; +import { departmentApi } from '/@/api/systemManage/department'; +import { useRoleApi } from '/@/api/systemManage/role'; +import {workerManageApi} from "/@/api/specialWorkSystem/workerManage"; + +// 定义接口来定义对象的类型 +interface TableDataRow { + userName: string; + userNickname: string; + roleSign: string; + department: string[]; + phone: string; + email: string; + sex: string; + password: string; + overdueTime: Date; + status: boolean; + describe: string; + createTime: string; +} +interface DepartmentDataRow {} +interface TableDataState { + userTableData: { + data: Array<TableDataRow>; + total: number; + loading: boolean; + listQuery: { + searchParams: { + depId: string | null; + username: string | null; + realName: string | null; + }; + pageIndex: number; + pageSize: number; + }; + }; + departmentList: []; + roleList: []; + dutyList: []; + userTypeList: Array<{id:number,name:string}>; + props:{} +} + +export default defineComponent({ + name: 'systemUser', + components: { userDialog, dialogCertificate }, + setup() { + const userRef = ref(); + const ctfRef = ref() + const state = reactive<TableDataState>({ + userTableData: { + data: [], + total: 0, + loading: false, + listQuery: { + searchParams: { + depId: null, + username: null, + realName: null + }, + pageIndex: 1, + pageSize: 10 + } + }, + departmentList: [], + roleList: [], + dutyList: [], + props: { + label: 'depName', + value: 'depId', + checkStrictly: true, + emitPath: false + }, + userTypeList: [ + { id: 1, name: '超级管理员' }, + { id: 2, name: '管理员' }, + { id: 3, name: '普通员工' } + ] + }); + // 初始化表格数据 + const initUserTableData = async () => { + let res = await workerManageApi().getGuardianListPage(state.userTableData.listQuery); + if (res.data.code === '200') { + state.userTableData.data = res.data.data; + state.userTableData.total = res.data.total; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + // 回显职务信息 + const parseNumber = (value: number) => { + return state.dutyList.find((i) => i.positionId === value)?.positionName; + }; + const getDepartmentData = async () => { + let res = await departmentApi().getDepartmentList(); + if (res.data.code === '200') { + state.departmentList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + const getRoleData = async () => { + let res = await useRoleApi().getRoleList(); + if (res.data.code === '200') { + state.roleList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + const getDutyData = async () => { + let res = await dutyApi().getAllList({positionName: '',positionCode: ''}); + if (res.data.code === '200') { + state.dutyList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + // 打开新增修改用户弹窗 + const onOpenUserDialog = (type: string, value: any) => { + userRef.value.openDialog(type, value, state.departmentList, state.roleList, state.dutyList); + }; + + const onCertificate = (value: any)=>{ + ctfRef.value.openDialog(value); + } + + // 删除用户 + const onRowDel = (row: TableDataRow) => { + ElMessageBox.confirm(`此操作将永久删除账户名称:“${row.realName}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await userApi().deleteUser({ uid: row.uid }); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + duration: 2000, + message: '删除成功' + }); + await initUserTableData(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.userTableData.listQuery.pageSize = val; + initUserTableData(); + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.userTableData.listQuery.pageIndex = val; + initUserTableData(); + }; + // 页面加载时 + onMounted(() => { + initUserTableData(); + getDepartmentData(); + getRoleData(); + getDutyData() + }); + return { + userRef, + ctfRef, + onOpenUserDialog, + onCertificate, + onRowDel, + parseNumber, + onHandleSizeChange, + initUserTableData, + onHandleCurrentChange, + ...toRefs(state) + }; + } +}); +</script> +<style lang="scss" scoped> +.home-container { + height: calc(100vh - 144px); + box-sizing: border-box; + overflow: hidden; + .demo-tabs { + width: 100%; + height: 100%; + + &::v-deep(.el-tabs__content) { + height: calc(100% - 60px); + } + + .el-tab-pane { + height: 100%; + } + } + .homeCard { + width: 100%; + padding: 20px; + box-sizing: border-box; + background: #fff; + border-radius: 4px; + + .main-card { + width: 100%; + height: 100%; + .cardTop { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + .mainCardBtn { + margin: 0; + } + } + .pageBtn { + height: 60px; + display: flex; + align-items: center; + justify-content: right; + + .demo-pagination-block + .demo-pagination-block { + margin-top: 10px; + } + .demo-pagination-block .demonstration { + margin-bottom: 16px; + } + } + } + &:last-of-type { + height: calc(100% - 100px); + } + } + .el-row { + display: flex; + align-items: center; + margin-bottom: 20px; + &:last-child { + margin-bottom: 0; + } + .grid-content { + align-items: center; + min-height: 36px; + } + + .topInfo { + display: flex; + align-items: center; + font-size: 16px; + font-weight: bold; + + & > div { + white-space: nowrap; + margin-right: 20px; + } + } + } + .el-card { + border: 0; + } +} +</style> diff --git a/src/views/newSpecialWorkSystem/workerManage/operatorBase/index.vue b/src/views/newSpecialWorkSystem/workerManage/operatorBase/index.vue new file mode 100644 index 0000000..2b5fdff --- /dev/null +++ b/src/views/newSpecialWorkSystem/workerManage/operatorBase/index.vue @@ -0,0 +1,339 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <el-row class="homeCard"> + <el-cascader + v-model="userTableData.listQuery.searchParams.depId" + :props="props" + :options="departmentList" + :show-all-levels="false" + placeholder="请选择部门" + clearable + size="default" + ></el-cascader> + <el-input size="default" v-model.trim="userTableData.listQuery.searchParams.username" placeholder="请输入用户名" style="max-width: 180px;margin-left: 10px;margin-right: 10px"> </el-input> + <el-input size="default" v-model.trim="userTableData.listQuery.searchParams.realName" placeholder="请输入真实姓名" style="max-width: 180px"> </el-input> + <el-button size="default" type="primary" class="ml10" @click="initUserTableData"> + <el-icon> + <ele-Search /> + </el-icon> + 查询 + </el-button> + </el-row> + <div class="homeCard"> + <div class="main-card"> + <el-table :data="userTableData.data" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column type="index" label="序号" width="60" /> + <el-table-column prop="username" label="用户名" show-overflow-tooltip></el-table-column> + <el-table-column prop="realName" label="真实姓名" show-overflow-tooltip></el-table-column> + <el-table-column prop="depName" label="部门" show-overflow-tooltip></el-table-column> + <el-table-column prop="phone" label="手机号" show-overflow-tooltip></el-table-column> + <el-table-column prop="email" label="证书编号" show-overflow-tooltip></el-table-column> + <el-table-column prop="gmtCreate" label="证书有效期至" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> + <el-button :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onOpenUserDialog('查看', scope.row)">查看</el-button> + <el-button size="small" text type="primary" @click="onCertificate(scope.row)">证书管理</el-button> + <!-- <el-button style="color: red" :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onRowDel(scope.row)">删除</el-button>--> + </template> + </el-table-column> + </el-table> + <div class="pageBtn"> + <el-pagination @size-change="onHandleSizeChange" small="false" @current-change="onHandleCurrentChange" class="page-position" :pager-count="5" :page-sizes="[10, 20, 30]" v-model:current-page="userTableData.listQuery.pageIndex" background v-model:page-size="userTableData.listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="userTableData.total"> </el-pagination> + </div> + </div> + </div> + </div> + <userDialog ref="userRef" @getUserList="initUserTableData" /> + <dialog-certificate ref="ctfRef" @getUserList="initUserTableData"></dialog-certificate> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import userDialog from '/@/views/newSpecialWorkSystem/workerManage/component/userDialog.vue'; +import dialogCertificate from "/@/views/system/user/component/dialogCertificate.vue"; +import { userApi } from '/@/api/systemManage/user'; +import { dutyApi } from '/@/api/systemManage/duty'; +import { departmentApi } from '/@/api/systemManage/department'; +import { useRoleApi } from '/@/api/systemManage/role'; +import {workerManageApi} from "/@/api/specialWorkSystem/workerManage"; + +// 定义接口来定义对象的类型 +interface TableDataRow { + userName: string; + userNickname: string; + roleSign: string; + department: string[]; + phone: string; + email: string; + sex: string; + password: string; + overdueTime: Date; + status: boolean; + describe: string; + createTime: string; +} +interface DepartmentDataRow {} +interface TableDataState { + userTableData: { + data: Array<TableDataRow>; + total: number; + loading: boolean; + listQuery: { + searchParams: { + depId: string | null; + username: string | null; + realName: string | null; + }; + pageIndex: number; + pageSize: number; + }; + }; + departmentList: []; + roleList: []; + dutyList: []; + userTypeList: Array<{id:number,name:string}>; + props:{} +} + +export default defineComponent({ + name: 'systemUser', + components: { userDialog, dialogCertificate }, + setup() { + const userRef = ref(); + const ctfRef = ref() + const state = reactive<TableDataState>({ + userTableData: { + data: [], + total: 0, + loading: false, + listQuery: { + searchParams: { + depId: null, + username: null, + realName: null + }, + pageIndex: 1, + pageSize: 10 + } + }, + departmentList: [], + roleList: [], + dutyList: [], + props: { + label: 'depName', + value: 'depId', + checkStrictly: true, + emitPath: false + }, + userTypeList: [ + { id: 1, name: '超级管理员' }, + { id: 2, name: '管理员' }, + { id: 3, name: '普通员工' } + ] + }); + // 初始化表格数据 + const initUserTableData = async () => { + let res = await workerManageApi().getOperatorListPage(state.userTableData.listQuery); + if (res.data.code === '200') { + state.userTableData.data = res.data.data; + state.userTableData.total = res.data.total; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + // 回显职务信息 + const parseNumber = (value: number) => { + return state.dutyList.find((i) => i.positionId === value)?.positionName; + }; + const getDepartmentData = async () => { + let res = await departmentApi().getDepartmentList(); + if (res.data.code === '200') { + state.departmentList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + const getRoleData = async () => { + let res = await useRoleApi().getRoleList(); + if (res.data.code === '200') { + state.roleList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + const getDutyData = async () => { + let res = await dutyApi().getAllList({positionName: '',positionCode: ''}); + if (res.data.code === '200') { + state.dutyList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + // 打开新增修改用户弹窗 + const onOpenUserDialog = (type: string, value: any) => { + userRef.value.openDialog(type, value, state.departmentList, state.roleList, state.dutyList); + }; + + const onCertificate = (value: any)=>{ + ctfRef.value.openDialog(value); + } + + // 删除用户 + const onRowDel = (row: TableDataRow) => { + ElMessageBox.confirm(`此操作将永久删除账户名称:“${row.realName}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await userApi().deleteUser({ uid: row.uid }); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + duration: 2000, + message: '删除成功' + }); + await initUserTableData(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.userTableData.listQuery.pageSize = val; + initUserTableData(); + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.userTableData.listQuery.pageIndex = val; + initUserTableData(); + }; + // 页面加载时 + onMounted(() => { + initUserTableData(); + getDepartmentData(); + getRoleData(); + getDutyData() + }); + return { + userRef, + ctfRef, + onOpenUserDialog, + onCertificate, + onRowDel, + parseNumber, + onHandleSizeChange, + initUserTableData, + onHandleCurrentChange, + ...toRefs(state) + }; + } +}); +</script> +<style lang="scss" scoped> +.home-container { + height: calc(100vh - 144px); + box-sizing: border-box; + overflow: hidden; + .demo-tabs { + width: 100%; + height: 100%; + + &::v-deep(.el-tabs__content) { + height: calc(100% - 60px); + } + + .el-tab-pane { + height: 100%; + } + } + .homeCard { + width: 100%; + padding: 20px; + box-sizing: border-box; + background: #fff; + border-radius: 4px; + + .main-card { + width: 100%; + height: 100%; + .cardTop { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + .mainCardBtn { + margin: 0; + } + } + .pageBtn { + height: 60px; + display: flex; + align-items: center; + justify-content: right; + + .demo-pagination-block + .demo-pagination-block { + margin-top: 10px; + } + .demo-pagination-block .demonstration { + margin-bottom: 16px; + } + } + } + &:last-of-type { + height: calc(100% - 100px); + } + } + .el-row { + display: flex; + align-items: center; + margin-bottom: 20px; + &:last-child { + margin-bottom: 0; + } + .grid-content { + align-items: center; + min-height: 36px; + } + + .topInfo { + display: flex; + align-items: center; + font-size: 16px; + font-weight: bold; + + & > div { + white-space: nowrap; + margin-right: 20px; + } + } + } + .el-card { + border: 0; + } +} +</style> diff --git a/src/views/specialWorkSystem/alarm/zyyjjl/index.vue b/src/views/specialWorkSystem/alarm/zyyjjl/index.vue index 0505b81..954b75c 100644 --- a/src/views/specialWorkSystem/alarm/zyyjjl/index.vue +++ b/src/views/specialWorkSystem/alarm/zyyjjl/index.vue @@ -182,18 +182,18 @@ deleteId: null, deleteArr: [], workTypeList: [ - { id: '1', name: '动火作业' }, - { id: '2', name: '受限空间作业' }, - { id: '3', name: '吊装作业' }, - { id: '4', name: '动土作业' }, - { id: '5', name: '断路作业' }, - { id: '6', name: '高处作业' }, - { id: '7', name: '临时用电作业' }, - { id: '8', name: '盲板抽堵作业' } + { id: 1, name: '动火作业' }, + { id: 2, name: '受限空间作业' }, + { id: 3, name: '吊装作业' }, + { id: 4, name: '动土作业' }, + { id: 5, name: '断路作业' }, + { id: 6, name: '高处作业' }, + { id: 7, name: '临时用电作业' }, + { id: 8, name: '盲板抽堵作业' } ], alertTypeList: [ - { id: '1', name: '检查' }, - { id: '2', name: '检测' } + { id: 1, name: '检查' }, + { id: 2, name: '检测' } ] }); @@ -202,7 +202,7 @@ getListByPage(); }); - // 分页获取班组管理列表 + // 分页获取预警列表 const getListByPage = async () => { const data = { pageSize: state.pageSize, pageIndex: state.pageIndex, searchParams: { workType: state.searchType, workPermitNo: state.searchWord,warningType: state.warningType } }; let res = await workProcessApi().postAlertList(data); diff --git a/src/views/specialWorkSystem/process/components/dialogPermitNo.vue b/src/views/specialWorkSystem/process/components/dialogPermitNo.vue index 9738408..8ebb0c2 100644 --- a/src/views/specialWorkSystem/process/components/dialogPermitNo.vue +++ b/src/views/specialWorkSystem/process/components/dialogPermitNo.vue @@ -71,7 +71,9 @@ interface stateType { workPermitNo: string searchNo: string - workType: number + workType: number | null + tableData: Array<any> + workTypeList: Array<any> } export default defineComponent({ name: 'permitNo', @@ -127,7 +129,7 @@ state.workPermitNo = currentRow.value.workPermitNo } // 获取作业编号列表 - const getAllReport = async (data)=>{ + const getAllReport = async ()=>{ const res = await workProcessApi().postReportList({workPermitNo: state.searchNo,workType: state.workType}) if (res.data.code === '200') { state.tableData = JSON.parse(JSON.stringify(res.data.data)) @@ -187,11 +189,10 @@ position: relative; .homeCard{ width: 100%; - padding: 20px; + padding: 0 20px; box-sizing: border-box; background: #fff; border-radius: 4px; - margin-bottom: 20px; } .applyBtn{ width: 100%; diff --git a/src/views/specialWorkSystem/process/zyjcgl/index.vue b/src/views/specialWorkSystem/process/zyjcgl/index.vue index 7398d60..3c93feb 100644 --- a/src/views/specialWorkSystem/process/zyjcgl/index.vue +++ b/src/views/specialWorkSystem/process/zyjcgl/index.vue @@ -50,11 +50,11 @@ <el-table-column property="info" label="描述" show-overflow-tooltip width="200" align="center"/> <el-table-column property="operatorUname" label="分析人" align="center"/> <el-table-column property="operationTime" label="分析时间" width="180" align="center"/> - <el-table-column property="mcResultName" label="物资检查" width="180" align="center"> - <template #default="scope"> - <span :class="scope.row.mcResultName == '不合格' ? 'red': ''">{{ scope.row.mcResultName== null?'-':scope.row.mcResultName}}</span> - </template> - </el-table-column> +<!-- <el-table-column property="mcResultName" label="物资检查" width="180" align="center">--> +<!-- <template #default="scope">--> +<!-- <span :class="scope.row.mcResultName == '不合格' ? 'red': ''">{{ scope.row.mcResultName== null?'-':scope.row.mcResultName}}</span>--> +<!-- </template>--> +<!-- </el-table-column>--> <el-table-column fixed="right" label="操作" align="center" width="100"> <template #default="scope"> <el-button link type="primary" size="small" :icon="View" @click="viewRecord(scope.row)">查看</el-button> @@ -92,7 +92,8 @@ <el-input :class="details.checkResultDesc == '异常' ? 'red': ''" v-model="details.checkResultDesc" readonly/> </el-form-item> <el-form-item label="现场图片" v-if="details.imagePaths && details.imagePaths.length>0"> - <el-image v-for="item in details.imagePaths" :preview-src-list="details.imagePaths" style="width: 150px; height: 150px;margin-right: 50px;margin-bottom: 20px" :src="item" fit="cover" /> +<!-- <el-image v-for="item in details.imagePaths" :preview-src-list="details.imagePaths" style="width: 150px; height: 150px;margin-right: 50px;margin-bottom: 20px" :src="item" fit="cover" />--> + <el-image v-for="item in details.imagePaths" :preview-src-list="[item]" style="width: 150px; height: 150px;margin-right: 50px;margin-bottom: 20px" :src="item" fit="cover" /> </el-form-item> <el-form-item label="描述"> <el-input v-model="details.info" type="textarea" readonly/> @@ -103,9 +104,9 @@ <el-form-item label="分析时间"> <el-input v-model="details.operationTime" readonly/> </el-form-item> - <el-form-item label="物资检查"> - <span>{{details.mcResultName== null?'-':details.mcResultName}}</span> - </el-form-item> +<!-- <el-form-item label="物资检查">--> +<!-- <span>{{details.mcResultName== null?'-':details.mcResultName}}</span>--> +<!-- </el-form-item>--> </el-form> <template #footer> <span class="dialog-footer"> @@ -116,10 +117,10 @@ <el-dialog v-model="dialogAddRecord" title="新增" @close="closeAdd" @open="openAdd"> <el-form :model="addRecord" label-width="120px" ref="addRef" :rules="addRules"> <el-form-item label="作业证编号" prop="workPermitNo"> - <el-input v-model="addRecord.workPermitNo" placeholder="作业编号须为已审批作业的编号,可点击右方按钮查询"> - <template #append> - <el-button :icon="Search" @click="dialogPermitNo = true"/> - </template> + <el-input v-model="addRecord.workPermitNo" placeholder="点击选择已审批作业" @click="dialogPermitNo = true" readonly> +<!-- <template #append>--> +<!-- <el-button :icon="Search" @click="dialogPermitNo = true"/>--> +<!-- </template>--> </el-input> </el-form-item> <el-form-item label="作业类型" prop="workType"> @@ -142,10 +143,10 @@ </el-select> </el-form-item> <el-form-item label="现场照片" prop="imagePaths"> - <el-upload accept="image/*" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :on-remove="handleRemove" :before-remove="beforeRemove" :before-upload="getUploadUrl"> + <el-upload accept="image/*" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :before-remove="beforeRemove" :before-upload="getUploadUrl"> <el-icon><Plus /></el-icon> <template #tip> - <div class="el-upload__tip">上传jpg/png图片尺寸小于500KB,最多可上传3张</div> + <div class="el-upload__tip">上传jpg/png图片尺寸小于2M,最多可上传3张</div> </template> </el-upload> </el-form-item> @@ -163,7 +164,7 @@ <el-dialog v-model="dialogVisible"> <img w-full :src="dialogImageUrl" alt="Preview Image" /> </el-dialog> - <el-dialog v-model="dialogPermitNo" title="选择相应的作业编号"> + <el-dialog v-model="dialogPermitNo" title="选择相应的作业编号" @close="resetForm()"> <permit-no ref="permitNoInfo"></permit-no> <template #footer> <span class="dialog-footer"> @@ -195,7 +196,6 @@ imgLimit: number; fileList: Array<file>, uploadUrl: string, - isOverSize: Boolean, dialogVisible: Boolean, dialogImageUrl: string | null, multipleSelection: Array<any>; @@ -235,7 +235,6 @@ chosenIndex: null, workPermitNo: '', workType: null, - isOverSize: false, fileList: [], imgLimit: 3, uploadUrl: '', @@ -273,7 +272,7 @@ const addRef = ref<FormInstance>(); const addRules = reactive<FormRules>({ - workPermitNo: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workPermitNo: [{ required: true, message: '该内容不能为空', trigger: 'change' }], workType: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], checkContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], checkResult: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], @@ -329,19 +328,17 @@ }; const getUploadUrl = async (rawFile: any) => { - const fileSize = rawFile.size / 1024 < 500 ? '1' : '0' - if(fileSize === '0'){ + // const fileSize = rawFile.size / 1024 < 500 ? '1' : '0' + if(rawFile.size / 1024 / 1024 > 2){ ElMessage({ type: 'warning', - message: '文件大小不能超过500k。' + message: '文件大小不能超过2M。' }); - state.isOverSize = true - return false + return Promise.reject(false) }else{ - const res = await workApplyApi().getUploadUrl(rawFile.name); + const res = await workApplyApi().getUpload9Url(rawFile.name); state.addRecord.imagePaths.push(res.data.data.fileName) state.uploadUrl = res.data.data.uploadUrl; - console.log(state.addRecord.imagePaths,state.uploadUrl,6666666666666) } }; @@ -365,50 +362,40 @@ }; const beforeRemove = (file: {}, fileList: []) => { - const result = new Promise((resolve, reject) => { - if(!state.isOverSize){ - ElMessageBox.confirm('此操作将删除该图片, 是否继续?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }) - .then(() => { - // console.log(state.workDetail.photos,'path') - const list = JSON.parse(JSON.stringify(state.addRecord.imagePaths)) - fileList.map((item,index)=>{ - if(item.uid === file.uid){ - fileList.splice(index,1) - state.addRecord.photos.splice(index,1) - // 请求删除接口 - deletePic(false,list[index]) - } - }) - }) - .catch(() => { - reject(false); - }); - }else{ - const list = JSON.parse(JSON.stringify(state.addRecord.imagePaths)) - fileList.map((item,index)=>{ - if(item.uid === file.uid){ - fileList.splice(index,1) - state.addRecord.photos.splice(index,1) - deletePic(true,list[index]) - } - }) - state.isOverSize = false - } - }); - return result; + if (file && file.status === "success") { + const result = new Promise((resolve, reject) => { + ElMessageBox.confirm('此操作将删除该图片, 是否继续?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }) + .then(() => { + // console.log(state.workDetail.photos,'path') + const list = JSON.parse(JSON.stringify(state.addRecord.imagePaths)) + fileList.map((item, index) => { + if (item.uid === file.uid) { + fileList.splice(index, 1) + state.addRecord.imagePaths.splice(index, 1) + // 请求删除接口 + deletePic(list[index]) + } + }) + }) + .catch(() => { + reject(false); + }); + }); + return result; + } }; // 删除图片接口 - const deletePic = async(isOverSize:boolean,fileName:string)=>{ + const deletePic = async(fileName:string)=>{ const res = await workApplyApi().deleteFile({fileName: fileName}) if (res.data.code === '200') { ElMessage({ - type: isOverSize ? 'error' : 'success', - message: isOverSize ? '上传失败':'删除成功!' + type: 'success', + message: '删除成功!' }); } else { ElMessage({ @@ -463,12 +450,25 @@ if (valid) { await addRecord(state.addRecord); state.dialogAddRecord = false; + state.fileList = [] getListByPage(); } else { console.log('error submit!', fields); } }); }; + + const resetForm = () =>{ + state.addRecord={ + workPermitNo: '', + checkContent: '', + checkResult: '', + info: '', + source: 2, + imagePaths: [] + } + state.fileList = [] + } const handleSizeChange = (val: number) => { state.pageSize = val; @@ -493,6 +493,7 @@ const closeAdd = () => { state.addRecord = {}; state.chosenIndex = null; + resetForm() }; const openAdd = () => { @@ -538,6 +539,7 @@ closeAdd, openAdd, indexClear, + resetForm, ...toRefs(state) }; } diff --git a/src/views/specialWorkSystem/specialIndex/components/videoDetail.vue b/src/views/specialWorkSystem/specialIndex/components/videoDetail.vue index 8c37485..70c4630 100644 --- a/src/views/specialWorkSystem/specialIndex/components/videoDetail.vue +++ b/src/views/specialWorkSystem/specialIndex/components/videoDetail.vue @@ -1,41 +1,46 @@ <template> - <el-dialog v-model="videoDetailDialog" title="动火作业编号00001 实时监测详情" width="80%" center> - <div style="margin-bottom: 20px"> - <el-button type="warning" @click="fillDialog = true">人工录入警报信息</el-button> - </div> + <el-dialog v-model="videoDetailDialog" :title="title" width="80%" center> +<!-- <div style="margin-bottom: 20px">--> +<!-- <el-button type="warning" @click="fillDialog = true">人工录入警报信息</el-button>--> +<!-- </div>--> <div class="info"> -<!-- <video class="video-cont" autoplay src="https://www.bilibili.com/video/BV1UM411s7Ey/?vd_source=7700e61a97bad6ca1f7c0ecb9768d682" controls></video>--> <div class="left-info"> - <iframe class="video-cont" src="http://36.108.169.10:8088/808gps/open/player/video.html?lang=zh&devIdno=21125705363&&account=gtxh&password=000000"></iframe> + <template v-for="item in videoData.approvalDeviceList"> + <iframe class="video-cont" :src="'http://36.108.169.10:8088/808gps/open/player/video.html?lang=zh&devIdno=' + item.deviceNo + '&&account=gtxh&password=000000'"></iframe> + </template> <div class="chart-area"> <div class="chart-item"> <div class="top-tit"> - <div class="tit">基础指标数据(可燃气体浓度、氧气、一氧化碳、硫化氢按需展示):</div> - <el-button type="warning" @click="reportDialog = true">监管异常填报</el-button> + <div class="tit">气体分析数据:</div> +<!-- <el-button type="warning" @click="reportDialog = true">监管异常填报</el-button>--> </div> - <el-table :data="basicData" style="width: 100%" border :header-cell-style="{ background: '#fafafa' }"> - <el-table-column property="type" label="类别" align="center"/> - <el-table-column property="time" label="填报时间" align="center"/> - <el-table-column property="name" label="填报人" align="center"/> - <el-table-column property="number" label="值" align="center"/> - <el-table-column property="isGood" label="是否合格" align="center"> + <el-table :data="videoData.analysisDataList" style="width: 100%" border :header-cell-style="{ background: '#fafafa' }"> + <el-table-column property="type" label="类别" align="center"> <template #default="scope"> - <span>{{scope.row.isGood == 0?'合格':'不合格'}}</span> + {{ gasData.find(i=>i.value == scope.row.type)?.name }} </template> + </el-table-column> + <el-table-column property="analysisTime" label="分析时间" align="center"/> + <el-table-column property="analysisUname" label="分析人" align="center"/> + <el-table-column property="data" label="值" align="center"/> + <el-table-column property="resultDesc" label="是否合格" align="center"> +<!-- <template #default="scope">--> +<!-- <span>{{scope.row.isGood == 0?'合格':'不合格'}}</span>--> +<!-- </template>--> </el-table-column> </el-table> </div> <div class="chart-item"> - <div class="top-tit"><div class="tit">现场检查代码:</div></div> - <el-table :data="checkData" style="width: 100%" border :header-cell-style="{ background: '#fafafa' }"> - <el-table-column property="name" label="现在检查人" align="center"/> - <el-table-column property="time" label="检查填报时间" align="center"/> - <el-table-column property="content" label="检查内容" align="center"/> + <div class="top-tit"><div class="tit">现场检查数据:</div></div> + <el-table :data="videoData.checkList" style="width: 100%" border :header-cell-style="{ background: '#fafafa' }"> + <el-table-column property="operatorUname" label="检查人" align="center"/> + <el-table-column property="operationTime" label="检查填报时间" align="center"/> + <el-table-column property="checkContent" label="检查内容" align="center"/> <el-table-column property="info" label="描述" align="center"/> - <el-table-column property="isGood" label="是否合格" align="center"> - <template #default="scope"> - <span>{{scope.row.isGood == 0?'合格':'不合格'}}</span> - </template> + <el-table-column property="checkContent" label="是否合格" align="center"> +<!-- <template #default="scope">--> +<!-- <span>{{scope.row.isGood == 0?'合格':'不合格'}}</span>--> +<!-- </template>--> </el-table-column> </el-table> </div> @@ -47,33 +52,39 @@ 基础信息 </div> <div class="content"> - <div>作业编号: <span>0000001</span></div> - <div>作业部门: <span>有机化工</span></div> - <div>作业人员: <span>王大壮(持证)</span></div> - <div>开始时间: <span>2023-03-09 14:00:45</span></div> - <div>结束时间: <span>2023-03-09 17:05:45</span></div> - <div class="checkBtn">查看作业票</div> - <div class="checkBtn">查看审批流</div> + <div>作业编号: <span>{{videoData.workPermitNo}}</span></div> + <div>作业部门: <span>{{videoData.workDepName}}</span></div> + <div>作业人员: <span>{{videoData.operatorList.map(i=>i.userName).join(',')}}</span></div> + <div>开始时间: <span>{{videoData.workStartTime}}</span></div> + <div>结束时间: <span>{{videoData.workFinishTime}}</span></div> + <div class="checkBtn" @click="viewTicket(videoData)">查看作业票</div> +<!-- <div class="checkBtn" @click="viewRecord(videoData.workApplyId)">查看记录</div>--> </div> </div> <div class="info-item"> <div class="info-tit"> 警报信息 </div> - <div class="content"> - <div>设备IA自动识别警报: - <div>无</div> + <template v-for="item in videoData.warningList" v-if="videoData.warningList && videoData.warningList.length>0"> + <div class="content" style="padding-bottom: 15px;margin-bottom:10px;border-bottom: 1px solid #ccc"> + <div>执行人: + <span>{{item.operatorUname}}</span> + </div> + <div>警报时间: + <span>{{item.operationTime}}</span> + </div> + <div>警报内容: + <div>{{item.warningContent}}</div> + </div> </div> - <div>人工录入警报信息: - <div>无</div> - </div> - <div>现场检查不合格项: - <div>1、除动火人和监护人有无其他人员在场:有信息化人员在场</div> - </div> + </template> + <div v-else> + 暂无警报信息 </div> </div> </div> </div> + <Work-record ref="recordRef"></Work-record> <el-dialog v-model="fillDialog" title="作业全过程监测风险警报信息发现录入" width="50%" center> <el-form ref="reviewFormRef" :model="reviewForm" :rules="reviewRules" label-width="170px"> <el-form-item label="风险描述:" prop="describe"> @@ -129,76 +140,91 @@ import { Session } from '/@/utils/storage'; import { ElMessage } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus' + import WorkRecord from "/@/views/specialWorkSystem/specialIndex/components/workRecord.vue"; import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; + import axios from "axios"; + import Cookies from "js-cookie"; interface stateType { videoDetailDialog:boolean - basicData: Array<any> - checkData: Array<any> fillDialog: boolean reviewForm: object reportForm: object reportDialog: boolean + videoData:{} + title: string + gasData: Array<any> } export default defineComponent({ name: 'videoDetail', - components: {}, + components: {WorkRecord}, props:[], setup() { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); const state = reactive<stateType>({ videoDetailDialog: false, - basicData:[ - { - type: '可燃气体浓度', - time: '2023-03-20 09:09', - name: '李羽飞(动火分析人)', - number: '3%LEL', - isGood: 0 - }, - { - type: '可燃气体浓度', - time: '2023-03-20 09:09', - name: '李羽飞(动火分析人)', - number: '2.9%LEL', - isGood: 0 - } - ], - checkData:[ - { - name: '杨冬冬', - time: '2023-03-20 09:09', - content: '防火面罩不少于2个', - info: '2个', - isGood: 0 - }, - { - name: '杨冬冬', - time: '2023-03-20 09:09', - content: '电源插座是否防爆', - info: '是', - isGood: 0 - }, - { - name: '杨冬冬', - time: '2023-03-20 09:09', - content: '除动火人和监护人有无其他人员在场', - info: '有信息化人员', - isGood: 1 - } - ], + title: '', + videoData:{}, fillDialog: false, reportDialog: false, reviewForm: {}, - reportForm: {} + reportForm: {}, + gasData: [ + { + name: '有毒有害气体', + value: 1 + }, + { + name: '可燃气体', + value: 2 + }, + { + name: '氧气', + value: 3 + } + ] }) - const openDialog = ()=>{ + const recordRef = ref() + const openDialog = (row)=>{ + state.videoData = row + console.log(state.videoData,'data') + state.title = row.workTypeDesc + '编号' + row.workPermitNo + '实时监测详情' state.videoDetailDialog = true } + + 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 { + ElMessage({ + type: 'warning', + message: '预览失败' + }); + } + }) + } + + const viewRecord = (id: string | null)=>{ + recordRef.value.openDialog(id) + } + return { + recordRef, openDialog, + viewTicket, + viewRecord, ...toRefs(state) }; }, diff --git a/src/views/specialWorkSystem/specialIndex/components/workRecord.vue b/src/views/specialWorkSystem/specialIndex/components/workRecord.vue new file mode 100644 index 0000000..5c9efeb --- /dev/null +++ b/src/views/specialWorkSystem/specialIndex/components/workRecord.vue @@ -0,0 +1,161 @@ +<template> + <el-dialog v-model="dialogVisible" title="作业记录" width="45%" center> +<!-- <el-steps :active="data.length" direction="vertical" finish-status="success">--> +<!-- <el-step v-for="item in data" :title="item.operationTitle" :icon="Edit">--> +<!-- <template #description>--> +<!-- <div>{{item.content}}</div>--> +<!-- <div>{{item.operationUtype}}:{{item.operationUname}}</div>--> +<!-- <div>{{item.operationTime}}</div>--> +<!-- </template>--> +<!-- </el-step>--> +<!-- </el-steps>--> + <div class="item" v-for="(item,index) in data" :key="index"> + <div class="marker"> + <div class="dot"></div> + <div class="line"></div> + </div> + <div class="content"> + <div class="tit">{{item.operationTitle}}<span>{{index == data.length - 1 ? '[进行中]': '[已完成]'}}</span></div> + <div>{{item.operationUtype}}:{{item.operationUname}}</div> + <div>操作时间:{{item.operationTime}}</div> + <div>操作内容:{{item.content}}</div> + <div>操作意见:{{item.approvalOpinions}}</div> + </div> + </div> + </el-dialog> +</template> + +<script lang="ts"> + import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; + import { storeToRefs } from 'pinia'; + import {useUserInfo} from "/@/stores/userInfo"; + import { Search, Edit } from '@element-plus/icons-vue' + import {teamManageApi} from "/@/api/systemManage/basicDateManage/personShiftManage/teamManage"; + import {ElMessage} from "element-plus/es"; + import {specialIndexApi} from "/@/api/specialWorkSystem/specialIndex"; + + + interface stateType { + dialogVisible: boolean + } + export default defineComponent({ + name: 'workRecord', + components: {}, + props:[], + setup() { + const userInfo = useUserInfo() + const { userInfos } = storeToRefs(userInfo); + const state = reactive({ + dialogVisible: false, + data: [] + }) + const openDialog = (id: string | null)=>{ + getWorkRecord(id) + state.dialogVisible = true + } + + const getWorkRecord = async (id: string | null) => { + let res = await specialIndexApi().getWorkRecord({id:id}); + if (res.data.code === '200') { + state.data = res.data.data + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + + return { + openDialog, + ...toRefs(state), + Search, + Edit + }; + }, + }); +</script> + +<style scoped lang="scss"> + .home-container { + height: 100%; + overflow: hidden; + position: relative; + .el-row{ + margin-bottom: 20px; + } + .el-row:last-child { + margin-bottom: 0; + } + .el-input{ + width: 100% !important; + } + .el-date-editor::v-deep{ + width: 100%; + } + .el-select{ + width: 100%; + } + .el-cascader{ + width: 100% !important; + } + .item{ + display: flex; + align-items: flex-start; + width: 100%; + padding-left: 50px; + margin-bottom: 10px; + + .marker{ + display: flex; + flex-direction: column; + align-items: center; + margin-right: 20px; + + .dot{ + width: 28px; + height: 28px; + border-radius: 50%; + margin-bottom: 10px; + background: #13ce66; + } + .line{ + width: 1px; + height: 120px; + background: #13ce66; + } + } + .content{ + div{ + margin-bottom: 6px; + } + .tit{ + line-height: 28px; + font-size: 20px; + font-weight: bolder; + + span{ + display: inline-block; + margin-left: 6px; + font-size: 16px; + color: #13ce66; + line-height: 28px; + } + } + } + &:last-of-type{ + .dot{ + background: #409eff; + } + .line{ + display: none; + } + .tit{ + span{ + color: #409eff; + } + } + } + } + } +</style> diff --git a/src/views/specialWorkSystem/specialIndex/index.vue b/src/views/specialWorkSystem/specialIndex/index.vue index b7dd2da..c93cfb0 100644 --- a/src/views/specialWorkSystem/specialIndex/index.vue +++ b/src/views/specialWorkSystem/specialIndex/index.vue @@ -126,7 +126,7 @@ <el-col :span="5" style="display:flex;align-items: center"> <span style="white-space: nowrap">作业状态:</span> <div class="grid-content topInfo"> - <el-select :teleported="false" v-model="searchParams.workStatus" size="small"> + <el-select :teleported="false" v-model="searchParams.workAllStatus" size="small"> <el-option v-for="item in workStatusList" :key="item.value" @@ -162,56 +162,86 @@ <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="workPermitNo" label="作业证编号" align="center"/> - <el-table-column property="depName" label="部门" align="center"/> - <el-table-column property="applyer" label="申请人" align="center"/> - <el-table-column property="finishUname" label="作业人" align="center"/> + <el-table-column property="workDepName" label="作业单位" align="center"/> + <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="startUname" label="开始人" align="center"> + <template #default="scope"> + <span>{{scope.row.startUname?scope.row.startUname:'--'}}</span> + </template> + </el-table-column> + <el-table-column property="finishUname" label="结束人" align="center"> + <template #default="scope"> + <span>{{scope.row.finishUname?scope.row.finishUname:'--'}}</span> + </template> + </el-table-column> + <el-table-column property="workStartTime" label="作业开始时间" align="center"> + <template #default="scope"> + <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="gmtCreate" label="申请时间" align="center"/> - <el-table-column property="workStartTime" label="作业开始时间" align="center"/> - <el-table-column property="workFinishTime" label="作业结束时间" align="center"/> - <el-table-column property="workStatusDesc" label="作业状态" align="center"/> - <el-table-column property="reason" label="中止原因" align="center"/> - <el-table-column label="安全预警" align="center"> + <el-table-column property="abortReason" label="中止原因" align="center"> <template #default="scope"> - <el-tag>--</el-tag> + <span>{{scope.row.abortReason?scope.row.abortReason:'--'}}</span> </template> </el-table-column> - <el-table-column property="message" label="报警信息" align="center"> - <template #default="scope"> - <el-button type="text" size="small" v-if="scope.row.message == 1">查看</el-button> - <span v-else>无</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> @@ -238,24 +268,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> @@ -269,16 +300,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 { @@ -336,6 +368,7 @@ name: 'specialIndex', components: { VideoDetail, + WorkRecord, 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')), @@ -354,6 +387,7 @@ const slfx = ref("eChartSlfx" + Date.now() + Math.random()) const zyqs = ref("eChartZyqs" + Date.now() + Math.random()) const videoRef = ref(); + const recordRef = ref() const state = reactive<stateType>({ pageIndex: 1, pageSize: 10, @@ -365,9 +399,7 @@ workPermitNo: '', startTime: '', endTime: '', - workStatus: null, - acceptStatus: null, - workAnalysisStatus: null + workAllStatus: null }, dialogReview: false, departmentList: [], @@ -395,83 +427,7 @@ 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: [], @@ -708,7 +664,7 @@ }, series: [ { - name: 'Access From', + name: '', type: 'pie', radius: ['40%', '70%'], avoidLabelOverlap: false, @@ -915,9 +871,7 @@ workPermitNo: '', startTime: '', endTime: '', - workStatus: null, - acceptStatus: null, - workAnalysisStatus: null + workAllStatus: null } state.searchDate = [] getMydepList() @@ -933,7 +887,7 @@ }; // 查看记录 - const viewRecord = (row: any) => { + const viewDetail = (row: any) => { state.dialogType = row.workType state.details = JSON.parse(JSON.stringify(row)); if(state.details.workDetail.otherSpecialWork == '' || !state.details.workDetail.otherSpecialWork){ @@ -972,22 +926,85 @@ 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) => { @@ -1008,6 +1025,7 @@ VideoPlay, reviewFormRef, videoRef, + recordRef, zyfb, slfx, zyqs, @@ -1017,14 +1035,17 @@ changeType2, changeDep3, toFullscreen, - handleReview, + // handleReview, openVideo, - submitReview, + // submitReview, reLoadData, toApply, searchRecord, clearSearch, + viewDetail, viewRecord, + viewTicket, + downLoadTicket, // getListByPage, handleSizeChange, handleCurrentChange, diff --git a/src/views/specialWorkSystem/workTicket/zysq/components/broken.vue b/src/views/specialWorkSystem/workTicket/zysq/components/broken.vue index cd93167..65df3eb 100644 --- a/src/views/specialWorkSystem/workTicket/zysq/components/broken.vue +++ b/src/views/specialWorkSystem/workTicket/zysq/components/broken.vue @@ -120,7 +120,7 @@ <el-row> <el-col :span="24"> <el-form-item label="图片上传" prop="workDetail.bcPath"> - <el-upload accept="image/*" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :on-remove="handleRemove" :before-remove="beforeRemove" :before-upload="getUploadUrl"> + <el-upload accept="image/*" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :before-remove="beforeRemove" :before-upload="getUploadUrl"> <el-icon><Plus /></el-icon> <template #tip> <div class="el-upload__tip">上传jpg/png图片尺寸小于500KB,最多可上传3张</div> diff --git a/src/views/specialWorkSystem/workTicket/zysq/components/ground.vue b/src/views/specialWorkSystem/workTicket/zysq/components/ground.vue index 571313d..6838d8e 100644 --- a/src/views/specialWorkSystem/workTicket/zysq/components/ground.vue +++ b/src/views/specialWorkSystem/workTicket/zysq/components/ground.vue @@ -122,7 +122,7 @@ <el-row> <el-col :span="24"> <el-form-item label="图片上传" prop="workDetail.gbPath"> - <el-upload accept="image/*" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :on-remove="handleRemove" :before-remove="beforeRemove" :before-upload="getUploadUrl"> + <el-upload accept="image/*" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :before-remove="beforeRemove" :before-upload="getUploadUrl"> <el-icon><Plus /></el-icon> <template #tip> <div class="el-upload__tip">上传jpg/png图片尺寸小于500KB,最多可上传3张</div> diff --git a/src/views/specialWorkSystem/workTicket/zysq/components/plate.vue b/src/views/specialWorkSystem/workTicket/zysq/components/plate.vue index 0690aaa..5b57061 100644 --- a/src/views/specialWorkSystem/workTicket/zysq/components/plate.vue +++ b/src/views/specialWorkSystem/workTicket/zysq/components/plate.vue @@ -199,7 +199,7 @@ <el-row> <el-col :span="24"> <el-form-item label="盲板位置图" prop="workDetail.bpLocationMapPath"> - <el-upload accept="image/*" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :on-remove="handleRemove" :before-remove="beforeRemove" :before-upload="getUploadUrl"> + <el-upload accept="image/*" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='imgLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :before-remove="beforeRemove" :before-upload="getUploadUrl"> <el-icon><Plus /></el-icon> <template #tip> <div class="el-upload__tip">上传jpg/png图片尺寸小于500KB,最多可上传3张</div> diff --git a/src/views/system/appVersion/index.vue b/src/views/system/appVersion/index.vue index 656c2d7..c2612f5 100644 --- a/src/views/system/appVersion/index.vue +++ b/src/views/system/appVersion/index.vue @@ -110,7 +110,7 @@ <el-input v-model="addRecord.name"/> </el-form-item> <el-form-item v-if="chosenIndex == null" label="上传文件" prop="objectName"> - <el-upload :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='fileLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" :on-remove="handleRemove" :before-remove="beforeRemove" :before-upload="getUploadUrl"> + <el-upload :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='fileLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" :before-remove="beforeRemove" :before-upload="getUploadUrl"> <el-button type="primary" plain>选择文件</el-button> <template #tip> <div class="el-upload__tip">上传APP源文件</div> @@ -118,7 +118,7 @@ </el-upload> </el-form-item> <el-form-item v-else label="上传文件"> - <el-upload :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='fileLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" :on-remove="handleRemove" :before-remove="beforeRemove" :before-upload="getUploadUrl"> + <el-upload :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='fileLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" :before-remove="beforeRemove" :before-upload="getUploadUrl"> <el-button type="primary" plain>选择文件</el-button> <template #tip> <div class="el-upload__tip">上传新版APP源文件(不上传则默认使用原版本)</div> diff --git a/src/views/system/user/component/ctfDialog.vue b/src/views/system/user/component/ctfDialog.vue new file mode 100644 index 0000000..a8f7f59 --- /dev/null +++ b/src/views/system/user/component/ctfDialog.vue @@ -0,0 +1,355 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowCtfDialog" width="769px" @close="restForm"> + <el-form :model="ctfForm" size="default" ref="ctfRef" :rules="ctfFormRules" label-width="120px"> + <el-row :gutter="35"> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="关联角色" prop="roleId"> + <el-select v-model="ctfForm.roleId" placeholder="请选择" clearable class="w100" :disabled="disabled"> + <el-option v-for="item in roleData" :key="item.roleId" :label="item.roleName" :value="item.roleId"> </el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="证书编号" prop="certNo"> + <el-input v-model.trim="ctfForm.certNo" :disabled="disabled" placeholder="" clearable></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="证书到期时间" prop="certExpiredAt"> + <el-date-picker :disabled="disabled" v-model="ctfForm.certExpiredAt" type="date" placeholder="请选择" class="w100" value-format="YYYY-MM-DD"> </el-date-picker> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="作业类型" prop="workType"> + <el-select v-model="ctfForm.workType" placeholder="请选择作业类型" :disabled="disabled"> + <el-option + v-for="item in workTypeList" + :key="item.id" + :label="item.name" + :value="item.id" + /> + </el-select> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="证书上传" prop="certUrl"> + <el-upload :disabled="disabled" accept="image/*" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='1' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" list-type="picture-card" :before-remove="beforeRemove" :before-upload="getUploadUrl"> + <el-icon><Plus /></el-icon> + <template #tip> + <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div> + </template> + </el-upload> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="isShowCtfDialog = !isShowCtfDialog" size="default">取 消</el-button> + <el-button type="primary" v-throttle @click="onSubmit" size="default" v-if="!disabled">确 定</el-button> + </span> + </template> + <el-dialog v-model="dialogImg"> + <el-image :preview-src-list="[dialogImageUrl]" :src="dialogImageUrl" fit="cover" /> + </el-dialog> + </el-dialog> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import { userApi } from '/@/api/systemManage/user'; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; +import axios from "axios"; +import {useUserInfo} from "/@/stores/userInfo"; + +// 定义接口来定义对象的类型 +interface DeptData {} +interface roleData {} +interface dutyData {} +interface sexData {} +interface type {} +interface CtfState { + title: string; + disabled: boolean; + isShowCtfDialog: boolean; + dialogImg: boolean + ctfForm: { + userCertId?: string + roleId: number| null + certNo: string + certExpiredAt: string + workType: number| null + certUrl: string + uid: string | null + }; + ctfFormRules:{} + dialogImageUrl: string | null + fileList: Array<file> + delList: Array<any> + uploadUrl: string + workTypeList: Array<any> +} +interface file { + url: string; + uid?: string | null + name?: string | null + status?: string | null +} +export default defineComponent({ + name: 'ctf', + props: ['roleData'], + setup(props, context) { + const userInfo = useUserInfo() + const ctfRef = ref() + const state = reactive<CtfState>({ + title: '', + disabled: false, + isShowCtfDialog: false, + dialogImg: false, + ctfForm: { + userCertId: '', + roleId: null, + certNo: '', + certExpiredAt: '', + workType: null, + certUrl: '', + uid: '' + }, + ctfFormRules:{ + roleId: [{ required: true, message: '请选择证书相关角色', trigger: 'blur' }], + certNo: [{ required: true, message: '请输入证书编号', trigger: 'blur' }], + certExpiredAt: [{ required: true, message: '请选择证书到期时间', trigger: 'change' }], + workType: [{ required: true, message: '请选择作业类型', trigger: 'blur' }], + certUrl: [{ required: true, message: '请上传证书', trigger: 'change' }], + }, + dialogImageUrl: null, + fileList: [], + delList: [], + uploadUrl: '', + workTypeList: [ + { id: 1, name: '动火作业' }, + { id: 2, name: '受限空间作业' }, + { id: 3, name: '吊装作业' }, + { id: 4, name: '动土作业' }, + { id: 5, name: '断路作业' }, + { id: 6, name: '高处作业' }, + { id: 7, name: '临时用电作业' }, + { id: 8, name: '盲板抽堵作业' } + ] + }); + + // 打开弹窗 + const openDialog = (type: string, value: any, uid: string) => { + state.isShowCtfDialog = true; + state.fileList = [] + if (type === 'add') { + state.disabled = false + state.title = '新增证书'; + state.ctfForm = { + roleId: null, + certNo: '', + certExpiredAt: '', + workType: null, + certUrl: '', + uid: uid + }; + } else{ + for(let i in value){ + if(isValidKey(i,state.ctfForm)){ + state.ctfForm[i] = value[i] + } + } + state.ctfForm.certExpiredAt = state.ctfForm.certExpiredAt.substring(0,10) + console.log(state.ctfForm.certExpiredAt,'time') + state.ctfForm.userCertId = value.id + state.fileList.push({ + uid: value.id, + name: value.certUrl, + status: 'success', + url: value.certPath + }) + if(type === 'edit'){ + state.disabled = false + state.title = '修改证书'; + console.log(state.ctfForm,'555') + }else{ + state.disabled = true + state.title = '查看'; + state.ctfForm = JSON.parse(JSON.stringify(value)); + } + } + }; + + const isValidKey =(key: string | number | symbol, data:object): key is keyof typeof data => { + return key in data + } + + // 新增修改 + const onSubmit = async () => { + ctfRef.value.validate(async (valid:Boolean) => { + if(valid){ + if (state.title === '新增证书') { + let res = await userApi().addCtf(state.ctfForm); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '证书新增成功', + duration: 2000 + }); + if(state.delList.length>0){ + await deletePic() + } + state.isShowCtfDialog = false; + context.emit('refresh'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } else { + let res = await userApi().modCtf(state.ctfForm); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '证书修改成功', + duration: 2000 + }); + if(state.delList.length>0){ + await deletePic() + } + state.isShowCtfDialog = false; + context.emit('refresh'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + + }; + + // 图片上传 + const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); + } + + const handlePictureCardPreview = (uploadFile: { url: string }) => { + state.dialogImageUrl = uploadFile.url!; + state.dialogImg = true; + }; + + const getUploadUrl = async (rawFile: any) => { + if(rawFile.size / 1024 / 1024 > 5){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过5M。' + }); + return Promise.reject(false) + }else{ + const res = await userApi().getPresignUrl(rawFile.name); + state.ctfForm.certUrl = res.data.data.fileName + state.uploadUrl = res.data.data.uploadUrl; + } + }; + + const upload = async (params: any) => { + let reader = new FileReader(); + reader.readAsArrayBuffer(params.file); + reader.onload = async () => { + axios + .put(state.uploadUrl, reader.result, { + header: { 'Content-Type': 'multipart/form-data' } + }) + .then(() => { + }); + }; + }; + + const beforeRemove = (file: {}, fileList: []) => { + if (file && file.status === "success") { + const result = new Promise((resolve, reject) => { + ElMessageBox.confirm('此操作将删除该图片, 是否继续?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }) + .then(() => { + // console.log(state.workDetail.photos,'path') + state.fileList = [] + fileList = [] + state.delList.push(state.ctfForm.certUrl) + // deletePic(state.ctfForm.certUrl) + state.ctfForm.certUrl = '' + }) + .catch(() => { + reject(false); + }); + }); + return result; + } + } + + // 删除图片接口 + const deletePic = async()=>{ + for(let i of state.delList) { + const res = await workApplyApi().deleteFile({fileName: i}) + if (res.data.code === '200') { + console.log('文件删除成功') + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + } + + const restForm = ()=>{ + state.ctfForm = { + userCertId: '', + roleId: null, + certNo: '', + certExpiredAt: '', + workType: null, + certUrl: '', + uid: '' + } + state.fileList = [] + state.delList = [] + } + + // 页面加载时 + onMounted(() => { + }); + return { + ctfRef, + userInfo, + showTip, + restForm, + openDialog, + onSubmit, + handlePictureCardPreview, + getUploadUrl, + upload, + beforeRemove, + isValidKey, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/system/user/component/dialogCertificate.vue b/src/views/system/user/component/dialogCertificate.vue new file mode 100644 index 0000000..dab9297 --- /dev/null +++ b/src/views/system/user/component/dialogCertificate.vue @@ -0,0 +1,198 @@ +<template> + <el-dialog v-model="dialogCertificate" title="证书管理"> + <el-row> + <el-button type="primary" :icon="Plus" size="default" @click="openEdit('add',{})">新增</el-button> + </el-row> + <el-table + :data="tableData" + highlight-current-row + style="width: 100%;margin-top: 20px" + border + :header-cell-style="{background: '#fafafa'}" + > + <el-table-column type="index" label="序号" width="80"/> + <el-table-column property="id" label="证件Id"/> + <el-table-column property="roleId" label="相关角色"> + <template #default="scope"> + {{ roleList.find(i=>i.roleId == scope.row.roleId)?.roleName }} + </template> + </el-table-column> + <el-table-column property="workTypeDesc" label="作业类型"/> + <el-table-column property="roleCode" label="角色编号"/> + <el-table-column property="certNo" label="证件编号"/> + <el-table-column fixed="right" label="操作" align="center" width="250"> + <template #default="scope"> + <el-button link type="primary" size="small" :icon="View" @click="openEdit('view',scope.row)">查看</el-button> + <el-button link type="primary" size="small" :icon="Edit" @click="openEdit('edit', scope.row)">修改</el-button> + <el-button link type="danger" size="small" :icon="Delete" @click="deleteRecord(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + <ctf-dialog ref="ctfRef" @refresh="getCtf()" :role-data="roleList"></ctf-dialog> + </el-dialog> +</template> + +<script lang="ts"> + import {toRefs, reactive, defineComponent, ref, defineAsyncComponent, onMounted} from 'vue'; + import { storeToRefs } from 'pinia'; + import { initBackEndControlRoutes } from '/@/router/backEnd'; + import {useUserInfo} from "/@/stores/userInfo"; + import { Session } from '/@/utils/storage'; + import { Search, Delete, Edit, View, Plus } from '@element-plus/icons-vue' + import {ElMessage, ElMessageBox, ElTable} from 'element-plus' + import {userApi} from "/@/api/systemManage/user"; + import ctfDialog from "/@/views/system/user/component/ctfDialog.vue"; + import {useRoleApi} from "/@/api/systemManage/role"; + + + interface stateType { + dialogCertificate: boolean + tableData: Array<any> + roleList: Array<any> + uid: number | null + } + export default defineComponent({ + name: 'dialogCertificate', + components: {ctfDialog}, + props:[], + setup() { + const userInfo = useUserInfo() + const { userInfos } = storeToRefs(userInfo); + const state = reactive<stateType>({ + dialogCertificate: false, + tableData: [], + roleList: [], + uid: null + }); + // 页面载入时执行方法 + onMounted(() => { + + }); + const ctfRef = ref() + const openDialog = (value: any) => { + state.dialogCertificate = true + state.uid = value.uid + getRoleData() + getCtf() + } + + const openEdit = (type: string,value: any)=>{ + ctfRef.value.openDialog(type,value,state.uid) + } + + const getRoleData = async () => { + let res = await useRoleApi().getRoleList(); + if (res.data.code === '200') { + state.roleList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + const getCtf = async()=>{ + let res = await userApi().getCtf({uid: state.uid}) + if(res.data.code == 200){ + state.tableData = res.data.data + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + // 删除方法 + const deleteRecord = (data: any) => { + ElMessageBox.confirm(`此操作将永久删除该条证书,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await userApi().delCtf({userCertId: data.id}); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '删除成功!' + }); + await getCtf(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch(() => {}); + } + + // 折线图 + const renderMenu = async (value: string) => { + Session.set('projectId',value) + userInfos.value.projectId = value + await initBackEndControlRoutes(); + }; + return { + renderMenu, + openDialog, + deleteRecord, + openEdit, + getRoleData, + getCtf, + ctfRef, + Search, + Delete, + Edit, + View, + Plus, + ...toRefs(state), + }; + }, + }); +</script> + +<style scoped lang="scss"> + .home-container { + height: 100%; + overflow: hidden; + position: relative; + .homeCard{ + width: 100%; + padding: 0 20px; + box-sizing: border-box; + background: #fff; + border-radius: 4px; + } + .applyBtn{ + width: 100%; + background: #fff; + padding-top: 15px; + z-index: 5; + box-shadow: 0 -3px 8px rgba(150,150,150,.1); + display: flex; + align-items: center; + justify-content: center; + } + .el-row{ + margin-bottom: 20px; + } + .el-row:last-child { + margin-bottom: 0; + } + .el-input{ + width: 100% !important; + } + .el-date-editor::v-deep{ + width: 100%; + } + .el-select{ + width: 100%; + } + .el-cascader{ + width: 100% !important; + } + } +</style> diff --git a/src/views/system/user/component/userDialog.vue b/src/views/system/user/component/userDialog.vue index e978c9d..b377710 100644 --- a/src/views/system/user/component/userDialog.vue +++ b/src/views/system/user/component/userDialog.vue @@ -240,7 +240,8 @@ }); } } else { - let res = await userApi().modUser(state.userForm); + const { roles, positions, ...data} = state.userForm + let res = await userApi().modUser(data); if (res.data.code === '200') { ElMessage({ type: 'success', diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue index 9af926e..9f0672f 100644 --- a/src/views/system/user/index.vue +++ b/src/views/system/user/index.vue @@ -56,10 +56,11 @@ </template> </el-table-column> <el-table-column prop="gmtCreate" label="创建时间" show-overflow-tooltip></el-table-column> - <el-table-column label="操作" width="140"> + <el-table-column label="操作" width="200"> <template #default="scope"> <el-button :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onOpenUserDialog('查看', scope.row)">查看</el-button> <el-button :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onOpenUserDialog('修改', scope.row)">修改</el-button> + <el-button size="small" text type="primary" @click="onCertificate(scope.row)">证书管理</el-button> <el-button style="color: red" :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onRowDel(scope.row)">删除</el-button> </template> </el-table-column> @@ -70,6 +71,7 @@ <br /> </el-card> <userDialog ref="userRef" @getUserList="initUserTableData" /> + <dialog-certificate ref="ctfRef" @getUserList="initUserTableData"></dialog-certificate> </div> </template> @@ -77,6 +79,7 @@ import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue'; import { ElMessageBox, ElMessage } from 'element-plus'; import userDialog from '/@/views/system/user/component/userDialog.vue'; +import dialogCertificate from "/@/views/system/user/component/dialogCertificate.vue"; import { userApi } from '/@/api/systemManage/user'; import { dutyApi } from '/@/api/systemManage/duty'; import { departmentApi } from '/@/api/systemManage/department'; @@ -122,9 +125,10 @@ export default defineComponent({ name: 'systemUser', - components: { userDialog }, + components: { userDialog,dialogCertificate }, setup() { const userRef = ref(); + const ctfRef = ref() const state = reactive<TableDataState>({ userTableData: { data: [], @@ -214,6 +218,10 @@ userRef.value.openDialog(type, value, state.departmentList, state.roleList, state.dutyList); }; + const onCertificate = (value: any)=>{ + ctfRef.value.openDialog(value); + } + // 删除用户 const onRowDel = (row: TableDataRow) => { ElMessageBox.confirm(`此操作将永久删除账户名称:“${row.realName}”,是否继续?`, '提示', { @@ -258,7 +266,9 @@ }); return { userRef, + ctfRef, onOpenUserDialog, + onCertificate, onRowDel, parseNumber, onHandleSizeChange, -- Gitblit v1.9.2