From 01f3e49f3763a25ef67a4c3e5786491703a1aece Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: Thu, 13 Jul 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