From c694cffc8541d921e5256d33e14e3237454de950 Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期五, 26 一月 2024 09:43:31 +0800 Subject: [PATCH] 新提交 --- src/views/dataUpload/educateTrain/educateResource/index.vue | 217 + src/views/dataUpload/saftyBaseInfo/equipInfo/components/addReport.vue | 305 ++ src/views/dataUpload/educateTrain/trainInfo/components/addReport.vue | 196 + src/utils/toolsValidate.ts | 2 src/views/dataUpload/saftyBaseInfo/certInfo/component/certificateMember.vue | 214 + src/api/dataUpload/contractorManage/index.ts | 69 src/assets/excelFiles/missionUpload.xlsx | 0 src/views/dataUpload/saftyBaseInfo/parkingInfo/index.vue | 223 + src/views/intellectInspect/inspectBasic/discriminate/index.vue | 17 src/views/dataUpload/contractorManage/contractorUser/index.vue | 230 + src/api/dataUpload/educateTrain/index.ts | 48 src/views/loginPage/loginPage.vue | 2 src/api/dataUpload/saftyBaseInfo/judgeReport.ts | 153 + src/views/dataUpload/educateTrain/educateResource/components/addReport.vue | 123 src/views/riskWarningSys/warningBigScreen/index.vue | 6 src/views/dataUpload/contractorManage/contractorInfo/components/addReport.vue | 185 + src/layout/navBars/breadcrumb/user.vue | 94 src/utils/request.ts | 2 src/views/dataUpload/saftyBaseInfo/productionInfo/components/addReport.vue | 286 ++ src/views/intellectInspect/inspectTaskManage/inspectTask/components/inspectTaskDialog.vue | 20 src/views/dataUpload/contractorManage/contractorUser/components/addReport.vue | 223 + src/assets/newMenu/card-14.png | 0 src/views/dataUpload/saftyBaseInfo/certInfo/index.vue | 201 + src/views/dataUpload/saftyBaseInfo/certInfo/component/messages.vue | 148 + src/views/dataUpload/peopleLocate/index.vue | 251 + src/assets/excelFiles/pointUpload.xlsx | 0 public/excelFiles/pointUpload.xlsx | 0 src/api/systemManage/user/index.ts | 14 src/views/dataUpload/contractorManage/contractorEnter/components/addReport.vue | 175 + src/views/dataUpload/peopleLocate/components/addReport.vue | 291 ++ src/assets/excelFiles/RFIDUpload.xlsx | 0 src/views/dataUpload/saftyBaseInfo/judgeReport/components/addReport.vue | 199 + src/views/system/personShiftManage/scheduleManage/schedule/index.vue | 1 src/views/intellectInspect/intelligentLine/index.vue | 7 src/views/dataUpload/contractorManage/contractorEnter/index.vue | 219 + src/views/dataUpload/saftyBaseInfo/cardInfo/components/addReport.vue | 172 + src/views/dataUpload/saftyBaseInfo/equipInfo/index.vue | 258 ++ src/views/newHome/index.vue | 31 src/views/newSpecialWorkSystem/workTicket/wdsp/index.vue | 16 src/views/intellectInspect/inspectBasic/facility/components/facilityAreaDialog.vue | 2 src/views/dataUpload/peopleLocate/components/mapLocation.vue | 138 + src/views/intellectInspect/inspectBasic/discriminate/components/RFIDDialog.vue | 12 src/assets/excelFiles/regionUpload.xlsx | 0 src/views/dataUpload/educateTrain/trainInfo/index.vue | 223 + src/views/dataUpload/saftyBaseInfo/cardInfo/index.vue | 219 + src/views/specialWorkSystem/specialIndex/index.vue | 119 src/views/system/menu/index.vue | 1 src/views/system/role/component/roleDialog.vue | 16 public/excelFiles/missionUpload.xlsx | 0 src/views/loginPage/component/accountLogin.vue | 1 src/views/dataUpload/saftyBaseInfo/crowInfo/components/addReport.vue | 205 + src/views/dataUpload/saftyBaseInfo/certInfo/component/certificateDialog.vue | 138 + src/views/intellectInspect/inspectTaskManage/inspectTask/index.vue | 19 src/views/intellectInspect/inspectBasic/inspectPoint/index.vue | 16 src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue | 17 src/views/dataUpload/contractorManage/contractorInfo/index.vue | 226 + src/views/intellectInspect/inspectTaskManage/inspectTask/components/upload.vue | 204 + src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue | 60 src/assets/newMenu/icon14.png | 0 src/views/dataUpload/saftyBaseInfo/productionInfo/index.vue | 270 ++ src/views/system/user/component/userDialog.vue | 14 src/views/dataUpload/saftyBaseInfo/crowInfo/index.vue | 223 + public/excelFiles/RFIDUpload.xlsx | 0 /dev/null | 193 - src/views/system/user/index.vue | 119 src/views/intellectInspect/inspectBasic/facility/index.vue | 16 package.json | 4 src/api/intelligentLine/index.ts | 46 src/views/dataUpload/saftyBaseInfo/parkingInfo/components/addReport.vue | 202 + src/views/dataUpload/saftyBaseInfo/judgeReport/index.vue | 251 + public/excelFiles/regionUpload.xlsx | 0 71 files changed, 7,202 insertions(+), 350 deletions(-) diff --git a/package.json b/package.json index c9b6baa..2b4e09b 100644 --- a/package.json +++ b/package.json @@ -34,10 +34,12 @@ "sortablejs": "^1.15.0", "splitpanes": "^3.1.1", "vue": "^3.2.36", + "vue-baidu-map-3x": "^1.0.35", "vue-clipboard3": "^2.0.0", "vue-grid-layout": "^3.0.0-beta1", "vue-i18n": "^9.1.10", "vue-router": "^4.0.15", + "vuedraggable": "^4.1.0", "wangeditor": "^4.7.15", "xlsx": "^0.18.5" }, @@ -48,7 +50,7 @@ "@types/sortablejs": "^1.13.0", "@typescript-eslint/eslint-plugin": "^5.27.0", "@typescript-eslint/parser": "^5.27.0", - "@vitejs/plugin-vue": "^2.3.3", + "@vitejs/plugin-vue": "^2.3.4", "@vue/compiler-sfc": "^3.2.36", "dotenv": "^16.0.1", "eslint": "^8.17.0", diff --git a/public/excelFiles/RFIDUpload.xlsx b/public/excelFiles/RFIDUpload.xlsx new file mode 100644 index 0000000..ac7d026 --- /dev/null +++ b/public/excelFiles/RFIDUpload.xlsx Binary files differ diff --git a/public/excelFiles/missionUpload.xlsx b/public/excelFiles/missionUpload.xlsx new file mode 100644 index 0000000..f1298af --- /dev/null +++ b/public/excelFiles/missionUpload.xlsx Binary files differ diff --git a/public/excelFiles/pointUpload.xlsx b/public/excelFiles/pointUpload.xlsx new file mode 100644 index 0000000..2d26ce7 --- /dev/null +++ b/public/excelFiles/pointUpload.xlsx Binary files differ diff --git a/public/excelFiles/regionUpload.xlsx b/public/excelFiles/regionUpload.xlsx new file mode 100644 index 0000000..e1f0397 --- /dev/null +++ b/public/excelFiles/regionUpload.xlsx Binary files differ diff --git a/src/api/dataUpload/contractorManage/index.ts b/src/api/dataUpload/contractorManage/index.ts new file mode 100644 index 0000000..62ce95e --- /dev/null +++ b/src/api/dataUpload/contractorManage/index.ts @@ -0,0 +1,69 @@ +import request from '/@/utils/request'; + +export function contractorApi() { + return { + getContractorList: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/contractor/list`, + method: 'post', + data: data + }); + }, + addContractor: (data: Array<any>) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/contractor`, + method: 'post', + data: data + }); + }, + delContractor: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/contractor/del`, + method: 'post', + data: data + }); + }, + getContractorUserList: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/contractor/user/list`, + method: 'post', + data: data + }); + }, + addContractorUser: (data: Array<any>) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/contractor/user`, + method: 'post', + data: data + }); + }, + delContractorUser: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/contractor/user/del`, + method: 'post', + data: data + }); + }, + getContractorEnterList: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/contractor/user/enter/list`, + method: 'post', + data: data + }); + }, + addContractorEnter: (data: Array<any>) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/contractor/user/enter`, + method: 'post', + data: data + }); + }, + delContractorEnter: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/contractor/user/enter/del`, + method: 'post', + data: data + }); + } + }; +} diff --git a/src/api/dataUpload/educateTrain/index.ts b/src/api/dataUpload/educateTrain/index.ts new file mode 100644 index 0000000..02cae8c --- /dev/null +++ b/src/api/dataUpload/educateTrain/index.ts @@ -0,0 +1,48 @@ +import request from '/@/utils/request'; + +export function educateTrainApi() { + return { + getEducateList: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/train/resource/list`, + method: 'post', + data: data + }); + }, + addEducate: (data: Array<any>) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/train/resource`, + method: 'post', + data: data + }); + }, + delEducate: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/train/resource/del`, + method: 'post', + data: data + }); + }, + getTrainList: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/train/info/list`, + method: 'post', + data: data + }); + }, + addTrain: (data: Array<any>) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/train/info`, + method: 'post', + data: data + }); + }, + delTrain: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/train/info/del`, + method: 'post', + data: data + }); + } + }; +} diff --git a/src/api/dataUpload/saftyBaseInfo/judgeReport.ts b/src/api/dataUpload/saftyBaseInfo/judgeReport.ts new file mode 100644 index 0000000..adfbc48 --- /dev/null +++ b/src/api/dataUpload/saftyBaseInfo/judgeReport.ts @@ -0,0 +1,153 @@ +import request from '/@/utils/request'; + +export function judgeReportApi() { + return { + getCardList: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/certificate/list`, + method: 'post', + data: data + }); + }, + addCard: (data: Array<any>) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/certificate`, + method: 'post', + data: data + }); + }, + delCard: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/certificate/del`, + method: 'post', + data: data + }); + }, + getJudgeList: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/assessment/list`, + method: 'post', + data: data + }); + }, + addJudge: (data: Array<any>) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/assessment`, + method: 'post', + data: data + }); + }, + delJudge: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/assessment/del`, + method: 'post', + data: data + }); + }, + getProductList: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/craft/manage/list`, + method: 'post', + data: data + }); + }, + addProduct: (data: Array<any>) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/craft/manage`, + method: 'post', + data: data + }); + }, + delProduct: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/craft/manage/del`, + method: 'post', + data: data + }); + }, + getParkingList: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/start/stop/manage/list`, + method: 'post', + data: data + }); + }, + addParking: (data: Array<any>) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/start/stop/manage`, + method: 'post', + data: data + }); + }, + delParking: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/start/stop/manage/del`, + method: 'post', + data: data + }); + }, + getCrowList: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/person/list`, + method: 'post', + data: data + }); + }, + addCrow: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/person`, + method: 'post', + data: data + }); + }, + delCrow: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/person/del`, + method: 'post', + data: data + }); + }, + getEquipList: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/device/list`, + method: 'post', + data: data + }); + }, + addEquip: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/device`, + method: 'post', + data: data + }); + }, + delEquip: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/device/del`, + method: 'post', + data: data + }); + }, + getPositionList: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/person/position/list`, + method: 'post', + data: data + }); + }, + addPosition: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/person/position`, + method: 'post', + data: data + }); + }, + delPosition: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/report/assemble/person/position/del`, + method: 'post', + data: data + }); + } + }; +} diff --git a/src/api/intelligentLine/index.ts b/src/api/intelligentLine/index.ts index d79e528..d88aeb2 100644 --- a/src/api/intelligentLine/index.ts +++ b/src/api/intelligentLine/index.ts @@ -17,6 +17,50 @@ url: import.meta.env.VITE_API_URL_SOCKET + `/ws/namesrv/get/one?srv=safeplatform-websocket`, method: 'get' }); - } + }, + + uploadMission: (data: object) => { + return request({ + headers: { + "Content-Type": "multipart/form-data", + }, + url: import.meta.env.VITE_API_URL + `/SafeCheckTaskUnit/import`, + method: 'post', + data: data + }); + }, + + uploadRfid: (data: object) => { + return request({ + headers: { + "Content-Type": "multipart/form-data", + }, + url: import.meta.env.VITE_API_URL + `/SafeCheckRfid/import`, + method: 'post', + data: data + }); + }, + + uploadRegion: (data: object) => { + return request({ + headers: { + "Content-Type": "multipart/form-data", + }, + url: import.meta.env.VITE_API_URL + `/safeCheckRegion/import`, + method: 'post', + data: data + }); + }, + + uploadPoint: (data: object) => { + return request({ + headers: { + "Content-Type": "multipart/form-data", + }, + url: import.meta.env.VITE_API_URL + `/safeCheckPoint/import`, + method: 'post', + data: data + }); + }, }; } diff --git a/src/api/systemManage/user/index.ts b/src/api/systemManage/user/index.ts index bc6d4fe..ff9950d 100644 --- a/src/api/systemManage/user/index.ts +++ b/src/api/systemManage/user/index.ts @@ -91,5 +91,19 @@ data: data }); }, + pwdMod: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/auth/pwd-change`, + method: 'post', + data: data + }); + }, + pwdModSelf: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/auth/pwd-change/self`, + method: 'post', + data: data + }); + }, }; } diff --git a/src/assets/excelFiles/RFIDUpload.xlsx b/src/assets/excelFiles/RFIDUpload.xlsx new file mode 100644 index 0000000..ac7d026 --- /dev/null +++ b/src/assets/excelFiles/RFIDUpload.xlsx Binary files differ diff --git a/src/assets/excelFiles/missionUpload.xlsx b/src/assets/excelFiles/missionUpload.xlsx new file mode 100644 index 0000000..f1298af --- /dev/null +++ b/src/assets/excelFiles/missionUpload.xlsx Binary files differ diff --git a/src/assets/excelFiles/pointUpload.xlsx b/src/assets/excelFiles/pointUpload.xlsx new file mode 100644 index 0000000..2d26ce7 --- /dev/null +++ b/src/assets/excelFiles/pointUpload.xlsx Binary files differ diff --git a/src/assets/excelFiles/regionUpload.xlsx b/src/assets/excelFiles/regionUpload.xlsx new file mode 100644 index 0000000..e1f0397 --- /dev/null +++ b/src/assets/excelFiles/regionUpload.xlsx Binary files differ diff --git a/src/assets/newMenu/card-14.png b/src/assets/newMenu/card-14.png new file mode 100644 index 0000000..efd7b7a --- /dev/null +++ b/src/assets/newMenu/card-14.png Binary files differ diff --git a/src/assets/newMenu/icon14.png b/src/assets/newMenu/icon14.png new file mode 100644 index 0000000..2b1a9b5 --- /dev/null +++ b/src/assets/newMenu/icon14.png Binary files differ diff --git a/src/layout/navBars/breadcrumb/user.vue b/src/layout/navBars/breadcrumb/user.vue index 6d8e1e8..70ef2c0 100644 --- a/src/layout/navBars/breadcrumb/user.vue +++ b/src/layout/navBars/breadcrumb/user.vue @@ -66,6 +66,7 @@ <template #dropdown> <el-dropdown-menu> <el-dropdown-item command="/newMenu">{{ $t('message.user.dropdown1') }}</el-dropdown-item> + <el-dropdown-item @click="showPwdDialog = true">修改密码</el-dropdown-item> <!-- <el-dropdown-item command="wareHouse">{{ $t('message.user.dropdown6') }}</el-dropdown-item>--> <!-- <el-dropdown-item command="/personal">{{ $t('message.user.dropdown2') }}</el-dropdown-item>--> <!-- <el-dropdown-item command="/404">{{ $t('message.user.dropdown3') }}</el-dropdown-item>--> @@ -74,6 +75,26 @@ </el-dropdown-menu> </template> </el-dropdown> + <el-dialog title="修改密码" v-model="showPwdDialog" width="500px"> + <el-form :model="pwdForm" size="default" ref="pwdRef" :rules="pwdFormRules" label-width="110px"> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="新密码" prop="newPassword"> + <el-input v-model.trim="pwdForm.newPassword" placeholder="请输入" type="password" show-password> + </el-input> + </el-form-item> + <el-form-item label="确认新密码" prop="rePassword"> + <el-input v-model.trim="pwdForm.rePassword" placeholder="请输入" type="password" show-password> + </el-input> + </el-form-item> + </el-col> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="showPwdDialog = !showPwdDialog" size="default">取 消</el-button> + <el-button type="primary" v-throttle @click="onPwdSubmit" size="default">确 定</el-button> + </span> + </template> + </el-dialog> <Search ref="searchRef" /> </div> </div> @@ -102,6 +123,8 @@ import { dynamicRoutes } from '/@/router/route'; import Cookies from 'js-cookie'; import {useRoutesList} from "/@/stores/routesList"; +import {verifyPwd} from "/@/utils/toolsValidate"; +import {userApi} from "/@/api/systemManage/user"; export default defineComponent({ name: 'layoutBreadcrumbUser', @@ -116,11 +139,42 @@ const { userInfos } = storeToRefs(stores); const { themeConfig } = storeToRefs(storesThemeConfig); const searchRef = ref(); + const pwdRef = ref(); + const validatePwd = (rule: any, value: any, callback: any)=>{ + if(value === ''){ + callback(new Error('请输入密码')) + }else{ + if(!verifyPwd(value)){ + callback(new Error('密码须包含字母、数字、特殊字符,长度在6-16之间')) + }else{ + callback() + } + } + } + const equalToPassword = (rule: any, value: any, callback: any) => { + if(value == ''){ + callback(new Error("请再次确认密码")) + }else if (state.pwdForm.newPassword !== value) { + callback(new Error("两次输入的密码不一致")) + } else { + callback(); + } + }; const state = reactive({ isScreenfull: false, disabledI18n: 'zh-cn', disabledSize: 'large', - systemName: '' + systemName: '', + showPwdDialog: false, + pwdForm: { + uid: Cookies.get('uid'), + newPassword: '', + rePassword: '' + }, + pwdFormRules: { + newPassword: [{ required: true, validator: validatePwd, trigger: 'blur' }], + rePassword: [{ required: true, validator: equalToPassword, trigger: "blur" }] + } }); // 设置分割样式 const layoutUserFlexNum = computed(() => { @@ -131,6 +185,42 @@ else num = ''; return num; }); + + const onPwdSubmit = async () => { + pwdRef.value.validate(async (valid:Boolean) => { + if(valid){ + const {rePassword,...data} = state.pwdForm + let res = await userApi().pwdModSelf(data); + if (res.data.code === '200') { + state.showPwdDialog = false + ElMessage({ + type: 'success', + message: '密码修改成功,请重新登录', + duration: 2000 + }) + setTimeout(()=>{ + useLoginApi() + .signOut() + .then(() => { + Session.clear() + window.location.href = '/' + }) + },2000) + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }else{ + ElMessage({ + type:'warning', + message:'请完善信息' + }) + } + }) + } + // 全屏点击时 const onScreenfullClick = () => { if (!screenfull.isEnabled) { @@ -281,6 +371,8 @@ }); return { userInfos, + pwdRef, + onPwdSubmit, backToMenu, onLayoutSetingClick, onHandleCommandClick, diff --git a/src/utils/request.ts b/src/utils/request.ts index 5fd3013..9647e83 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -9,7 +9,7 @@ // 配置新建一个 axios 实例 const service = axios.create({ // baseURL: import.meta.env.VITE_API_URL as any, - timeout: 50000, + timeout: 500000, headers: { 'Content-Type': 'application/json' } }); diff --git a/src/utils/toolsValidate.ts b/src/utils/toolsValidate.ts index 485fd04..8bc79fd 100644 --- a/src/utils/toolsValidate.ts +++ b/src/utils/toolsValidate.ts @@ -210,7 +210,7 @@ */ export function verifyPhone(val: string) { // false: 手机号码不正确 - if (!/^((12[0-9])|(13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0|1,5-9]))\d{8}$/.test(val)) return false; + if (!/^\d{11}$/.test(val)) return false; // true: 手机号码正确 else return true; } diff --git a/src/views/dataUpload/contractorManage/contractorEnter/components/addReport.vue b/src/views/dataUpload/contractorManage/contractorEnter/components/addReport.vue new file mode 100644 index 0000000..3836d4f --- /dev/null +++ b/src/views/dataUpload/contractorManage/contractorEnter/components/addReport.vue @@ -0,0 +1,175 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowDialog" width="50%"> + <el-form :model="form" size="default" ref="formRef" :rules="rules" 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="userId"> + <el-select v-model="form.userId" filterable placeholder="请选择人员" clearable> + <el-option v-for="(item,index) in userList" :key="index" :label="item.userName" :value="item.uuid"/> + </el-select> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="title == '新增上报'? false : true"> + <el-form-item label="删除状态" prop="deleted"> + <el-radio-group v-model="form.deleted"> + <el-radio label="0">未删除</el-radio> + <el-radio label="1">已删除</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + </el-row> + </el-form> + <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> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import axios from "axios"; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; +import {contractorApi} from "/@/api/dataUpload/contractorManage"; + +// 定义接口来定义对象的类型 +interface DataState { + title: string + isShowDialog: boolean + form: { + uuid: string + companyCode: string + userId: string + userName: string + contractorId: string + contractorName: string + deleted: string + } + rules:{} + contractorList: [] + userList: [] +} + +export default defineComponent({ + name: 'reportDialog', + setup(props, context) { + const formRef = ref() + const state = reactive<DataState>({ + title: '', + isShowDialog: false, + form: { + uuid: '', + companyCode: '652310082', + contractorId: '', + contractorName: '', + userId: '', + userName: '', + deleted: '0' + }, + rules:{ + userId: [{ required: true, message: '请选择人员', trigger: 'blur' }] + }, + contractorList: [], + userList: [] + }) + + // 页面加载时 + onMounted(() => { + + }) + // 打开弹窗 + const open = (type: string, data: object) => { + state.isShowDialog = true + getDataList() + getUserList() + if (type === 'add') { + state.title = '新增上报'; + state.form = { + uuid: '', + companyCode: '652310082', + contractorId: '', + contractorName: '', + userId: '', + userName: '', + deleted: '0' + } + }else{ + state.title = '重新上报'; + state.form = { + uuid: data.uuid, + companyCode: '652310082', + contractorId: '', + contractorName: '', + userId: '', + userName: '', + deleted: '0' + } + } + }; + + // 新增修改 + const onSubmit = async () => { + formRef.value.validate(async (valid:Boolean) => { + if(valid){ + state.form.contractorId = state.userList.find(i=>i.uuid == state.form.userId)?.contractorId + state.form.contractorName = state.contractorList.find(i=>i.uuid == state.form.contractorId)?.contractorName + const res = await contractorApi().addContractorEnter([state.form]) + if(res.data.code == 200){ + ElMessage({ + type:'success', + message:'数据上报成功' + }) + state.isShowDialog = false + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + context.emit('refresh'); + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + } + + const getDataList = async ()=>{ + const res = await contractorApi().getContractorList({searchParams: {}, pageIndex: 1, pageSize: 999}) + if(res.data.code == 200){ + state.contractorList = res.data.data + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + const getUserList = async ()=>{ + const res = await contractorApi().getContractorUserList({searchParams: {}, pageIndex: 1, pageSize: 999}) + if(res.data.code == 200){ + state.userList = res.data.data + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + return { + formRef, + open, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/dataUpload/contractorManage/contractorEnter/index.vue b/src/views/dataUpload/contractorManage/contractorEnter/index.vue new file mode 100644 index 0000000..da0eaf2 --- /dev/null +++ b/src/views/dataUpload/contractorManage/contractorEnter/index.vue @@ -0,0 +1,219 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <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="openDialog('add',{})">新增</el-button> + </el-col> + </el-row> + <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column> + <el-table-column prop="createDate" label="上报时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="companyCode" label="企业编码" show-overflow-tooltip></el-table-column> + <el-table-column prop="contractorId" label="承包商Id" show-overflow-tooltip></el-table-column> + <el-table-column prop="createBy" label="创建人" show-overflow-tooltip></el-table-column> + <el-table-column prop="createDate" label="创建时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="updateBy" label="最新修改人" show-overflow-tooltip></el-table-column> + <el-table-column prop="updateDate" label="修改时间" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> + <el-button size="small" text type="primary" @click="openDialog('update',scope.row)">重新上报</el-button> + <el-button style="color: red" 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="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> + </div> + </div> + </div> + </div> + <add-report ref="reportRef" @refresh="getData"></add-report> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue' +import { ElMessageBox, ElMessage } from 'element-plus' +import { Plus } from '@element-plus/icons-vue' +import addReport from "./components/addReport.vue" +import {contractorApi} from "/@/api/dataUpload/contractorManage"; +interface TableDataState { + reportData: [], + listQuery: { + searchParams: {} + pageIndex: number + pageSize: number + } + total: null | number +} + +export default defineComponent({ + name: 'contractorEnter', + components: {addReport }, + setup() { + const reportRef= ref(); + const state = reactive<TableDataState>({ + reportData: [], + listQuery: { + searchParams: {}, + pageIndex: 1, + pageSize: 10 + }, + total: null + }); + + // 页面加载时 + onMounted(() => { + getData() + }); + + const getData = async ()=>{ + const res = await contractorApi().getContractorEnterList(state.listQuery) + if(res.data.code == 200){ + state.reportData = res.data.data + state.total = res.data.total + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + const openDialog=(type:string,data:object)=>{ + reportRef.value.open(type,data) + } + + // 删除用户 + const onRowDel = (row: Object) => { + ElMessageBox.confirm(`此操作将永久删除该条数据,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + const res = await contractorApi().delContractorEnter({ids: [row.id]}) + if(res.data.code == 200){ + ElMessage({ + type: 'success', + message: '删除成功' + }) + await getData() + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + getData() + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + getData() + }; + + return { + reportRef, + openDialog, + getData, + onRowDel, + onHandleSizeChange, + 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/dataUpload/contractorManage/contractorInfo/components/addReport.vue b/src/views/dataUpload/contractorManage/contractorInfo/components/addReport.vue new file mode 100644 index 0000000..96ebef1 --- /dev/null +++ b/src/views/dataUpload/contractorManage/contractorInfo/components/addReport.vue @@ -0,0 +1,185 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowDialog" width="50%"> + <el-form :model="form" size="default" ref="formRef" :rules="rules" 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="contractorName"> + <el-input v-model.trim="form.contractorName" 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="contractorNumber"> + <el-input v-model.trim="form.contractorNumber" 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="contractorPerson"> + <el-input v-model.trim="form.contractorPerson" 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="contractorState"> + <el-select v-model="form.contractorState" placeholder="请选择合作状态"> + <el-option :key="1" label="合作中" :value="1"/> + <el-option :key="2" label="曾合作" :value="2"/> + <el-option :key="3" label="不合作" :value="3"/> + </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="contractorType"> + <el-input v-model.trim="form.contractorType" 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="createBy">--> +<!-- <el-input v-model.trim="form.createBy" 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="updateBy">--> +<!-- <el-input v-model.trim="form.updateBy" placeholder="修改人姓名" clearable></el-input>--> +<!-- </el-form-item>--> +<!-- </el-col>--> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="title == '新增上报'? false : true"> + <el-form-item label="删除状态" prop="deleted"> + <el-radio-group v-model="form.deleted"> + <el-radio label="0">未删除</el-radio> + <el-radio label="1">已删除</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + </el-row> + </el-form> + <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> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import axios from "axios"; +import {contractorApi} from "/@/api/dataUpload/contractorManage"; + +// 定义接口来定义对象的类型 +interface DataState { + title: string + isShowDialog: boolean + form: { + uuid: string + companyCode: string + contractorName: string + contractorNumber: string + contractorPerson: string + contractorState: null | number + contractorType: string + deleted: string + // createBy: string + // updateBy: string + } + rules:{} +} + +export default defineComponent({ + name: 'reportDialog', + setup(props, context) { + const formRef = ref() + const state = reactive<DataState>({ + title: '', + isShowDialog: false, + form: { + uuid: '', + companyCode: '652310082', + contractorName: '', + contractorNumber: '', + contractorPerson: '', + contractorState: null, + contractorType: '', + deleted: '0' + }, + rules:{ + contractorName: [{ required: true, message: '请填写承包商名称', trigger: 'blur' }], + contractorNumber: [{ required: true, message: '请填写承包商统一信用码', trigger: 'blur' }], + contractorPerson: [{ required: true, message: '请填写承包商法人', trigger: 'blur' }], + contractorState: [{ required: true, message: '请选择合作状态', trigger: 'blur' }], + contractorType: [{ required: true, message: '请填写承包商类型', trigger: 'blur' }] + } + }) + + // 页面加载时 + onMounted(() => { + + }) + // 打开弹窗 + const open = (type: string, data: object) => { + state.isShowDialog = true; + if (type === 'add') { + state.title = '新增上报'; + state.form = { + uuid: '', + companyCode: '652310082', + contractorName: '', + contractorNumber: '', + contractorPerson: '', + contractorState: null, + contractorType: '', + deleted: '0' + } + }else{ + state.title = '重新上报'; + state.form = { + uuid: data.uuid, + companyCode: '652310082', + contractorName: '', + contractorNumber: '', + contractorPerson: '', + contractorState: null, + contractorType: '', + deleted: '0' + } + } + }; + + // 新增修改 + const onSubmit = async () => { + formRef.value.validate(async (valid:Boolean) => { + if(valid){ + const res = await contractorApi().addContractor([state.form]) + if(res.data.code == 200){ + ElMessage({ + type:'success', + message:'数据上报成功' + }) + state.isShowDialog = false + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + context.emit('refresh'); + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + } + + return { + formRef, + open, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/dataUpload/contractorManage/contractorInfo/index.vue b/src/views/dataUpload/contractorManage/contractorInfo/index.vue new file mode 100644 index 0000000..383b64f --- /dev/null +++ b/src/views/dataUpload/contractorManage/contractorInfo/index.vue @@ -0,0 +1,226 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <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="openDialog('add',{})">新增</el-button> + </el-col> + </el-row> + <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column> +<!-- <el-table-column prop="createDate" label="上报时间" show-overflow-tooltip></el-table-column>--> + <el-table-column prop="contractorName" label="承包商名称" show-overflow-tooltip></el-table-column> + <el-table-column prop="contractorNumber" label="承包商统一信用码" show-overflow-tooltip></el-table-column> + <el-table-column prop="contractorPerson" label="承包商法人" show-overflow-tooltip></el-table-column> + <el-table-column prop="contractorState" label="合作状态" show-overflow-tooltip> + <template #default="scope"> + {{scope.row.contractorState == 1?'合作中':scope.row.contractorState == 2?'曾合作':'不合作'}} + </template> + </el-table-column> + <el-table-column prop="contractorType" label="承包商类型" show-overflow-tooltip></el-table-column> + <el-table-column prop="createBy" label="创建人姓名" show-overflow-tooltip></el-table-column> + <el-table-column prop="createTime" label="创建时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="updateBy" label="最新修改人" show-overflow-tooltip></el-table-column> + <el-table-column prop="updateTime" label="修改时间" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> + <el-button size="small" text type="primary" @click="openDialog('update',scope.row)">重新上报</el-button> + <el-button style="color: red" 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="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> + </div> + </div> + </div> + </div> + <add-report ref="reportRef" @refresh="getData"></add-report> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue' +import { ElMessageBox, ElMessage } from 'element-plus' +import { Plus } from '@element-plus/icons-vue' +import addReport from "./components/addReport.vue" +import {contractorApi} from "/@/api/dataUpload/contractorManage"; +interface TableDataState { + reportData: [], + listQuery: { + searchParams: {} + pageIndex: number + pageSize: number + } + total: null | number +} + +export default defineComponent({ + name: 'contractorInfo', + components: {addReport }, + setup() { + const reportRef= ref(); + const state = reactive<TableDataState>({ + reportData: [], + listQuery: { + searchParams: {}, + pageIndex: 1, + pageSize: 10 + }, + total: null + }); + + // 页面加载时 + onMounted(() => { + getData() + }); + + const getData = async ()=>{ + const res = await contractorApi().getContractorList(state.listQuery) + if(res.data.code == 200){ + state.reportData = res.data.data + state.total = res.data.total + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + const openDialog=(type:string,data:object)=>{ + reportRef.value.open(type,data) + } + + // 删除用户 + const onRowDel = (row: Object) => { + ElMessageBox.confirm(`此操作将永久删除:“${row.contractorName}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + const res = await contractorApi().delContractor({ids: [row.id]}) + if(res.data.code == 200){ + ElMessage({ + type: 'success', + message: '删除成功' + }) + await getData() + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + getData() + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + getData() + }; + + return { + reportRef, + openDialog, + getData, + onRowDel, + onHandleSizeChange, + 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/dataUpload/contractorManage/contractorUser/components/addReport.vue b/src/views/dataUpload/contractorManage/contractorUser/components/addReport.vue new file mode 100644 index 0000000..c1b5173 --- /dev/null +++ b/src/views/dataUpload/contractorManage/contractorUser/components/addReport.vue @@ -0,0 +1,223 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowDialog" width="50%"> + <el-form :model="form" size="default" ref="formRef" :rules="rules" 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="cardNumber"> + <el-input v-model.trim="form.cardNumber" 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="contractorId"> + <el-select v-model="form.contractorId" filterable placeholder="请选择承包商" clearable> + <el-option v-for="(item,index) in contractorList" :key="index" :label="item.contractorName" :value="item.uuid"/> + </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="phone"> + <el-input v-model.trim="form.phone" 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="post"> + <el-input v-model.trim="form.post" 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="projectName"> + <el-input v-model.trim="form.projectName" 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="sex"> + <el-radio-group v-model="form.sex"> + <el-radio label="男">男</el-radio> + <el-radio label="女">女</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="用户姓名" prop="userName"> + <el-input v-model.trim="form.userName" 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="userState"> + <el-radio-group v-model="form.userState"> + <el-radio :label="1">正常</el-radio> + <el-radio :label="0">不合格</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="title == '新增上报'? false : true"> + <el-form-item label="删除状态" prop="deleted"> + <el-radio-group v-model="form.deleted"> + <el-radio label="0">未删除</el-radio> + <el-radio label="1">已删除</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + </el-row> + </el-form> + <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> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import axios from "axios"; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; +import {contractorApi} from "/@/api/dataUpload/contractorManage"; + +// 定义接口来定义对象的类型 +interface DataState { + title: string + isShowDialog: boolean + form: { + uuid: string + cardNumber: string + companyCode: string + contractorId: string + phone: string + post: string + projectName: string + sex: string + userName: string + userState: null | number + deleted: string + } + rules:{}, + contractorList: [] +} + +export default defineComponent({ + name: 'reportDialog', + setup(props, context) { + const formRef = ref() + const state = reactive<DataState>({ + title: '', + isShowDialog: false, + form: { + uuid: '', + cardNumber: '', + companyCode: '652310082', + contractorId: '', + phone: '', + post: '', + projectName: '', + sex: '', + userName: '', + userState: null, + deleted: '0' + }, + rules:{ + cardNumber: [{ required: true, message: '请填写身份证号', trigger: 'blur' }], + contractorId: [{ required: true, message: '请选择承包商', trigger: 'blur' }], + phone: [{ required: true, message: '请填写电话', trigger: 'blur' }], + post: [{ required: true, message: '请填写岗位', trigger: 'blur' }], + projectName: [{ required: true, message: '请填写项目名', trigger: 'blur' }], + sex: [{ required: true, message: '请选择性别', trigger: 'blur' }], + userName: [{ required: true, message: '请填写用户姓名', trigger: 'blur' }], + userState: [{ required: true, message: '请选择用户状态', trigger: 'blur' }] + }, + contractorList: [] + }) + + // 页面加载时 + onMounted(() => { + + }) + // 打开弹窗 + const open = (type: string, data: object) => { + state.isShowDialog = true + getDataList() + if (type === 'add') { + state.title = '新增上报'; + state.form = { + uuid: '', + cardNumber: '', + companyCode: '652310082', + contractorId: '', + phone: '', + post: '', + projectName: '', + sex: '', + userName: '', + userState: null, + deleted: '0' + } + }else{ + state.title = '重新上报'; + state.form = { + uuid: data.uuid, + cardNumber: '', + companyCode: '652310082', + contractorId: '', + phone: '', + post: '', + projectName: '', + sex: '', + userName: '', + userState: null, + deleted: '0' + } + } + }; + + // 新增修改 + const onSubmit = async () => { + formRef.value.validate(async (valid:Boolean) => { + if(valid){ + const res = await contractorApi().addContractorUser([state.form]) + if(res.data.code == 200){ + ElMessage({ + type:'success', + message:'数据上报成功' + }) + state.isShowDialog = false + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + context.emit('refresh') + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + } + + const getDataList = async ()=>{ + const res = await contractorApi().getContractorList({searchParams: {}, pageIndex: 1, pageSize: 999}) + if(res.data.code == 200){ + state.contractorList = res.data.data + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + return { + formRef, + open, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/dataUpload/contractorManage/contractorUser/index.vue b/src/views/dataUpload/contractorManage/contractorUser/index.vue new file mode 100644 index 0000000..c9ea573 --- /dev/null +++ b/src/views/dataUpload/contractorManage/contractorUser/index.vue @@ -0,0 +1,230 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <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="openDialog('add',{})">新增</el-button> + </el-col> + </el-row> + <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column> + <el-table-column prop="createDate" label="上报时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="cardNumber" label="身份证号" show-overflow-tooltip></el-table-column> + <el-table-column prop="companyCode" label="企业编码" show-overflow-tooltip></el-table-column> + <el-table-column prop="contractorId" label="承包商Id" show-overflow-tooltip></el-table-column> + <el-table-column prop="createBy" label="创建人" show-overflow-tooltip></el-table-column> + <el-table-column prop="createDate" label="创建时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="phone" label="电话" show-overflow-tooltip></el-table-column> + <el-table-column prop="post" label="岗位" show-overflow-tooltip></el-table-column> + <el-table-column prop="projectName" label="项目名" show-overflow-tooltip></el-table-column> + <el-table-column prop="sex" label="性别" show-overflow-tooltip></el-table-column> + <el-table-column prop="userName" label="用户姓名" show-overflow-tooltip></el-table-column> + <el-table-column prop="userState" label="用户状态" show-overflow-tooltip> + <template #default="scope"> + {{scope.row.userState == 1? '正常': scope.row.userState == 0? '不合格': ''}} + </template> + </el-table-column> + <el-table-column prop="updateBy" label="最新修改人" show-overflow-tooltip></el-table-column> + <el-table-column prop="updateDate" label="修改时间" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> + <el-button size="small" text type="primary" @click="openDialog('update',scope.row)">重新上报</el-button> + <el-button style="color: red" 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="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> + </div> + </div> + </div> + </div> + <add-report ref="reportRef" @refresh="getData"></add-report> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue' +import { ElMessageBox, ElMessage } from 'element-plus' +import { Plus } from '@element-plus/icons-vue' +import addReport from "./components/addReport.vue" +import {contractorApi} from "/@/api/dataUpload/contractorManage"; +interface TableDataState { + reportData: [], + listQuery: { + searchParams: {} + pageIndex: number + pageSize: number + } + total: null | number +} + +export default defineComponent({ + name: 'contractorUser', + components: {addReport }, + setup() { + const reportRef= ref(); + const state = reactive<TableDataState>({ + reportData: [], + listQuery: { + searchParams: {}, + pageIndex: 1, + pageSize: 10 + }, + total: null + }); + + // 页面加载时 + onMounted(() => { + getData() + }); + + const getData = async ()=>{ + const res = await contractorApi().getContractorUserList(state.listQuery) + if(res.data.code == 200){ + state.reportData = res.data.data + state.total = res.data.total + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + const openDialog=(type:string,data:object)=>{ + reportRef.value.open(type,data) + } + + // 删除用户 + const onRowDel = (row: Object) => { + ElMessageBox.confirm(`此操作将永久删除该条数据,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + const res = await contractorApi().delContractorUser({ids: [row.id]}) + if(res.data.code == 200){ + ElMessage({ + type: 'success', + message: '删除成功' + }) + await getData() + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + getData() + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + getData() + }; + + return { + reportRef, + openDialog, + getData, + onRowDel, + onHandleSizeChange, + 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/dataUpload/educateTrain/educateResource/components/addReport.vue b/src/views/dataUpload/educateTrain/educateResource/components/addReport.vue new file mode 100644 index 0000000..1c28d83 --- /dev/null +++ b/src/views/dataUpload/educateTrain/educateResource/components/addReport.vue @@ -0,0 +1,123 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowDialog" width="50%"> + <el-form :model="form" size="default" ref="formRef" :rules="rules" 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="courseNum"> + <el-input v-model.trim.number="form.courseNum" placeholder="课程数量" type="number" 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="coursewareNum"> + <el-input v-model.trim.number="form.coursewareNum" placeholder="课件数量" type="number" 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="questionsNum"> + <el-input v-model.trim.number="form.questionsNum" placeholder="试题数量" type="number" clearable></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <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> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import axios from "axios"; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; +import {educateTrainApi} from "/@/api/dataUpload/educateTrain"; + +// 定义接口来定义对象的类型 +interface DataState { + title: string + isShowDialog: boolean + form: { + courseNum: number | null + coursewareNum: number | null + questionsNum: number | null + } + rules:{} +} + +export default defineComponent({ + name: 'reportDialog', + setup(props, context) { + const formRef = ref() + const state = reactive<DataState>({ + title: '', + isShowDialog: false, + form: { + courseNum: null, + coursewareNum: null, + questionsNum: null + }, + rules:{ + courseNum: [{ required: true, message: '请填写课程数量', trigger: 'blur' }], + coursewareNum: [{ required: true, message: '请填写课件数量', trigger: 'blur' }], + questionsNum: [{ required: true, message: '请填写试题数量', trigger: 'blur' }] + } + }) + + // 页面加载时 + onMounted(() => { + + }) + // 打开弹窗 + const open = (type: string, data: object) => { + state.isShowDialog = true; + if (type === 'add') { + state.title = '新增上报'; + state.form = { + courseNum: null, + coursewareNum: null, + questionsNum: null + } + } + }; + + // 新增修改 + const onSubmit = async () => { + formRef.value.validate(async (valid:Boolean) => { + if(valid){ + const res = await educateTrainApi().addEducate([state.form]) + if(res.data.code == 200){ + ElMessage({ + type:'success', + message:'数据上报成功' + }) + state.isShowDialog = false + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + context.emit('refresh'); + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + } + + return { + formRef, + open, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/dataUpload/educateTrain/educateResource/index.vue b/src/views/dataUpload/educateTrain/educateResource/index.vue new file mode 100644 index 0000000..1726c8d --- /dev/null +++ b/src/views/dataUpload/educateTrain/educateResource/index.vue @@ -0,0 +1,217 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <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="openDialog('add',{})">新增</el-button> + </el-col> + </el-row> + <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column> + <el-table-column prop="createDate" label="创建时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="courseNum" label="课程数量" show-overflow-tooltip></el-table-column> + <el-table-column prop="coursewareNum" label="课件数量" show-overflow-tooltip></el-table-column> + <el-table-column prop="questionsNum" label="试题数量" show-overflow-tooltip></el-table-column> + <el-table-column prop="updateDate" label="修改时间" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> +<!-- <el-button size="small" text type="primary" @click="openDialog('update',scope.row)">重新上报</el-button>--> + <el-button style="color: red" 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="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> + </div> + </div> + </div> + </div> + <add-report ref="reportRef" @refresh="getData"></add-report> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue' +import { ElMessageBox, ElMessage } from 'element-plus' +import { Plus } from '@element-plus/icons-vue' +import addReport from "./components/addReport.vue" +import {educateTrainApi} from "/@/api/dataUpload/educateTrain"; +interface TableDataState { + reportData: [], + listQuery: { + searchParams: {} + pageIndex: number + pageSize: number + } + total: null | number +} + +export default defineComponent({ + name: 'educateResource', + components: {addReport }, + setup() { + const reportRef= ref(); + const state = reactive<TableDataState>({ + reportData: [], + listQuery: { + searchParams: {}, + pageIndex: 1, + pageSize: 10 + }, + total: null + }); + + // 页面加载时 + onMounted(() => { + getData() + }); + + const getData = async ()=>{ + const res = await educateTrainApi().getEducateList(state.listQuery) + if(res.data.code == 200){ + state.reportData = res.data.data + state.total = res.data.total + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + const openDialog=(type:string,data:object)=>{ + reportRef.value.open(type,data) + } + + // 删除用户 + const onRowDel = (row: Object) => { + ElMessageBox.confirm(`此操作将永久删除该记录,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + const res = await educateTrainApi().delEducate({ids: [row.id]}) + if(res.data.code == 200){ + ElMessage({ + type: 'success', + message: '删除成功' + }) + await getData() + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + getData() + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + getData() + }; + + return { + reportRef, + openDialog, + getData, + onRowDel, + onHandleSizeChange, + 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/dataUpload/educateTrain/trainInfo/components/addReport.vue b/src/views/dataUpload/educateTrain/trainInfo/components/addReport.vue new file mode 100644 index 0000000..a4b9934 --- /dev/null +++ b/src/views/dataUpload/educateTrain/trainInfo/components/addReport.vue @@ -0,0 +1,196 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowDialog" width="50%"> + <el-form :model="form" size="default" ref="formRef" :rules="rules" 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="examJoinRate"> + <el-input v-model.trim="form.examJoinRate" placeholder="考试参与率" type="number" clearable> + <template #append>%</template> + </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="examPassRate"> + <el-input v-model.trim="form.examPassRate" placeholder="考试合格率" type="number" clearable> + <template #append>%</template> + </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="missExam"> + <el-input v-model.trim="form.missExam" placeholder="缺考总数" type="number" 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="repairNum"> + <el-input v-model.trim="form.repairNum" placeholder="待补课总数" type="number" 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="studyAverage"> + <el-input v-model.trim="form.studyAverage" placeholder="人均学时" type="number" 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="studyQualifyRate"> + <el-input v-model.trim="form.studyQualifyRate" placeholder="学时达标率" type="number" clearable> + <template #append>%</template> + </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="trainPerson"> + <el-input v-model.trim.number="form.trainPerson" placeholder="培训人数" type="number" 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="trainJoinRate"> + <el-input v-model.trim="form.trainJoinRate" placeholder="培训参与率" type="number" clearable> + <template #append>%</template> + </el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <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> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import axios from "axios"; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; +import {educateTrainApi} from "/@/api/dataUpload/educateTrain"; + +// 定义接口来定义对象的类型 +interface DataState { + title: string + isShowDialog: boolean + form: { + examJoinRate: string + examPassRate: string + missExam: string + rankWeek: string + repairNum: string + studyAverage: string + studyQualifyRate: string + trainPerson: null | number + trainJoinRate: string + } + rules:{} +} + +export default defineComponent({ + name: 'reportDialog', + setup(props, context) { + const formRef = ref() + const state = reactive<DataState>({ + title: '', + isShowDialog: false, + form: { + examJoinRate: '', + examPassRate: '', + missExam: '', + rankWeek: '', + repairNum: '', + studyAverage: '', + studyQualifyRate: '', + trainPerson: null, + trainJoinRate: '' + }, + rules:{ + examJoinRate: [{ required: true, message: '请填写考试参与率', trigger: 'blur' }], + examPassRate: [{ required: true, message: '请填写考试合格率', trigger: 'blur' }], + missExam: [{ required: true, message: '请填写缺考总数', trigger: 'blur' }], + repairNum: [{ required: true, message: '请填写待补课总数', trigger: 'blur' }], + studyAverage: [{ required: true, message: '请填写人均学时', trigger: 'blur' }], + studyQualifyRate: [{ required: true, message: '请填写学时达标率', trigger: 'blur' }], + trainPerson: [{ required: true, message: '请填写培训人数', trigger: 'blur' }], + trainJoinRate: [{ required: true, message: '请填写培训参与率', trigger: 'blur' }] + } + }) + + // 页面加载时 + onMounted(() => { + + }) + // 打开弹窗 + const open = (type: string, data: object) => { + state.isShowDialog = true; + if (type === 'add') { + state.title = '新增上报'; + state.form = { + examJoinRate: '', + examPassRate: '', + missExam: '', + rankWeek: getWeekNumber(), + repairNum: '', + studyAverage: '', + studyQualifyRate: '', + trainPerson: null, + trainJoinRate: '' + }; + } + }; + + // 新增修改 + const onSubmit = async () => { + formRef.value.validate(async (valid:Boolean) => { + if(valid){ + const res = await educateTrainApi().addTrain([state.form]) + if(res.data.code == 200){ + ElMessage({ + type:'success', + message:'数据上报成功' + }) + state.isShowDialog = false + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + context.emit('refresh'); + + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + } + + function getWeekNumber() { + // 获取当前日期 + const today = new Date(); + + // 获取当前年的第一天 + const firstDayOfYear = new Date(today.getFullYear(), 0, 1); + + // 计算当前日期与第一天之间的时间差(毫秒) + const timeDiff = today - firstDayOfYear; + + // 计算经过的天数,并将其转换为周数 + const weekNumber = Math.ceil((timeDiff / (24 * 60 * 60 * 1000) + 1) / 7); + + return weekNumber.toString() + } + + return { + formRef, + open, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/dataUpload/educateTrain/trainInfo/index.vue b/src/views/dataUpload/educateTrain/trainInfo/index.vue new file mode 100644 index 0000000..df68588 --- /dev/null +++ b/src/views/dataUpload/educateTrain/trainInfo/index.vue @@ -0,0 +1,223 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <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="openDialog('add',{})">新增</el-button> + </el-col> + </el-row> + <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column> + <el-table-column prop="createDate" label="上报时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="examJoinRate" label="考试参与率" show-overflow-tooltip></el-table-column> + <el-table-column prop="examPassRate" label="考试合格率" show-overflow-tooltip></el-table-column> + <el-table-column prop="missExam" label="缺考总数" show-overflow-tooltip></el-table-column> + <el-table-column prop="rankWeek" label="第几周" show-overflow-tooltip></el-table-column> + <el-table-column prop="repairNum" label="待补课总数" show-overflow-tooltip></el-table-column> + <el-table-column prop="studyAverage" label="人均学时" show-overflow-tooltip></el-table-column> + <el-table-column prop="studyQualifyRate" label="学时达标率" show-overflow-tooltip></el-table-column> + <el-table-column prop="trainPerson" label="培训人数" show-overflow-tooltip></el-table-column> + <el-table-column prop="trainJoinRate" label="培训参与率" show-overflow-tooltip></el-table-column> + <el-table-column prop="updateDate" label="修改时间" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> +<!-- <el-button size="small" text type="primary" @click="openDialog('update',scope.row)">重新上报</el-button>--> + <el-button style="color: red" 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="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> + </div> + </div> + </div> + </div> + <add-report ref="reportRef" @refresh="getData"></add-report> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue' +import { ElMessageBox, ElMessage } from 'element-plus' +import { Plus } from '@element-plus/icons-vue' +import addReport from "./components/addReport.vue" +import {educateTrainApi} from "/@/api/dataUpload/educateTrain"; +interface TableDataState { + reportData: [], + listQuery: { + searchParams: {} + pageIndex: number + pageSize: number + } + total: null | number +} + +export default defineComponent({ + name: 'trainInfo', + components: {addReport }, + setup() { + const reportRef= ref(); + const state = reactive<TableDataState>({ + reportData: [], + listQuery: { + searchParams: {}, + pageIndex: 1, + pageSize: 10 + }, + total: null + }); + + // 页面加载时 + onMounted(() => { + getData() + }); + + const getData = async ()=>{ + const res = await educateTrainApi().getTrainList(state.listQuery) + if(res.data.code == 200){ + state.reportData = res.data.data + state.total = res.data.total + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + const openDialog=(type:string,data:object)=>{ + reportRef.value.open(type,data) + } + + // 删除用户 + const onRowDel = (row: Object) => { + ElMessageBox.confirm(`此操作将永久删除该记录,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + const res = await educateTrainApi().delTrain({ids: [row.id]}) + if(res.data.code == 200){ + ElMessage({ + type: 'success', + message: '删除成功' + }) + await getData() + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + getData() + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + getData() + }; + + return { + reportRef, + openDialog, + getData, + onRowDel, + onHandleSizeChange, + 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/dataUpload/peopleLocate/components/addReport.vue b/src/views/dataUpload/peopleLocate/components/addReport.vue new file mode 100644 index 0000000..4eb5c4c --- /dev/null +++ b/src/views/dataUpload/peopleLocate/components/addReport.vue @@ -0,0 +1,291 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowDialog" width="50%"> + <el-form :model="form" size="default" ref="formRef" :rules="rules" 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="serialNumber"> + <el-input v-model.trim="form.serialNumber" 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="cardNo"> + <el-input v-model.trim="form.cardNo" 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="realName"> + <el-input v-model.trim="form.realName" 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="alarmStatus"> + <el-radio-group v-model="form.alarmStatus"> + <el-radio label="1">报警</el-radio> + <el-radio label="2">已处理</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="报警时间" prop="alarmTime"> + <el-date-picker v-model="form.alarmTime" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="选择报警时间" style="width: 100%" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="报警信息" prop="alarmInfo"> + <el-input v-model.trim="form.alarmInfo" :autosize="{ minRows: 1 }" type="textarea" 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="alarmType"> + <el-select v-model="form.alarmType" placeholder="请选择报警类型"> + <el-option v-for="(item,index) in alarmTypeList" :key="index" :label="item.name" :value="item.value"/> + </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="alarmLocation"> + <el-input v-model.trim="form.alarmLocation" :autosize="{ minRows: 1 }" type="textarea" 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=""> + <el-button type="primary" v-throttle @click="showMapLocation" size="default">获取经纬度</el-button> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="经度"> + <el-input v-model.trim="form.longitude" 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="纬度"> + <el-input v-model.trim="form.latitude" 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="floorNo"> + <el-input v-model.trim="form.floorNo" placeholder="楼层号" clearable></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="form.alarmStatus == '2'"> + <el-form-item label="销警时间" prop="handleTime"> + <el-date-picker v-model="form.handleTime" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="选择销警时间" style="width: 100%" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="form.alarmStatus == '1'"> + <el-form-item label="销警时间"> + <el-date-picker v-model="form.handleTime" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="选择销警时间" style="width: 100%" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="form.alarmStatus == '2'"> + <el-form-item label="处理信息" prop="handleInfo"> + <el-input v-model.trim="form.handleInfo" :autosize="{ minRows: 1 }" type="textarea" placeholder="处理信息" clearable></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="form.alarmStatus == '1'"> + <el-form-item label="处理信息"> + <el-input v-model.trim="form.handleInfo" :autosize="{ minRows: 1 }" type="textarea" 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="跳转地址"> + <el-input v-model.trim="form.thirdAddress" :autosize="{ minRows: 1 }" type="textarea" placeholder="跳转地址" clearable></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <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> + <mapLocation ref="mapLocation" @giveLatLng="achieveLatLng"></mapLocation> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import axios from "axios"; +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; +import mapLocation from "./mapLocation.vue" + +// 定义接口来定义对象的类型 +interface DataState { + title: string + isShowDialog: boolean + form: { + uuid: string + serialNumber: string + cardNo: string + realName: string + alarmStatus: string + alarmTime: string + alarmInfo: string + alarmType: string + alarmLocation: string + longitude: string + latitude: string + floorNo: string + handleTime: string + handleInfo: string + thirdAddress: string + } + rules:{} + alarmTypeList: Array<alarmType> +} + +interface alarmType { + value: string + name: string +} + +export default defineComponent({ + name: 'reportDialog', + components: {mapLocation }, + setup(props, context) { + const formRef = ref() + const mapLocation = ref() + const state = reactive<DataState>({ + title: '', + isShowDialog: false, + form: { + uuid: '', + serialNumber: '', + cardNo: '', + realName: '', + alarmStatus: '', + alarmTime: '', + alarmInfo: '', + alarmType: '', + alarmLocation: '', + longitude: '', + latitude: '', + floorNo: '', + handleTime: '', + handleInfo: '', + thirdAddress: 'http://124.88.37.66:8081/location_system_5.4.9/map3d/index.html' + }, + rules:{ + serialNumber: [{ required: true, message: '请填写序号', trigger: 'blur' }], + cardNo: [{ required: true, message: '请填写卡号', trigger: 'blur' }], + realName: [{ required: true, message: '请填写报警人员名称', trigger: 'blur' }], + alarmStatus: [{ required: true, message: '请选择报警状态', trigger: 'blur' }], + alarmTime: [{ required: true, message: '请选择报警时间', trigger: 'blur' }], + alarmInfo: [{ required: true, message: '请填写报警信息', trigger: 'blur' }], + alarmType: [{ required: true, message: '请选择报警类型', trigger: 'blur' }], + alarmLocation: [{ required: true, message: '请填写报警位置', trigger: 'blur' }], + floorNo: [{ required: true, message: '请填写楼层号', trigger: 'blur' }], + handleTime: [{ required: true, message: '请选择销警时间', trigger: 'blur' }], + handleInfo: [{ required: true, message: '请填写处理信息', trigger: 'blur' }] + }, + alarmTypeList: [ + {value: '01', name: '一键求救报警'}, + {value: '02', name: '滞留预警'}, + {value: '03', name: '越界报警'}, + {value: '04', name: '超员预警'}, + {value: '05', name: '缺员预警'}, + {value: '06', name: '静止预警'}, + {value: '07', name: '作业人员离开报警'}, + {value: '08', name: '非作业人员闯入报警'} + ] + }) + + // 页面加载时 + onMounted(() => { + + }) + // 打开弹窗 + const open = (type: string, data: object) => { + state.isShowDialog = true; + if (type === 'add') { + state.title = '新增上报'; + state.form = { + uuid: '', + serialNumber: '', + cardNo: '', + realName: '', + alarmStatus: '', + alarmTime: '', + alarmInfo: '', + alarmType: '', + alarmLocation: '', + longitude: '', + latitude: '', + floorNo: '', + handleTime: '', + handleInfo: '', + thirdAddress: 'http://124.88.37.66:8081/location_system_5.4.9/map3d/index.html' + } + }else{ + state.title = '重新上报'; + state.form = { + uuid: data.uuid, + serialNumber: '', + cardNo: '', + realName: '', + alarmStatus: '', + alarmTime: '', + alarmInfo: '', + alarmType: '', + alarmLocation: '', + longitude: '', + latitude: '', + floorNo: '', + handleTime: '', + handleInfo: '', + thirdAddress: 'http://124.88.37.66:8081/location_system_5.4.9/map3d/index.html' + } + } + }; + + // 新增修改 + const onSubmit = async () => { + formRef.value.validate(async (valid:Boolean) => { + if(valid){ + const res = await judgeReportApi().addPosition([state.form]) + if(res.data.code == '200'){ + ElMessage({ + type:'success', + message:'数据上报成功' + }) + state.isShowDialog = false + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + context.emit('refresh'); + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + } + const showMapLocation=()=>{ + mapLocation.value.openMapLocation(state.form.longitude,state.form.latitude) + } + + const achieveLatLng=(lng: string,lat: string)=>{ + state.form.longitude = lng + state.form.latitude = lat + } + + return { + formRef, + mapLocation, + open, + onSubmit, + showMapLocation, + achieveLatLng, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/dataUpload/peopleLocate/components/mapLocation.vue b/src/views/dataUpload/peopleLocate/components/mapLocation.vue new file mode 100644 index 0000000..e1e24fc --- /dev/null +++ b/src/views/dataUpload/peopleLocate/components/mapLocation.vue @@ -0,0 +1,138 @@ +<template> + <el-dialog + v-model="mapLocationVisible" + append-to-body + :close-on-click-modal="false" + width="75%" + :title="title" + > + <div class="mapLocation_head"> + <div> + <el-alert + title="点击地点获取经纬度信息" + type="info" + :closable="false" + > + </el-alert> + </div> + <div class="mapLocation_latlng"> + <span>经度:</span> + <el-input class="mapLocation_latlng_input" id="lng" v-model="longitude"></el-input> + </div> + <div class="mapLocation_latlng"> + <span>纬度:</span> + <el-input class="mapLocation_latlng_input" id="lat" v-model="latitude"></el-input> + </div> + </div> + <div class="mapLocation_body"> + <baidu-map class="map" ak="BkZdiHBj9aGrMdVFM48r2njNiMzsekga" v="3.0" type="API" :center="center" :zoom="15" scroll-wheel-zoom @ready="initMap" @click="getPosition"> + <bm-marker :position="{lng: longitude, lat: latitude}" :dragging="true" animation="BMAP_ANIMATION_BOUNCE"> + <bm-label content="选择地点" :labelStyle="{color: 'red', fontSize : '24px'}" :offset="{width: -35, height: 30}"/> + </bm-marker> + </baidu-map> + </div> + <div align="right" style="margin-top: 10px"> + <el-button @click="mapLocationVisible = false">取消</el-button> + <el-button type="primary" @click="submitLatLng()">确认</el-button> + </div> + </el-dialog> +</template> + +<script lang="ts"> +import {ref, onMounted, reactive, toRefs, defineComponent} from 'vue'; +import { BaiduMap,BmMarker } from 'vue-baidu-map-3x' +interface DataState{ + title: string + longitude: string + latitude: string + mapLocationVisible: boolean + center: { + + } +} +export default defineComponent({ + name: "mapLocation", + components: {BaiduMap,BmMarker}, + setup(props,context) { + const state = reactive<DataState>({ + title: '', + longitude: '', + latitude: '', + mapLocationVisible: false, + center: { + lng: '116.404', + lat: '39.915' + } + }) + + + + onMounted(() => { + // ...(mounted钩子中的代码不变) + }); + const map = reactive({}) + + const getPosition = ({type, target, point, pixel, overlay})=>{ + state.longitude = point.lng + state.latitude = point.lat + } + + const openMapLocation=(longitude:string,latitude:string)=>{ + state.longitude = longitude + state.latitude = latitude + state.mapLocationVisible = true + } + + const submitLatLng=()=>{ + state.mapLocationVisible = false + context.emit('giveLatLng',state.longitude,state.latitude); + } + + const initMap=()=>{ + + } + + return { + map, + getPosition, + submitLatLng, + initMap, + openMapLocation, + ...toRefs(state) + }; + } +}) +</script> + +<style lang="scss" scoped> +.map { + width: 100%; + height: 500px; + + :deep(.BMap_cpyCtrl){ + display: none!important; + visibility: hidden!important; + } + + :deep(.anchorBL) { + display: none!important; + visibility: hidden!important; + } +} +.mapLocation_head{ + width:100%; + height:100px; +} +.mapLocation_body{ + width:100%; + height:500px +} +.mapLocation_latlng{ + padding-top:10px; + display:inline-block; + margin-right: 20px; +} +.mapLocation_latlng_input{ + width:250px; +} +</style> diff --git a/src/views/dataUpload/peopleLocate/index.vue b/src/views/dataUpload/peopleLocate/index.vue new file mode 100644 index 0000000..661b838 --- /dev/null +++ b/src/views/dataUpload/peopleLocate/index.vue @@ -0,0 +1,251 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <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="openDialog('add',{})">新增</el-button> + </el-col> + </el-row> + <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column> + <el-table-column prop="createTime" label="上报时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="cardNo" label="卡号" show-overflow-tooltip></el-table-column> + <el-table-column prop="realName" label="报警人员名称" show-overflow-tooltip></el-table-column> + <el-table-column prop="alarmStatus" label="报警状态" show-overflow-tooltip> + <template #default="scope"> + {{scope.row.alarmStatus == '1'?'报警':scope.row.alarmStatus == '2'?'报警已处理':'--'}} + </template> + </el-table-column> + <el-table-column prop="alarmTime" label="报警时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="alarmInfo" label="报警信息" show-overflow-tooltip></el-table-column> + <el-table-column prop="alarmType" label="报警类型" show-overflow-tooltip> + <template #default="scope"> + {{getAlarmType(scope.row.alarmType)}} + </template> + </el-table-column> + <el-table-column prop="alarmLocation" label="报警位置" show-overflow-tooltip></el-table-column> + <el-table-column prop="longitude" label="经度" show-overflow-tooltip></el-table-column> + <el-table-column prop="latitude" label="纬度" show-overflow-tooltip></el-table-column> + <el-table-column prop="floorNo" label="楼层号" show-overflow-tooltip></el-table-column> + <el-table-column prop="handleTime" label="销警时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="handleInfo" label="处理信息" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> + <el-button size="small" text type="primary" @click="openDialog('update',scope.row)">重新上报</el-button> + <el-button style="color: red" 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="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> + </div> + </div> + </div> + </div> + <add-report ref="reportRef" @refresh="getData"></add-report> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue' +import { ElMessageBox, ElMessage } from 'element-plus' +import { Plus } from '@element-plus/icons-vue' +import addReport from "./components/addReport.vue" +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; +interface TableDataState { + reportData: [], + listQuery: { + searchParams: {} + pageIndex: number + pageSize: number + } + total: null | number + alarmTypeList: Array<alarmType> +} +interface alarmType { + value: string + name: string +} +export default defineComponent({ + name: 'contractorInfo', + components: {addReport }, + setup() { + const reportRef= ref(); + const state = reactive<TableDataState>({ + reportData: [], + listQuery: { + searchParams: {}, + pageIndex: 1, + pageSize: 10 + }, + total: null, + alarmTypeList: [ + {value: '01', name: '一键求救报警'}, + {value: '02', name: '滞留预警'}, + {value: '03', name: '越界报警'}, + {value: '04', name: '超员预警'}, + {value: '05', name: '缺员预警'}, + {value: '06', name: '静止预警'}, + {value: '07', name: '作业人员离开报警'}, + {value: '08', name: '非作业人员闯入报警'} + ] + }); + + // 页面加载时 + onMounted(() => { + getData() + }); + + const getData = async ()=>{ + const res = await judgeReportApi().getPositionList(state.listQuery) + if(res.data.code == 200){ + state.reportData = res.data.data + state.total = res.data.total + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + const openDialog=(type:string,data:object)=>{ + reportRef.value.open(type,data) + } + + // 删除用户 + const onRowDel = (row: Object) => { + ElMessageBox.confirm(`此操作将永久删除该条数据,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + const res = await judgeReportApi().delPosition({ids: [row.id]}) + if(res.data.code == 200){ + ElMessage({ + type: 'success', + message: '删除成功' + }) + await getData() + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + getData() + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + getData() + }; + + const getAlarmType = (type: string)=>{ + return state.alarmTypeList.find(i=>i.value == type)?.name + } + return { + reportRef, + getAlarmType, + openDialog, + getData, + onRowDel, + onHandleSizeChange, + 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/dataUpload/saftyBaseInfo/cardInfo/components/addReport.vue b/src/views/dataUpload/saftyBaseInfo/cardInfo/components/addReport.vue new file mode 100644 index 0000000..900f4e9 --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/cardInfo/components/addReport.vue @@ -0,0 +1,172 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowDialog" width="50%"> + <el-form :model="form" size="default" ref="formRef" :rules="rules" 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="name"> + <el-input v-model.trim="form.name" 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="cateName"> + <el-input v-model.trim="form.cateName" 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="orgName"> + <el-input v-model.trim="form.orgName" 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="发证日期"> + <el-date-picker v-model="form.pusTime" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="选择发证日期" style="width: 100%" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="有效期至"> + <el-date-picker v-model="form.effectiveTime" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="选择有效期至" style="width: 100%" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="到期提醒时间"> + <el-date-picker v-model="form.dueTime" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="选择到期提醒时间" style="width: 100%" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="提醒人" prop="notifyUser"> + <el-input v-model.trim="form.notifyUser" placeholder="提醒人" clearable></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <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> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import axios from "axios"; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; + +// 定义接口来定义对象的类型 +interface DataState { + title: string + isShowDialog: boolean + form: { + uuid: string + name: string + cateName: string + orgName: string + pusTime: string + effectiveTime: string + dueTime: string + notifyUser: string + } + rules:{} +} + +export default defineComponent({ + name: 'reportDialog', + setup(props, context) { + const formRef = ref() + const state = reactive<DataState>({ + title: '', + isShowDialog: false, + form: { + uuid:'', + name: '', + cateName: '', + orgName: '', + pusTime: '', + effectiveTime: '', + dueTime: '', + notifyUser: '' + }, + rules:{ + name: [{ required: true, message: '请填写证书名称', trigger: 'blur' }], + cateName: [{ required: true, message: '请填写分类名称', trigger: 'blur' }], + orgName: [{ required: true, message: '请填写发证机构', trigger: 'blur' }], + notifyUser: [{ required: true, message: '请填写提醒人', trigger: 'blur' }] + } + }) + + // 页面加载时 + onMounted(() => { + + }) + // 打开弹窗 + const open = (type: string, data: object) => { + state.isShowDialog = true; + if (type === 'add') { + state.title = '新增上报'; + state.form = { + uuid:'', + name: '', + cateName: '', + orgName: '', + pusTime: '', + effectiveTime: '', + dueTime: '', + notifyUser: '' + } + }else{ + state.title = '重新上报'; + state.form = { + uuid: data.uuid, + name: '', + cateName: '', + orgName: '', + pusTime: '', + effectiveTime: '', + dueTime: '', + notifyUser: '' + } + } + }; + + // 新增修改 + const onSubmit = async () => { + formRef.value.validate(async (valid:Boolean) => { + if(valid){ + const res = await judgeReportApi().addCard([state.form]) + if(res.data.code == 200){ + ElMessage({ + type:'success', + message:'数据上报成功' + }) + state.isShowDialog = false + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + context.emit('refresh') + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + } + + + return { + formRef, + open, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/dataUpload/saftyBaseInfo/cardInfo/index.vue b/src/views/dataUpload/saftyBaseInfo/cardInfo/index.vue new file mode 100644 index 0000000..be7b1e6 --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/cardInfo/index.vue @@ -0,0 +1,219 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <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="openDialog('add',{})">新增</el-button> + </el-col> + </el-row> + <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column> + <el-table-column prop="name" label="证书名称" show-overflow-tooltip></el-table-column> + <el-table-column prop="cateName" label="分类名称" show-overflow-tooltip></el-table-column> + <el-table-column prop="orgName" label="发证机构" show-overflow-tooltip></el-table-column> + <el-table-column prop="pusTime" label="发证日期" show-overflow-tooltip></el-table-column> + <el-table-column prop="effectiveTime" label="有效期至" show-overflow-tooltip></el-table-column> + <el-table-column prop="dueTime" label="到期提醒时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="notifyUser" label="提醒人" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> + <el-button size="small" text type="primary" @click="openDialog('update',scope.row)">重新上报</el-button> + <el-button style="color: red" 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="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> + </div> + </div> + </div> + </div> + <add-report ref="reportRef" @refresh="getData"></add-report> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue' +import { ElMessageBox, ElMessage } from 'element-plus' +import { Plus } from '@element-plus/icons-vue' +import addReport from "./components/addReport.vue" +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; +interface TableDataState { + reportData: [], + listQuery: { + searchParams: {} + pageIndex: number + pageSize: number + } + total: null | number +} + +export default defineComponent({ + name: 'cardInfo', + components: {addReport }, + setup() { + const reportRef= ref(); + const state = reactive<TableDataState>({ + reportData: [], + listQuery: { + searchParams: {}, + pageIndex: 1, + pageSize: 10 + }, + total: null + }); + + // 页面加载时 + onMounted(() => { + getData() + }); + + const getData = async ()=>{ + const res = await judgeReportApi().getCardList(state.listQuery) + if(res.data.code == 200){ + state.reportData = res.data.data + state.total = res.data.total + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + const openDialog=(type:string,data:object)=>{ + reportRef.value.open(type,data) + } + + // 删除用户 + const onRowDel = (row: Object) => { + ElMessageBox.confirm(`此操作将永久删除:“${row.name}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + const res = await judgeReportApi().delCard({ids: [row.id]}) + if(res.data.code == 200){ + ElMessage({ + type: 'success', + message: '删除成功' + }) + await getData() + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + getData() + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + getData() + }; + + return { + reportRef, + openDialog, + getData, + onRowDel, + onHandleSizeChange, + 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/dataUpload/saftyBaseInfo/certInfo/component/certificateDialog.vue b/src/views/dataUpload/saftyBaseInfo/certInfo/component/certificateDialog.vue new file mode 100644 index 0000000..8a7cfcd --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/certInfo/component/certificateDialog.vue @@ -0,0 +1,138 @@ +<template> + <div class="system-add-role-container"> + <el-dialog :title="title" v-model="isShowDialog" width="769px"> + <el-form :model="roleForm" size="default" label-width="90px"> + <el-row :gutter="35"> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="证书名称"> + <el-input v-model="roleForm.name" placeholder="请输入证书名称" clearable style="width: 100%"></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="isShowDialog = !isShowDialog" size="default">取 消</el-button> + <el-button type="primary" @click="onSubmit" v-throttle size="default">{{ buttonName }}</el-button> + </span> + </template> + </el-dialog> + </div> +</template> + +<script lang="ts"> +import { ElMessage } from 'element-plus'; +import { reactive, toRefs, defineComponent } from 'vue'; +import {certApi} from "/@/api/systemManage/certificate"; + +// 定义接口来定义对象的类型 +interface MenuDataTree { + id: number; + label: string; + children?: MenuDataTree[]; +} +interface RoleState { + title: string; + buttonName: string; + isShowDialog: boolean; + roleForm: { + id: null | number + name: string; + }; + menuData: Array<MenuDataTree>; + menuProps: { + children: string; + label: string; + }; +} + +export default defineComponent({ + name: 'certificateDialog', + setup(prop, context) { + const state = reactive<RoleState>({ + isShowDialog: false, + title: '', + buttonName: '', + roleForm: { + id: null, + name: '', // 证书名称 + }, + menuData: [], + menuProps: { + children: 'children', + label: 'label' + } + }); + // 打开弹窗 + const openDialog = (type: string, value: any) => { + state.isShowDialog = true; + if (type === '新增') { + state.title = '新增证书'; + state.buttonName = '新增'; + state.roleForm = { + id: null, + name: '' + }; + } else { + state.title = '修改证书'; + state.buttonName = '修改'; + state.roleForm.id = JSON.parse(JSON.stringify(value)).id + state.roleForm.name = JSON.parse(JSON.stringify(value)).name + } + }; + // 新增 + const onSubmit = async () => { + if (state.title === '新增证书') { + let res = await certApi().addCerttype({name: state.roleForm.name}); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '证书新增成功', + duration: 2000 + }); + state.isShowDialog = false; + context.emit('refreshCertList'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } else { + let res = await certApi().modCerttype(state.roleForm); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '证书修改成功', + duration: 2000 + }); + state.isShowDialog = false; + context.emit('refreshCertList'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + }; + // 获取菜单结构数据 + return { + onSubmit, + openDialog, + ...toRefs(state) + }; + } +}); +</script> + +<style scoped lang="scss"> +.system-add-role-container { + .menu-data-tree { + width: 100%; + border: 1px solid var(--el-border-color); + border-radius: var(--el-input-border-radius, var(--el-border-radius-base)); + padding: 5px; + } +} +</style> diff --git a/src/views/dataUpload/saftyBaseInfo/certInfo/component/certificateMember.vue b/src/views/dataUpload/saftyBaseInfo/certInfo/component/certificateMember.vue new file mode 100644 index 0000000..33e53c4 --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/certInfo/component/certificateMember.vue @@ -0,0 +1,214 @@ +<template> + <el-dialog v-model="dialogCertificate" :title="title"> + <div class="system-user-search mb15"> + <el-input size="default" v-model.trim="listQuery.searchParams.userName" placeholder="请输入用户名" style="max-width: 180px"> </el-input> + <el-button size="default" type="primary" class="ml10" @click="handleSearch"> + <el-icon> + <ele-Search /> + </el-icon> + 查询 + </el-button> + </div> + <el-table + :data="tableData" + highlight-current-row + style="width: 100%;margin-top: 20px" + border + :header-cell-style="{background: '#fafafa'}" + > + <el-table-column property="userName" label="姓名"/> + <el-table-column property="depName" label="所属部门"/> + <el-table-column property="certTypeName" label="证书类型"/> + <el-table-column property="certExpiredAt" label="到期时间"/> + </el-table> + <br /> + <el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" class="page-position" :pager-count="5" :page-sizes="[10]" v-model:current-page="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> + <br /> + <br /> + </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 {certApi} from "/@/api/systemManage/certificate"; + + + interface stateType { + title: string + dialogCertificate: boolean + tableData: Array<any> + listQuery: { + pageIndex: number + pageSize: number + searchParams: { + userName: string + certTypeId: number | null + } + } + total: number | null + } + export default defineComponent({ + name: 'certificateMember', + components: {}, + props:[], + setup() { + const userInfo = useUserInfo() + const { userInfos } = storeToRefs(userInfo); + const state = reactive<stateType>({ + title: '', + dialogCertificate: false, + tableData: [], + total: null, + listQuery: { + pageIndex: 1, + pageSize: 10, + searchParams: { + userName:'', + certTypeId: null + } + } + }); + // 页面载入时执行方法 + onMounted(() => { + + }); + const ctfRef = ref() + const openDialog = (type:string,value: any) => { + state.tableData = [] + state.total = null + state.listQuery.searchParams.certTypeId = value.id + state.dialogCertificate = true + if(type == '人员'){ + state.title = '证书人员' + getUserData() + }else{ + state.title = '证书即将到期' + getUnvalidData() + } + } + + const getUserData = async () => { + let res = await certApi().getCertUsers(state.listQuery); + if (res.data.code === '200') { + state.tableData = res.data.data + state.total = res.data.total + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + + const getUnvalidData = async () => { + let res = await certApi().getCertUnvalid(state.listQuery); + if (res.data.code === '200') { + state.tableData = res.data.data + state.total = res.data.total + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + + + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + if(state.title == '证书人员'){ + getUserData(); + }else{ + getUnvalidData() + } + } + + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + if(state.title == '证书人员'){ + getUserData(); + }else{ + getUnvalidData() + } + } + + const handleSearch = () => { + state.listQuery.pageIndex = 1 + if(state.title == '证书人员'){ + getUserData(); + }else{ + getUnvalidData() + } + } + + const renderMenu = async (value: string) => { + Session.set('projectId',value) + userInfos.value.projectId = value + await initBackEndControlRoutes(); + }; + return { + renderMenu, + openDialog, + ctfRef, + Search, + Delete, + Edit, + View, + Plus, + onHandleSizeChange, + onHandleCurrentChange, + handleSearch, + ...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/dataUpload/saftyBaseInfo/certInfo/component/messages.vue b/src/views/dataUpload/saftyBaseInfo/certInfo/component/messages.vue new file mode 100644 index 0000000..3db6d1a --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/certInfo/component/messages.vue @@ -0,0 +1,148 @@ +<template> + <el-dialog v-model="dialogMes" :title="title"> + <el-table + :data="tableData" + highlight-current-row + style="width: 100%;margin-top: 20px" + border + :header-cell-style="{background: '#fafafa'}" + > + <el-table-column property="id" label="发送时间"/> + <el-table-column property="roleId" label="预警信息内容"/> + <el-table-column property="workTypeDesc" label="预警级别"/> + <el-table-column property="roleId" label="接收人"> + <template #default="scope"> + {{ roleList.find(i=>i.roleId == scope.row.roleId)?.roleName }} + </template> + </el-table-column> + </el-table> + </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"; + + + interface stateType { + title: string + dialogMes: boolean + tableData: Array<any> + roleList: Array<any> + uid: number | null + } + export default defineComponent({ + name: 'historyMessages', + components: {}, + props:[], + setup() { + const userInfo = useUserInfo() + const { userInfos } = storeToRefs(userInfo); + const state = reactive<stateType>({ + title: '', + dialogMes: false, + tableData: [], + roleList: [], + uid: null + }); + // 页面载入时执行方法 + onMounted(() => { + + }); + const ctfRef = ref() + const openDialog = (value: any) => { + state.dialogMes = true + } + + // 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 renderMenu = async (value: string) => { + Session.set('projectId',value) + userInfos.value.projectId = value + await initBackEndControlRoutes(); + }; + return { + renderMenu, + openDialog, + 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/dataUpload/saftyBaseInfo/certInfo/index.vue b/src/views/dataUpload/saftyBaseInfo/certInfo/index.vue new file mode 100644 index 0000000..1c22508 --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/certInfo/index.vue @@ -0,0 +1,201 @@ +<template> + <div class="system-role-container"> + <el-card shadow="hover"> + <div class="system-user-search mb15"> + <el-input size="default" v-model.trim="listQuery.searchParams.name" placeholder="请输入证书类型" style="max-width: 180px"> </el-input> + <el-button size="default" type="primary" class="ml10" @click="handleSearch"> + <el-icon> + <ele-Search /> + </el-icon> + 查询 + </el-button> + <el-button size="default" type="success" class="ml10" @click="onOpenDialogRef('新增', '')"> + <el-icon> + <ele-FolderAdd /> + </el-icon> + 新增 + </el-button> + </div> + <el-table :data="tableData.data" style="width: 100%"> + <el-table-column prop="name" label="证书类型" show-overflow-tooltip></el-table-column> + <el-table-column prop="personCount" label="关联证书人员" show-overflow-tooltip> + <template #default="scope"> + <el-button v-if="scope.row.personCount && scope.row.personCount>0" link type="primary" @click="openMembers('人员',scope.row)">{{scope.row.personCount}}</el-button> + <span v-else>0</span> + </template> + </el-table-column> + <el-table-column prop="unValidCount" label="三个月证书到期" show-overflow-tooltip> + <template #default="scope"> + <el-button v-if="scope.row.unValidCount && scope.row.unValidCount>0" link type="danger" @click="openMembers('到期',scope.row)">{{scope.row.unValidCount}}</el-button> + <span v-else>0</span> + </template> + </el-table-column> +<!-- <el-table-column prop="warnCount" label="历史预警信息" show-overflow-tooltip>--> +<!-- <template #default="scope">--> +<!-- <el-button v-if="scope.row.warnCount && scope.row.warnCount>0" link type="danger" @click="openMes(scope.row)">{{scope.row.warnCount}}</el-button>--> +<!-- <span v-else>0</span>--> +<!-- </template>--> +<!-- </el-table-column>--> + <el-table-column label="操作" width="150"> + <template #default="scope"> + <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> + <br /> + <el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" class="page-position" :pager-count="5" :page-sizes="[10]" v-model:current-page="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="tableData.total"> </el-pagination> + <br /> + <br /> + </el-card> + <certificateDialog ref="certificateRef" @refreshCertList="initRoleTableData" /> + <certificate-member ref="certificateMemRef"></certificate-member> + <messages ref="mesRef"></messages> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import certificateDialog from '/@/views/system/certificate/component/certificateDialog.vue' +import certificateMember from '/@/views/system/certificate/component/certificateMember.vue' +import messages from '/@/views/system/certificate/component/messages.vue' +import { certApi } from '/@/api/systemManage/certificate'; +import { useMenuApi } from '/@/api/systemManage/menu'; +import { Session } from '/@/utils/storage'; +import { initBackEndControlRoutes } from '/@/router/backEnd'; +import {useUserInfo} from "/@/stores/userInfo"; +import {storeToRefs} from "pinia"; + +// 定义接口来定义对象的类型 +interface TableData { + roleName: string; + roleSign: string; + describe: string; + sort: number; + status: boolean; + createTime: string; +} +interface TableDataState { + tableData: { + data: Array<TableData>; + total: number; + loading: boolean; + }; + listQuery: { + pageIndex: number + pageSize: number + searchParams: { + name: string + } + }; +} + +export default defineComponent({ + name: 'certificate', + components: {messages, certificateMember, certificateDialog }, + setup() { + const userInfo = useUserInfo(); + const { userInfos } = storeToRefs(userInfo); + const certificateRef = ref(); + const certificateMemRef = ref(); + const mesRef = ref(); + const state = reactive<TableDataState>({ + tableData: { + data: [], + total: 0, + loading: false, + }, + listQuery: { + pageIndex: 1, + pageSize: 10, + searchParams: { + name:'' + } + } + }); + // 初始化表格数据 + const initRoleTableData = async () => { + let res = await certApi().getCerttypeList(state.listQuery); + if (res.data.code === '200') { + state.tableData.data = res.data.data; + state.tableData.total = res.data.total + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + const onOpenDialogRef = (type: string, value: any) => { + certificateRef.value.openDialog(type, value); + }; + + const openMembers = (type: string, value: any) => { + certificateMemRef.value.openDialog(type,value) + } + + const openMes = (value: any) => { + mesRef.value.openDialog(value) + } + const onRowDel = (row: any) => { + ElMessageBox.confirm(`此操作将永久删除角色名称:“${row.name}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await certApi().deleteCerttype(row.id); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + duration: 2000, + message: '删除成功' + }); + await initRoleTableData(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch(() => {}); + }; + const handleSearch = () => { + state.listQuery.pageIndex = 1 + initRoleTableData(); + }; + + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + initRoleTableData(); + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + initRoleTableData(); + }; + // 页面加载时 + onMounted(() => { + initRoleTableData(); + }); + return { + onRowDel, + handleSearch, + certificateRef, + certificateMemRef, + mesRef, + onOpenDialogRef, + openMembers, + openMes, + initRoleTableData, + onHandleSizeChange, + onHandleCurrentChange, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/dataUpload/saftyBaseInfo/crowInfo/components/addReport.vue b/src/views/dataUpload/saftyBaseInfo/crowInfo/components/addReport.vue new file mode 100644 index 0000000..b556190 --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/crowInfo/components/addReport.vue @@ -0,0 +1,205 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowDialog" width="50%"> + <el-form :model="form" size="default" ref="formRef" :rules="rules" label-width="200px"> + <el-row :gutter="35"> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="从业人数" prop="cyrs"> + <el-input v-model.trim.number="form.cyrs" placeholder="从业人数" type="number" 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="zyfzr"> + <el-input v-model.trim="form.zyfzr" 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="aqfzr"> + <el-input v-model.trim="form.aqfzr" 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="scjydz"> + <el-input v-model.trim="form.scjydz" :autosize="{ minRows: 1 }" type="textarea" 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="specialNum"> + <el-input v-model.trim.number="form.specialNum" placeholder="特殊作业人数" type="number" 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="specialCertExpireNum"> + <el-input v-model.trim.number="form.specialCertExpireNum" placeholder="特殊作业证书到期人数" type="number" 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="proSafeNum"> + <el-input v-model.trim.number="form.proSafeNum" placeholder="专职安全人员人数" type="number" 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="proSafeCertExpireNum"> + <el-input v-model.trim.number="form.proSafeCertExpireNum" placeholder="专职安全人员证书到期人数" type="number" 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="proSafeCheckTrainExpireNum"> + <el-input v-model.trim.number="form.proSafeCheckTrainExpireNum" placeholder="专职安全人员复审培训到期人数" type="number" 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="registSafeNum"> + <el-input v-model.trim.number="form.registSafeNum" placeholder="注册安全工程师人数" type="number" 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="registSafeCertExpireNum"> + <el-input v-model.trim.number="form.registSafeCertExpireNum" placeholder="注册安全工程师证书到期人数" type="number" 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="registSafeCheckTrainExpireNum"> + <el-input v-model.trim.number="form.registSafeCheckTrainExpireNum" placeholder="注册安全工程师复审培训到期人数" type="number" clearable></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <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> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import axios from "axios"; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; + +// 定义接口来定义对象的类型 +interface DataState { + title: string + isShowDialog: boolean + form: { + cyrs: number | null + zyfzr: string + aqfzr: string + scjydz: string + specialNum: number | null + specialCertExpireNum: number | null + proSafeNum: number | null + proSafeCertExpireNum: number | null + proSafeCheckTrainExpireNum: number | null + registSafeNum: number | null + registSafeCertExpireNum: number | null + registSafeCheckTrainExpireNum: number | null + } + rules:{} +} + +export default defineComponent({ + name: 'reportDialog', + setup(props, context) { + const formRef = ref() + const state = reactive<DataState>({ + title: '', + isShowDialog: false, + form: { + cyrs: null, + zyfzr: '', + aqfzr: '', + scjydz: '', + specialNum: null, + specialCertExpireNum: null, + proSafeNum: null, + proSafeCertExpireNum: null, + proSafeCheckTrainExpireNum: null, + registSafeNum: null, + registSafeCertExpireNum: null, + registSafeCheckTrainExpireNum: null + }, + rules:{ + cyrs: [{ required: true, message: '请填写从业人数', trigger: 'blur' }], + zyfzr: [{ required: true, message: '请填写主要负责人', trigger: 'blur' }], + aqfzr: [{ required: true, message: '请填写安全负责人', trigger: 'blur' }], + scjydz: [{ required: true, message: '请填写生产/经营地址', trigger: 'blur' }], + specialNum: [{ required: true, message: '请填写特殊作业人数', trigger: 'blur' }], + specialCertExpireNum: [{ required: true, message: '请填写特殊作业证书到期人数', trigger: 'blur' }], + proSafeNum: [{ required: true, message: '请填写专职安全人员人数', trigger: 'blur' }], + proSafeCertExpireNum: [{ required: true, message: '请填写专职安全人员证书到期人数', trigger: 'blur' }], + proSafeCheckTrainExpireNum: [{ required: true, message: '请填写专职安全人员复审培训到期人数', trigger: 'blur' }], + registSafeNum: [{ required: true, message: '请填写注册安全工程师人数', trigger: 'blur' }], + registSafeCertExpireNum: [{ required: true, message: '请填写注册安全工程师证书到期人数', trigger: 'blur' }], + registSafeCheckTrainExpireNum: [{ required: true, message: '请填写注册安全工程师复审培训到期人数', trigger: 'blur' }] + } + }) + + // 页面加载时 + onMounted(() => { + + }) + // 打开弹窗 + const open = (type: string, data: object) => { + state.isShowDialog = true; + if (type === 'add') { + state.title = '新增上报'; + state.form = { + cyrs: null, + zyfzr: '', + aqfzr: '', + scjydz: '', + specialNum: null, + specialCertExpireNum: null, + proSafeNum: null, + proSafeCertExpireNum: null, + proSafeCheckTrainExpireNum: null, + registSafeNum: null, + registSafeCertExpireNum: null, + registSafeCheckTrainExpireNum: null + }; + } + }; + + // 新增修改 + const onSubmit = async () => { + formRef.value.validate(async (valid:Boolean) => { + if(valid){ + const res = await judgeReportApi().addCrow(state.form) + if(res.data.code == 200){ + ElMessage({ + type:'success', + message:'数据上报成功' + }) + state.isShowDialog = false + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + context.emit('refresh') + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + } + + + return { + formRef, + open, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/dataUpload/saftyBaseInfo/crowInfo/index.vue b/src/views/dataUpload/saftyBaseInfo/crowInfo/index.vue new file mode 100644 index 0000000..7531e0e --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/crowInfo/index.vue @@ -0,0 +1,223 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <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="openDialog('add',{})">新增</el-button> + </el-col> + </el-row> + <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column> + <el-table-column prop="cyrs" label="从业人数" show-overflow-tooltip></el-table-column> + <el-table-column prop="zyfzr" label="主要负责人" show-overflow-tooltip></el-table-column> + <el-table-column prop="aqfzr" label="安全负责人" show-overflow-tooltip></el-table-column> + <el-table-column prop="scjydz" label="生产/经营地址" show-overflow-tooltip></el-table-column> + <el-table-column prop="specialNum" label="特种作业人数" show-overflow-tooltip></el-table-column> + <el-table-column prop="specialCertExpireNum" label="特种作业证书到期人数" show-overflow-tooltip></el-table-column> + <el-table-column prop="proSafeNum" label="专职安全人员人数" show-overflow-tooltip></el-table-column> + <el-table-column prop="proSafeCertExpireNum" label="专职安全人员证书到期人数" show-overflow-tooltip></el-table-column> + <el-table-column prop="proSafeCheckTrainExpireNum" label="专职安全人员复审培训到期人数" show-overflow-tooltip></el-table-column> + <el-table-column prop="registSafeNum" label="注册安全工程师人数" show-overflow-tooltip></el-table-column> + <el-table-column prop="registSafeCertExpireNum" label="注册安全工程师证书到期人数" show-overflow-tooltip></el-table-column> + <el-table-column prop="registSafeCheckTrainExpireNum" label="注册安全工程师复审培训到期人数" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> + <el-button style="color: red" 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="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> + </div> + </div> + </div> + </div> + <add-report ref="reportRef" @refresh="getData"></add-report> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue' +import { ElMessageBox, ElMessage } from 'element-plus' +import { Plus } from '@element-plus/icons-vue' +import addReport from "./components/addReport.vue" +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; +interface TableDataState { + reportData: [], + listQuery: { + searchParams: {} + pageIndex: number + pageSize: number + } + total: null | number +} + +export default defineComponent({ + name: 'crowInfo', + components: {addReport }, + setup() { + const reportRef= ref(); + const state = reactive<TableDataState>({ + reportData: [], + listQuery: { + searchParams: {}, + pageIndex: 1, + pageSize: 10 + }, + total: null + }); + + // 页面加载时 + onMounted(() => { + getData() + }); + + const getData = async ()=>{ + const res = await judgeReportApi().getCrowList(state.listQuery) + if(res.data.code == 200){ + state.reportData = res.data.data + state.total = res.data.total + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + const openDialog=(type:string,data:object)=>{ + reportRef.value.open(type,data) + } + + // 删除用户 + const onRowDel = (row: Object) => { + ElMessageBox.confirm(`此操作将永久删除该条数据,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + const res = await judgeReportApi().delCrow({ids: [row.id]}) + if(res.data.code == 200){ + ElMessage({ + type: 'success', + message: '删除成功' + }) + await getData() + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + getData() + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + getData() + }; + + return { + reportRef, + openDialog, + getData, + onRowDel, + onHandleSizeChange, + 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/dataUpload/saftyBaseInfo/equipInfo/components/addReport.vue b/src/views/dataUpload/saftyBaseInfo/equipInfo/components/addReport.vue new file mode 100644 index 0000000..da55976 --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/equipInfo/components/addReport.vue @@ -0,0 +1,305 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowDialog" width="50%"> + <el-form :model="form" size="default" ref="formRef" :rules="rules" 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="no"> + <el-input v-model.trim="form.no" 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="name"> + <el-input v-model.trim="form.name" 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="cateName"> + <el-input v-model.trim="form.cateName" 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="model"> + <el-input v-model.trim="form.model" 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="出厂时间"> + <el-date-picker v-model="form.productionTime" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="选择出厂时间" style="width: 100%" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="是否特种设备"> + <el-radio-group v-model="form.isSpecial"> + <el-radio :label="0">是</el-radio> + <el-radio :label="1">否</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="是否注册登记"> + <el-radio-group v-model="form.isRegister"> + <el-radio :label="0">是</el-radio> + <el-radio :label="1">否</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="注册登记编号" prop="registerNo"> + <el-input v-model.trim="form.registerNo" 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="设备状况"> + <el-select v-model="form.status" placeholder="请选择设备状况"> + <el-option :key="1" label="1" :value="1"/> + <el-option :key="2" label="2" :value="2"/> + <el-option :key="3" label="3" :value="3"/> + </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="注册登记表"> + <el-input v-model.trim="form.registerTable" 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="检验状态"> + <el-select v-model="form.checkStatus" placeholder="请选择检验状态"> + <el-option :key="1" label="1" :value="1"/> + <el-option :key="2" label="2" :value="2"/> + <el-option :key="3" label="3" :value="3"/> + </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="下次检验时间"> + <el-date-picker v-model="form.nextCheckTime" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="选择下次检验时间" style="width: 100%" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="上次校验时间"> + <el-date-picker v-model="form.lastCheckTime" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="选择上次校验时间" style="width: 100%" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="附件"> + <el-upload accept=".pdf" :action="uploadUrl" :headers="header" method="post" :on-exceed="showTip" :on-success="handleAvatarSuccess" :limit='1' v-model:file-list="fileList" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove"> + <el-button type="primary">点击上传</el-button> + <template #tip> + <div class="el-upload__tip">仅支持上传pdf文件,尺寸小于2M,最多可上传1张</div> + </template> + </el-upload> + </el-form-item> + </el-col> + </el-row> + </el-form> + <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> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import axios from "axios"; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; +import Cookies from "js-cookie"; + +// 定义接口来定义对象的类型 +interface DataState { + title: string + isShowDialog: boolean + form: { + uuid: string + no: string + name: string + cateName: string + model: string + productionTime: string + isSpecial: number | null + isRegister: number | null + registerNo: string + status: number | null + registerTable: string + checkStatus: number | null + nextCheckTime: string + lastCheckTime: string + files: string + } + rules:{} + fileList: [], + uploadUrl: string, + header: {} +} + +export default defineComponent({ + name: 'reportDialog', + setup(props, context) { + const formRef = ref() + const state = reactive<DataState>({ + title: '', + isShowDialog: false, + form: { + uuid: '', + no: '', + name: '', + cateName: '', + model: '', + productionTime: '', + isSpecial: null, + isRegister: null, + registerNo: '', + status: null, + registerTable: '', + checkStatus: null, + nextCheckTime: '', + lastCheckTime: '', + files: '' + }, + rules:{ + no: [{ required: true, message: '请填写编号', trigger: 'blur' }], + name: [{ required: true, message: '请填写设备名称', trigger: 'blur' }], + cateName: [{ required: true, message: '请填写分类名称', trigger: 'blur' }], + model: [{ required: true, message: '请填写型号', trigger: 'blur' }], + registerNo: [{ required: true, message: '请填写注册登记编号', trigger: 'blur' }] + }, + fileList: [], + uploadUrl: import.meta.env.VITE_API_URL + '/account/file/upload', + header: { + uid: Cookies.get('uid'), + Authorization: Cookies.get('token') + } + }) + + // 页面加载时 + onMounted(() => { + + }) + // 打开弹窗 + const open = (type: string, data: object) => { + state.isShowDialog = true; + if (type === 'add') { + state.title = '新增上报'; + state.form = { + uuid:'', + no: '', + name: '', + cateName: '', + model: '', + productionTime: '', + isSpecial: null, + isRegister: null, + registerNo: '', + status: null, + registerTable: '', + checkStatus: null, + nextCheckTime: '', + lastCheckTime: '', + files: '' + } + }else{ + state.title = '重新上报'; + state.form = { + uuid: data.uuid, + no: '', + name: '', + cateName: '', + model: '', + productionTime: '', + isSpecial: null, + isRegister: null, + registerNo: '', + status: null, + registerTable: '', + checkStatus: null, + nextCheckTime: '', + lastCheckTime: '', + files: '' + } + } + state.fileList = [] + }; + + // 新增修改 + const onSubmit = async () => { + formRef.value.validate(async (valid:Boolean) => { + if(valid){ + const res = await judgeReportApi().addEquip([state.form]) + if(res.data.code == 200){ + ElMessage({ + type:'success', + message:'数据上报成功' + }) + state.isShowDialog = false + state.fileList = [] + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + context.emit('refresh') + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + } + + // 图片上传 + const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); + } + + const picSize = async(rawFile: any) => { + if(rawFile.size / 1024 / 1024 > 2){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过2M' + }); + return false + } + } + + const handleAvatarSuccess = (res:any, uploadFile: any) => { + if(res){ + uploadFile.name = res + state.form.files = res + }else{ + ElMessage({ + type: 'warning', + message: '文件上传失败' + }) + } + } + + const handleRemove = (file, uploadFiles,type) => { + state.form.files = '' + } + + + return { + formRef, + showTip, + picSize, + handleAvatarSuccess, + handleRemove, + open, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/dataUpload/saftyBaseInfo/equipInfo/index.vue b/src/views/dataUpload/saftyBaseInfo/equipInfo/index.vue new file mode 100644 index 0000000..36f709b --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/equipInfo/index.vue @@ -0,0 +1,258 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <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="openDialog('add',{})">新增</el-button> + </el-col> + </el-row> + <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column> + <el-table-column prop="no" label="编号" show-overflow-tooltip></el-table-column> + <el-table-column prop="name" label="设备名称" show-overflow-tooltip></el-table-column> + <el-table-column prop="cateName" label="分类" show-overflow-tooltip></el-table-column> + <el-table-column prop="model" label="型号" show-overflow-tooltip></el-table-column> + <el-table-column prop="productionTime" label="出厂时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="isSpecial" label="是否特种设备" show-overflow-tooltip> + <template #default="scope"> + {{scope.row.isSpecial == 0?'是':scope.row.isSpecial == 1?'否':''}} + </template> + </el-table-column> + <el-table-column prop="isRegister" label="是否注册登记" show-overflow-tooltip> + <template #default="scope"> + {{scope.row.isSpecial == 0?'是':scope.row.isSpecial == 1?'否':''}} + </template> + </el-table-column> + <el-table-column prop="registerNo" label="注册登记编号" show-overflow-tooltip></el-table-column> + <el-table-column prop="status" label="设备状况" show-overflow-tooltip></el-table-column> + <el-table-column prop="files" label="附件" show-overflow-tooltip> + <template #default="scope"> + <el-button v-if="scope.row.files !== ''" size="small" text type="primary" @click="openFile(scope.row.files)">查看</el-button> + </template> + </el-table-column> + <el-table-column prop="registerTable" label="注册等级表" show-overflow-tooltip></el-table-column> + <el-table-column prop="checkStatus" label="检验状态" show-overflow-tooltip></el-table-column> + <el-table-column prop="nextCheckTime" label="下次检验时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="lastCheckTime" label="上次校验时间" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> + <el-button size="small" text type="primary" @click="openDialog('update',scope.row)">重新上报</el-button> + <el-button style="color: red" 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="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> + </div> + </div> + </div> + </div> + <add-report ref="reportRef" @refresh="getData"></add-report> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue' +import { ElMessageBox, ElMessage } from 'element-plus' +import { Plus } from '@element-plus/icons-vue' +import addReport from "./components/addReport.vue" +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; +import axios from "axios"; +import Cookies from "js-cookie"; +interface TableDataState { + reportData: [], + listQuery: { + searchParams: {} + pageIndex: number + pageSize: number + } + total: null | number +} + +export default defineComponent({ + name: 'equipInfo', + components: {addReport }, + setup() { + const reportRef= ref(); + const state = reactive<TableDataState>({ + reportData: [], + listQuery: { + searchParams: {}, + pageIndex: 1, + pageSize: 10 + }, + total: null + }); + + // 页面加载时 + onMounted(() => { + getData() + }); + + const getData = async ()=>{ + const res = await judgeReportApi().getEquipList(state.listQuery) + if(res.data.code == 200){ + state.reportData = res.data.data + state.total = res.data.total + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + const openDialog=(type:string,data:object)=>{ + reportRef.value.open(type,data) + } + + // 删除用户 + const onRowDel = (row: Object) => { + ElMessageBox.confirm(`此操作将永久删除:“${row.name}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + const res = await judgeReportApi().delEquip({ids: [row.id]}) + if(res.data.code == 200){ + ElMessage({ + type: 'success', + message: '删除成功' + }) + await getData() + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + getData() + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + getData() + }; + + const openFile=(file: string)=>{ + axios.get(import.meta.env.VITE_API_URL + file,{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 + window.open(link.href) + } else { + ElMessage({ + type: 'warning', + message: '文件读取失败' + }); + } + }) + } + + return { + reportRef, + openDialog, + getData, + onRowDel, + onHandleSizeChange, + onHandleCurrentChange, + openFile, + ...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/dataUpload/saftyBaseInfo/judgeReport/components/addReport.vue b/src/views/dataUpload/saftyBaseInfo/judgeReport/components/addReport.vue new file mode 100644 index 0000000..29526a9 --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/judgeReport/components/addReport.vue @@ -0,0 +1,199 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowDialog" width="50%"> + <el-form :model="form" size="default" ref="formRef" :rules="rules" 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="name"> + <el-input v-model.trim="form.name" 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="remarks"> + <el-input v-model.trim="form.remarks" :autosize="{ minRows: 1 }" type="textarea" 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="evaluateTime"> + <el-date-picker v-model="form.evaluateTime" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="选择评价时间" style="width: 100%" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="附件"> + <el-upload accept=".pdf" :action="uploadUrl" :headers="header" method="post" :on-exceed="showTip" :on-success="handleAvatarSuccess" :limit='1' v-model:file-list="fileList" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove"> + <el-button type="primary">点击上传</el-button> + <template #tip> + <div class="el-upload__tip">仅支持上传pdf文件,尺寸小于2M,最多可上传1张</div> + </template> + </el-upload> + </el-form-item> + </el-col> + </el-row> + </el-form> + <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> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import axios from "axios"; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; +import {userApi} from '/@/api/systemManage/user' +import Cookies from "js-cookie"; +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; + +// 定义接口来定义对象的类型 +interface DataState { + title: string; + isShowDialog: boolean; + form: { + uuid: string + name: string + remarks: string + evaluateTime: string + files: string + } + rules:{}, + fileList: [], + uploadUrl: string, + header: {} +} + +export default defineComponent({ + name: 'reportDialog', + setup(props, context) { + const formRef = ref() + const state = reactive<DataState>({ + title: '', + isShowDialog: false, + form: { + uuid: '', + name: '', + remarks: '', + evaluateTime: '', + files: '' + }, + rules:{ + name: [{ required: true, message: '请填写报告名称', trigger: 'blur'}], + remarks: [{ required: true, message: '请填写备注', trigger: 'blur'}], + evaluateTime: [{ required: true, message: '请选择评价时间', trigger: 'blur'}] + }, + fileList: [], + uploadUrl: import.meta.env.VITE_API_URL + '/account/file/upload', + header: { + uid: Cookies.get('uid'), + Authorization: Cookies.get('token') + } + }) + + // 页面加载时 + onMounted(() => { + + }) + // 打开弹窗 + const open = (type: string, data: object) => { + state.isShowDialog = true; + if (type === 'add') { + state.title = '新增上报'; + state.form = { + uuid: '', + name: '', + remarks: '', + evaluateTime: '', + files: '' + } + }else{ + state.title = '重新上报'; + state.form = { + uuid: data.uuid, + name: '', + remarks: '', + evaluateTime: '', + files: '' + } + } + state.fileList = [] + }; + + // 图片上传 + const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); + } + + const picSize = async(rawFile: any) => { + if(rawFile.size / 1024 / 1024 > 2){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过2M' + }); + return false + } + } + + const handleAvatarSuccess = (res:any, uploadFile: any) => { + if(res){ + uploadFile.name = res + state.form.files = res + }else{ + ElMessage({ + type: 'warning', + message: '文件上传失败' + }) + } + } + + const handleRemove = (file, uploadFiles,type) => { + state.form.files = '' + } + + // 新增修改 + const onSubmit = async () => { + formRef.value.validate(async (valid:Boolean) => { + if(valid){ + const res = await judgeReportApi().addJudge([state.form]) + if(res.data.code == '200'){ + ElMessage({ + type:'success', + message:'数据上报成功' + }) + state.isShowDialog = false + state.fileList = [] + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + context.emit('refresh'); + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + } + + return { + formRef, + showTip, + picSize, + handleAvatarSuccess, + handleRemove, + open, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/dataUpload/saftyBaseInfo/judgeReport/index.vue b/src/views/dataUpload/saftyBaseInfo/judgeReport/index.vue new file mode 100644 index 0000000..bf72612 --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/judgeReport/index.vue @@ -0,0 +1,251 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <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="openDialog('add',{})">新增</el-button> + </el-col> + </el-row> + <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column> + <el-table-column prop="createTime" label="上报时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="name" label="报告名称" show-overflow-tooltip></el-table-column> + <el-table-column prop="remarks" label="备注" show-overflow-tooltip></el-table-column> + <el-table-column prop="evaluateTime" label="评价时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="files" label="附件" show-overflow-tooltip> + <template #default="scope"> + <el-button v-if="scope.row.files !== ''" size="small" text type="primary" @click="openFile(scope.row.files)">查看</el-button> + </template> + </el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> + <el-button size="small" text type="primary" @click="openDialog('update',scope.row)">重新上报</el-button> + <el-button style="color: red" 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="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> + </div> + </div> + </div> + </div> + <add-report ref="reportRef" @refresh="getData"></add-report> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue' +import { ElMessageBox, ElMessage } from 'element-plus' +import { Plus } from '@element-plus/icons-vue' +import addReport from "./components/addReport.vue" +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; +import axios from "axios"; +import Cookies from "js-cookie"; + +// 定义接口来定义对象的类型 +interface TableDataRow { + id: number|null + reportTime: string + name: string + remarks: string + evaluateTime: string + files: string +} +interface TableDataState { + reportData: [], + listQuery: { + searchParams: {} + pageIndex: number + pageSize: number + } + total: null | number +} + +export default defineComponent({ + name: 'judgeReport', + components: {addReport }, + setup() { + const reportRef= ref(); + const state = reactive<TableDataState>({ + reportData: [], + listQuery: { + searchParams: {}, + pageIndex: 1, + pageSize: 10 + }, + total: null + }); + + // 页面加载时 + onMounted(() => { + getData() + }); + + const getData = async ()=>{ + const res = await judgeReportApi().getJudgeList(state.listQuery) + if(res.data.code == 200){ + state.reportData = res.data.data + state.total = res.data.total + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + const openDialog=(type:string,data:object)=>{ + reportRef.value.open(type,data) + } + + const openFile=(file: string)=>{ + axios.get(import.meta.env.VITE_API_URL + file,{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 + window.open(link.href) + } else { + ElMessage({ + type: 'warning', + message: '文件读取失败' + }); + } + }) + } + + // 删除用户 + const onRowDel = (row: TableDataRow) => { + ElMessageBox.confirm(`此操作将永久删除报告名称:“${row.name}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + const res = await judgeReportApi().delJudge({ids: [row.id]}) + if(res.data.code == '200'){ + ElMessage({ + type: 'success', + message: '删除成功' + }) + await getData() + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + getData() + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + getData() + }; + + return { + reportRef, + openFile, + openDialog, + getData, + onRowDel, + onHandleSizeChange, + 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/dataUpload/saftyBaseInfo/parkingInfo/components/addReport.vue b/src/views/dataUpload/saftyBaseInfo/parkingInfo/components/addReport.vue new file mode 100644 index 0000000..d8354cb --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/parkingInfo/components/addReport.vue @@ -0,0 +1,202 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowDialog" width="50%"> + <el-form :model="form" size="default" ref="formRef" :rules="rules" 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="programmeName"> + <el-input v-model.trim="form.programmeName" 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="startTime"> + <el-date-picker v-model="form.startTime" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="选择开始时间" style="width: 100%" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="结束时间" prop="endTime"> + <el-date-picker v-model="form.endTime" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="选择开始时间" style="width: 100%" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="开停车类型" prop="programmeType"> + <el-radio-group v-model="form.programmeType"> + <el-radio :label="1">开车</el-radio> + <el-radio :label="2">停车</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="负责部门"> + <el-input v-model.trim="form.responsibleDept" 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="负责人"> + <el-input v-model.trim="form.responsiblePerson" 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="危险工艺"> + <el-input v-model.trim="form.craftName" :autosize="{ minRows: 1 }" type="textarea" 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="顺序"> + <el-input v-model.trim="form.seq" placeholder="顺序" type="number" 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="准备"> + <el-input v-model.trim="form.preparation" 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="方案"> + <el-input v-model.trim="form.programme" placeholder="方案" clearable></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <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> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import axios from "axios"; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; + +// 定义接口来定义对象的类型 +interface DataState { + title: string + isShowDialog: boolean + form: { + uuid: string + programmeName: string + startTime: string + endTime: string + programmeType: number | null + responsibleDept: string + responsiblePerson: string + craftName: string + seq: string + preparation: string + programme: string + } + rules:{} +} + +export default defineComponent({ + name: 'reportDialog', + setup(props, context) { + const formRef = ref() + const state = reactive<DataState>({ + title: '', + isShowDialog: false, + form: { + uuid:'', + programmeName: '', + startTime: '', + endTime: '', + programmeType: null, + responsibleDept: '', + responsiblePerson: '', + craftName: '', + seq: '', + preparation: '', + programme: '' + }, + rules:{ + programmeName: [{ required: true, message: '请填写方案名称', trigger: 'blur' }], + startTime: [{ required: true, message: '请选择开始时间', trigger: 'blur' }], + endTime: [{ required: true, message: '请选择结束时间', trigger: 'blur' }], + programmeType: [{ required: true, message: '请选择开停车类型', trigger: 'blur' }] + } + }) + + // 页面加载时 + onMounted(() => { + + }) + // 打开弹窗 + const open = (type: string, data: object) => { + state.isShowDialog = true; + if (type === 'add') { + state.title = '新增上报'; + state.form = { + uuid:'', + programmeName: '', + startTime: '', + endTime: '', + programmeType: null, + responsibleDept: '', + responsiblePerson: '', + craftName: '', + seq: '', + preparation: '', + programme: '' + } + }else{ + state.title = '重新上报'; + state.form = { + uuid: data.uuid, + programmeName: '', + startTime: '', + endTime: '', + programmeType: null, + responsibleDept: '', + responsiblePerson: '', + craftName: '', + seq: '', + preparation: '', + programme: '' + } + } + }; + + // 新增修改 + const onSubmit = async () => { + formRef.value.validate(async (valid:Boolean) => { + if(valid){ + const res = await judgeReportApi().addParking([state.form]) + if(res.data.code == 200){ + ElMessage({ + type:'success', + message:'数据上报成功' + }) + state.isShowDialog = false + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + context.emit('refresh') + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + } + + + return { + formRef, + open, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/dataUpload/saftyBaseInfo/parkingInfo/index.vue b/src/views/dataUpload/saftyBaseInfo/parkingInfo/index.vue new file mode 100644 index 0000000..055fa85 --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/parkingInfo/index.vue @@ -0,0 +1,223 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <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="openDialog('add',{})">新增</el-button> + </el-col> + </el-row> + <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column> + <el-table-column prop="reportTime" label="上报时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="programmeName" label="方案名称" show-overflow-tooltip></el-table-column> + <el-table-column prop="startTime" label="开始时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="endTime" label="结束时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="programmeType" label="开停车类型" show-overflow-tooltip></el-table-column> + <el-table-column prop="responsibleDept" label="负责部门" show-overflow-tooltip></el-table-column> + <el-table-column prop="responsiblePerson" label="负责人" show-overflow-tooltip></el-table-column> + <el-table-column prop="craftName" label="危险工艺" show-overflow-tooltip></el-table-column> + <el-table-column prop="seq" label="顺序" show-overflow-tooltip></el-table-column> + <el-table-column prop="preparation" label="准备" show-overflow-tooltip></el-table-column> + <el-table-column prop="programme" label="方案" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> + <el-button size="small" text type="primary" @click="openDialog('update',scope.row)">重新上报</el-button> + <el-button style="color: red" 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="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> + </div> + </div> + </div> + </div> + <add-report ref="reportRef" @refresh="getData"></add-report> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue' +import { ElMessageBox, ElMessage } from 'element-plus' +import { Plus } from '@element-plus/icons-vue' +import addReport from "./components/addReport.vue" +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; +interface TableDataState { + reportData: [], + listQuery: { + searchParams: {} + pageIndex: number + pageSize: number + } + total: null | number +} + +export default defineComponent({ + name: 'parkingInfo', + components: {addReport }, + setup() { + const reportRef= ref(); + const state = reactive<TableDataState>({ + reportData: [], + listQuery: { + searchParams: {}, + pageIndex: 1, + pageSize: 10 + }, + total: null + }); + + // 页面加载时 + onMounted(() => { + getData() + }); + + const getData = async ()=>{ + const res = await judgeReportApi().getParkingList(state.listQuery) + if(res.data.code == 200){ + state.reportData = res.data.data + state.total = res.data.total + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + const openDialog=(type:string,data:object)=>{ + reportRef.value.open(type,data) + } + + // 删除用户 + const onRowDel = (row: Object) => { + ElMessageBox.confirm(`此操作将永久删除:“${row.programmeName}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + const res = await judgeReportApi().delParking({ids: [row.id]}) + if(res.data.code == 200){ + ElMessage({ + type: 'success', + message: '删除成功' + }) + await getData() + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + getData() + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + getData() + }; + + return { + reportRef, + openDialog, + getData, + onRowDel, + onHandleSizeChange, + 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/dataUpload/saftyBaseInfo/productionInfo/components/addReport.vue b/src/views/dataUpload/saftyBaseInfo/productionInfo/components/addReport.vue new file mode 100644 index 0000000..6f72495 --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/productionInfo/components/addReport.vue @@ -0,0 +1,286 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowDialog" width="50%"> + <el-form :model="form" size="default" ref="formRef" :rules="rules" label-width="160px"> + <el-row :gutter="35"> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="工艺名称" prop="craftName"> + <el-input v-model.trim="form.craftName" 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="craftContent"> + <el-input v-model.trim="form.craftContent" :autosize="{ minRows: 1 }" type="textarea" 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="mainProdEquip"> + <el-input v-model.trim="form.mainProdEquip" :autosize="{ minRows: 1 }" type="textarea" 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="keyParts"> + <el-input v-model.trim="form.keyParts" 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="hazardCode"> + <el-input v-model.trim="form.hazardCode" :autosize="{ minRows: 1 }" type="textarea" 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="涉及的危险化学品"> + <el-input v-model.trim="form.msds" :autosize="{ minRows: 1 }" type="textarea" 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="工艺危险特点"> + <el-input v-model.trim="form.hazardCharacter" 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="重点监控工艺参数指标"> + <el-input v-model.trim="form.parameterIndex" 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="现有安全控制手段"> + <el-input v-model.trim="form.controlMean" 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="反应类型"> + <el-input v-model.trim="form.reactionType" 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="重点监控单元"> + <el-input v-model.trim="form.keyMonitorUnit" 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="工艺图纸"> + <el-upload accept="image/*" multiple list-type="picture-card" :action="uploadUrl" :headers="header" method="post" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :on-success="handleAvatarSuccess" :limit='2' v-model:file-list="fileList" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove"> + <el-icon><Plus /></el-icon> + <template #tip> + <div class="el-upload__tip">上传图片尺寸小于2M,最多可上传2张</div> + </template> + </el-upload> + </el-form-item> + </el-col> + </el-row> + </el-form> + <el-dialog v-model="imgDialog"> + <img width="100%" :src="imageUrl" alt="Preview Image" /> + </el-dialog> + <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> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import axios from "axios"; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; +import Cookies from "js-cookie"; +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; + +// 定义接口来定义对象的类型 +interface DataState { + title: string + isShowDialog: boolean + form: { + uuid: string + craftName: string + craftContent: string + mainProdEquip: string + keyParts: string + hazardCode: string + msds: string + hazardCharacter: string + parameterIndex: string + controlMean: string + craftDraw: string + reactionType: string + keyMonitorUnit: string + } + rules:{}, + fileList: [], + uploadUrl: string, + header: {}, + imgDialog: boolean, + imageUrl: string +} + +export default defineComponent({ + name: 'reportDialog', + setup(props, context) { + const formRef = ref() + const state = reactive<DataState>({ + title: '', + isShowDialog: false, + form: { + uuid: '', + craftName: '', + craftContent: '', + mainProdEquip: '', + keyParts: '', + hazardCode: '', + msds: '', + hazardCharacter: '', + parameterIndex: '', + controlMean: '', + craftDraw: '', + reactionType: '', + keyMonitorUnit: '' + }, + rules:{ + craftName: [{ required: true, message: '请填写工艺名称', trigger: 'blur' }], + craftContent: [{ required: true, message: '请填写工艺简介', trigger: 'blur' }], + mainProdEquip: [{ required: true, message: '请填写主要生产设备', trigger: 'blur' }], + keyParts: [{ required: true, message: '请填写重点部位', trigger: 'blur' }], + hazardCode: [{ required: true, message: '请填写重大危险源', trigger: 'blur' }] + }, + fileList: [], + uploadUrl: import.meta.env.VITE_API_URL + '/account/file/upload', + header: { + uid: Cookies.get('uid'), + Authorization: Cookies.get('token') + }, + imgDialog: false, + imageUrl: '' + }) + + // 页面加载时 + onMounted(() => { + + }) + // 打开弹窗 + const open = (type: string, data: object) => { + state.isShowDialog = true; + if (type === 'add') { + state.title = '新增上报' + state.form = { + uuid: '', + craftName: '', + craftContent: '', + mainProdEquip: '', + keyParts: '', + hazardCode: '', + msds: '', + hazardCharacter: '', + parameterIndex: '', + controlMean: '', + craftDraw: '', + reactionType: '', + keyMonitorUnit: '' + } + }else{ + state.title = '重新上报' + state.form = { + uuid: data.uuid, + craftName: '', + craftContent: '', + mainProdEquip: '', + keyParts: '', + hazardCode: '', + msds: '', + hazardCharacter: '', + parameterIndex: '', + controlMean: '', + craftDraw: '', + reactionType: '', + keyMonitorUnit: '' + } + } + state.fileList=[] + }; + + // 新增修改 + const onSubmit = async () => { + formRef.value.validate(async (valid:Boolean) => { + if(valid){ + state.form.craftDraw = state.fileList.map(i=>i.name).join(',') + const res = await judgeReportApi().addProduct([state.form]) + if(res.data.code == '200'){ + ElMessage({ + type:'success', + message:'数据上报成功' + }) + state.isShowDialog = false + state.fileList = [] + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + context.emit('refresh') + }else{ + ElMessage({ + type:'warning', + message:'请完善基本信息' + }) + } + }) + } + + // 图片上传 + const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); + } + + const picSize = async(rawFile: any) => { + if(rawFile.size / 1024 / 1024 > 2){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过2M' + }); + return false + } + } + + const handleAvatarSuccess = (res:any, uploadFile: any) => { + if(res){ + uploadFile.name = res + }else{ + ElMessage({ + type: 'warning', + message: '文件上传失败' + }) + } + } + + const handlePictureCardPreview = (uploadFile) => { + state.imageUrl = uploadFile.url + state.imgDialog = true; + } + + const handleRemove = (file, uploadFiles,type) => { + state.fileList = uploadFiles + } + + + return { + formRef, + showTip, + picSize, + handleAvatarSuccess, + handlePictureCardPreview, + handleRemove, + open, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/dataUpload/saftyBaseInfo/productionInfo/index.vue b/src/views/dataUpload/saftyBaseInfo/productionInfo/index.vue new file mode 100644 index 0000000..7325ab5 --- /dev/null +++ b/src/views/dataUpload/saftyBaseInfo/productionInfo/index.vue @@ -0,0 +1,270 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <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="openDialog('add',{})">新增</el-button> + </el-col> + </el-row> + <el-table :data="reportData" style="width: 100%" height="calc(100% - 48px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column prop="id" label="id" show-overflow-tooltip></el-table-column> + <el-table-column prop="createTime" label="上报时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="craftName" label="工艺名称" show-overflow-tooltip></el-table-column> + <el-table-column prop="craftContent" label="工艺简介" show-overflow-tooltip></el-table-column> + <el-table-column prop="mainProdEquip" label="主要生产设备" show-overflow-tooltip></el-table-column> + <el-table-column prop="keyParts" label="重点部位" show-overflow-tooltip></el-table-column> + <el-table-column prop="hazardCode" label="重大危险源" show-overflow-tooltip></el-table-column> + <el-table-column prop="msds" label="涉及的危险化学品" show-overflow-tooltip></el-table-column> + <el-table-column prop="hazardCharacteristic" label="工艺危险特点" show-overflow-tooltip></el-table-column> + <el-table-column prop="parameterIndex" label="重点监控工艺参数指标" show-overflow-tooltip></el-table-column> + <el-table-column prop="controlMean" label="现有安全控制手段" show-overflow-tooltip></el-table-column> + <el-table-column prop="craftDraw" label="工艺图纸" show-overflow-tooltip> + <template #default="scope"> + <el-button v-if="scope.row.craftDraw !== ''" v-for="item in scope.row.craftDraw.split(',')" size="small" text type="primary" @click="openFile(item)">查看</el-button> + </template> + </el-table-column> + <el-table-column prop="reactionType" label="反应类型" show-overflow-tooltip></el-table-column> + <el-table-column prop="keyMonitorUnit" label="重点监控单元" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="140"> + <template #default="scope"> + <el-button size="small" text type="primary" @click="openDialog('update',scope.row)">重新上报</el-button> + <el-button style="color: red" 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="listQuery.pageIndex" background v-model:page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> + </div> + </div> + </div> + </div> + <add-report ref="reportRef" @refresh="getData"></add-report> + </div> +</template> + +<script lang="ts"> +import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue' +import { ElMessageBox, ElMessage } from 'element-plus' +import { Plus } from '@element-plus/icons-vue' +import addReport from "./components/addReport.vue" +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; +import axios from "axios"; +import Cookies from "js-cookie"; + +// 定义接口来定义对象的类型 +interface TableDataRow { + id: number|null + reportTime: string + craftName: string + craftContent: string + mainProdEquip: string + keyParts: string + hazardCode: string + msds: string + hazardCharacter: string + parameterIndex: string + controlMean: string + craftDraw: string + reactionType: string + keyMonitorUnit: string +} +interface TableDataState { + reportData: [], + listQuery: { + searchParams: {} + pageIndex: number + pageSize: number + } + total: null | number + baseUrl: string +} + +export default defineComponent({ + name: 'productionInfo', + components: {addReport }, + setup() { + const reportRef= ref(); + const state = reactive<TableDataState>({ + reportData: [], + listQuery: { + searchParams: {}, + pageIndex: 1, + pageSize: 10 + }, + total: null, + baseUrl: import.meta.env.VITE_API_URL + }); + + // 页面加载时 + onMounted(() => { + getData() + console.log(state.baseUrl) + }); + + const getData = async ()=>{ + const res = await judgeReportApi().getProductList(state.listQuery) + if(res.data.code == 200){ + state.reportData = res.data.data + state.total = res.data.total + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + } + + const openDialog=(type:string,data:object)=>{ + reportRef.value.open(type,data) + } + + // 删除用户 + const onRowDel = (row: TableDataRow) => { + ElMessageBox.confirm(`此操作将永久删除账户名称:“${row.craftName}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + const res = await judgeReportApi().delProduct({ids: [row.id]}) + if(res.data.code == 200){ + ElMessage({ + type: 'success', + message: '删除成功' + }) + await getData() + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.listQuery.pageSize = val; + getData() + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.listQuery.pageIndex = val; + getData() + }; + + const openFile=(file: string)=>{ + axios.get(import.meta.env.VITE_API_URL + file,{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: res.data.type}) + link.style.display = "none"; + link.href = URL.createObjectURL(blob); // 创建URL + window.open(link.href) + } else { + ElMessage({ + type: 'warning', + message: '文件读取失败' + }); + } + }) + } + + return { + reportRef, + openDialog, + openFile, + getData, + onRowDel, + onHandleSizeChange, + 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/intellectInspect/inspectBasic/discriminate/components/RFIDDialog.vue b/src/views/intellectInspect/inspectBasic/discriminate/components/RFIDDialog.vue index e9b55fb..c39453d 100644 --- a/src/views/intellectInspect/inspectBasic/discriminate/components/RFIDDialog.vue +++ b/src/views/intellectInspect/inspectBasic/discriminate/components/RFIDDialog.vue @@ -14,12 +14,12 @@ </el-form-item> </el-col> <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> - <el-form-item label="处理人所属车间" prop="exceptionHandlerDepId"> - <el-cascader @change="getUser" :options="departmentData" :props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName' }" placeholder="请输入RFID所属车间" clearable class="input-add" v-model="RFIDForm.exceptionHandlerDepId"> </el-cascader> + <el-form-item label="处理人所属车间"> + <el-cascader @change="getUser" :options="departmentData" filterable :props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName'}" placeholder="请输入RFID所属车间" clearable class="input-add" v-model="RFIDForm.exceptionHandlerDepId"> </el-cascader> </el-form-item> </el-col> <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> - <el-form-item label="异常处理人" prop="exceptionHandlerId"> + <el-form-item label="异常处理人"> <el-select v-model="RFIDForm.exceptionHandlerId" filterable class="input-add" placeholder="请输入异常处理人"> <el-option v-for="item in userList" :key="item.uid" :label="item.realName" :value="item.uid"></el-option> </el-select> @@ -27,7 +27,7 @@ </el-col> <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> <el-form-item label="RFID所属车间" prop="rfidDepartmentId"> - <el-cascader :options="departmentData" :props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName' }" placeholder="请输入RFID所属车间" clearable class="input-add" v-model="RFIDForm. rfidDepartmentId"> </el-cascader> + <el-cascader :options="departmentData" filterable :props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName' }" placeholder="请输入RFID所属车间" clearable class="input-add" v-model="RFIDForm. rfidDepartmentId"> </el-cascader> </el-form-item> </el-col> <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> @@ -108,8 +108,8 @@ rfid: [{ required: true, message: '请填写RFID编码', trigger: 'blur' }], rfidName: [{ required: true, message: '请填写RFID名称', trigger: 'change' }], rfidDepartmentId: [{ required: true, message: '请选择', trigger: 'change' }], - exceptionHandlerDepId: [{ required: true, message: '请选择', trigger: 'change' }], - exceptionHandlerId: [{ required: true, message: '请选择', trigger: 'change' }] + // exceptionHandlerDepId: [{ required: true, message: '请选择', trigger: 'change' }], + // exceptionHandlerId: [{ required: true, message: '请选择', trigger: 'change' }] }, fileList: [], diff --git a/src/views/intellectInspect/inspectBasic/discriminate/index.vue b/src/views/intellectInspect/inspectBasic/discriminate/index.vue index 8c99fb4..d8e4506 100644 --- a/src/views/intellectInspect/inspectBasic/discriminate/index.vue +++ b/src/views/intellectInspect/inspectBasic/discriminate/index.vue @@ -22,6 +22,7 @@ </el-icon> 新增RFID </el-button> + <el-button type="primary" :icon="Upload" size="default" @click="openUploadDialog('id')">导入</el-button> </div> <el-table :data="RFIDData.data" style="width: 100%"> <el-table-column type="index" label="序号" width="60" /> @@ -47,6 +48,7 @@ <br /> </el-card> <RFIDDialog ref="RFIDDialogRef" @refreshRFID="initRFIDTableData" /> + <upload-dialog ref="uploadRef" @refresh="initRFIDTableData"></upload-dialog> </div> </template> @@ -54,8 +56,9 @@ import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue'; import { ElMessageBox, ElMessage } from 'element-plus'; import RFIDDialog from './components/RFIDDialog.vue'; +import uploadDialog from '/@/views/intellectInspect/inspectTaskManage/inspectTask/components/upload.vue' import { RFIDApi } from '/@/api/intellectInspectSystem/RFID'; -import { Edit, View, Plus, Delete, Refresh, Search, Download } from '@element-plus/icons-vue'; +import { Edit, View, Plus, Delete, Refresh, Search, Download, Upload } from '@element-plus/icons-vue'; import type { UploadProps, UploadUserFile } from 'element-plus' import {departmentApi} from "/@/api/systemManage/department"; // 定义接口来定义对象的类型 @@ -85,9 +88,10 @@ export default defineComponent({ name: 'RFID', - components: { RFIDDialog, Edit, Delete }, + components: { RFIDDialog, uploadDialog }, setup() { const RFIDDialogRef = ref(); + const uploadRef = ref() const state = reactive<TableDataState>({ RFIDData: { data: [], @@ -159,6 +163,10 @@ } }; + const openUploadDialog = (type: string)=>{ + uploadRef.value.open(type) + } + const handleSearch = () => { initRFIDTableData(); }; @@ -181,13 +189,16 @@ return { Edit, Delete, + Upload, + uploadRef, + openUploadDialog, handleSearch, onOpenDialogRef, onHandleSizeChange, onDelProductionDevice, onHandleCurrentChange, - RFIDDialog, RFIDDialogRef, + initRFIDTableData, ...toRefs(state) }; diff --git a/src/views/intellectInspect/inspectBasic/facility/components/facilityAreaDialog.vue b/src/views/intellectInspect/inspectBasic/facility/components/facilityAreaDialog.vue index 544a43a..de6a87e 100644 --- a/src/views/intellectInspect/inspectBasic/facility/components/facilityAreaDialog.vue +++ b/src/views/intellectInspect/inspectBasic/facility/components/facilityAreaDialog.vue @@ -17,7 +17,7 @@ </el-col> <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> <el-form-item label="所属部门" prop="regionDepartmentId"> - <el-cascader :options="departmentData" :props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName' }" placeholder="请输入RFID所属车间" clearable class="input-add" v-model="facilityAreaForm.regionDepartmentId"> </el-cascader> + <el-cascader :options="departmentData" filterable :props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName' }" placeholder="请选择所属部门" clearable class="input-add" v-model="facilityAreaForm.regionDepartmentId"> </el-cascader> </el-form-item> </el-col> </el-row> diff --git a/src/views/intellectInspect/inspectBasic/facility/index.vue b/src/views/intellectInspect/inspectBasic/facility/index.vue index 347224b..785ba6a 100644 --- a/src/views/intellectInspect/inspectBasic/facility/index.vue +++ b/src/views/intellectInspect/inspectBasic/facility/index.vue @@ -24,6 +24,7 @@ </el-icon> 新增设备区域 </el-button> + <el-button type="primary" :icon="Upload" size="default" @click="openUploadDialog('区域')">导入</el-button> </div> <el-table :data="facilityAreaData.data" style="width: 100%"> <el-table-column type="index" label="序号" width="60" /> @@ -47,6 +48,7 @@ <br /> </el-card> <facilityAreaDialog ref="facilityAreaDialogRef" @refreshFacilityArea="initFacilityAreaTableData" /> + <upload-dialog ref="uploadRef" @refresh="initFacilityAreaTableData"></upload-dialog> </div> </template> @@ -54,8 +56,9 @@ import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue'; import { ElMessageBox, ElMessage } from 'element-plus'; import facilityAreaDialog from './components/facilityAreaDialog.vue'; +import uploadDialog from '/@/views/intellectInspect/inspectTaskManage/inspectTask/components/upload.vue' import { facilityAreaApi } from '/@/api/intellectInspectSystem/facilityAreaManage'; -import { Edit, View, Plus, Delete, Refresh, Search, Download } from '@element-plus/icons-vue'; +import { Edit, View, Plus, Delete, Refresh, Search, Download, Upload } from '@element-plus/icons-vue'; // 定义接口来定义对象的类型 interface TableData { @@ -89,9 +92,10 @@ export default defineComponent({ name: 'facilityArea', - components: { facilityAreaDialog, Edit, Delete }, + components: { facilityAreaDialog, Edit, Delete, uploadDialog }, setup() { const facilityAreaDialogRef = ref(); + const uploadRef = ref() const state = reactive<TableDataState>({ facilityAreaData: { data: [], @@ -137,6 +141,11 @@ const onOpenDialogRef = (type: string, value: any) => { facilityAreaDialogRef.value.openFacilityAreaDialog(type, value, state.facilityAreaTypeList); }; + + const openUploadDialog = (type: string)=>{ + uploadRef.value.open(type) + } + // 删除 const onDelProductionDevice = (row: any) => { ElMessageBox.confirm(`此操作将永久删除该条设备区域:“${row.region}”,是否继续?`, '提示', { @@ -185,6 +194,9 @@ return { Edit, Delete, + Upload, + uploadRef, + openUploadDialog, handleSearch, onOpenDialogRef, onHandleSizeChange, diff --git a/src/views/intellectInspect/inspectBasic/inspectPoint/index.vue b/src/views/intellectInspect/inspectBasic/inspectPoint/index.vue index 62064e6..7a4211e 100644 --- a/src/views/intellectInspect/inspectBasic/inspectPoint/index.vue +++ b/src/views/intellectInspect/inspectBasic/inspectPoint/index.vue @@ -24,6 +24,7 @@ </el-icon> 新增巡检点 </el-button> + <el-button type="primary" :icon="Upload" size="default" @click="openUploadDialog('点')">导入</el-button> </div> <el-table :data="inspectPointData.data" style="width: 100%"> <el-table-column type="index" label="序号" width="60" /> @@ -47,6 +48,7 @@ <br /> </el-card> <inspectPointDialog ref="inspectPointDialogRef" @refreshInspectPoint="initInspectPointTableData" /> + <upload-dialog ref="uploadRef" @refresh="initInspectPointTableData"></upload-dialog> </div> </template> @@ -54,9 +56,10 @@ import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue'; import { ElMessageBox, ElMessage } from 'element-plus'; import inspectPointDialog from './components/inspectPointDialog.vue'; +import uploadDialog from '/@/views/intellectInspect/inspectTaskManage/inspectTask/components/upload.vue' import { inspectPointApi } from '/@/api/intellectInspectSystem/inspectPointManage'; import { facilityAreaApi } from '/@/api/intellectInspectSystem/facilityAreaManage'; -import { Edit, View, Plus, Delete, Refresh, Search, Download } from '@element-plus/icons-vue'; +import { Edit, View, Plus, Delete, Refresh, Search, Download, Upload } from '@element-plus/icons-vue'; import { RFIDApi } from '/@/api/intellectInspectSystem/RFID'; // 定义接口来定义对象的类型 @@ -89,9 +92,10 @@ export default defineComponent({ name: 'productionDevice', - components: { inspectPointDialog, Edit, Delete }, + components: { inspectPointDialog, Edit, Delete, uploadDialog }, setup() { const inspectPointDialogRef = ref(); + const uploadRef = ref() const state = reactive<TableDataState>({ inspectPointData: { data: [], @@ -151,6 +155,11 @@ const onOpenDialogRef = (type: string, value: any) => { inspectPointDialogRef.value.openInspectPointDialog(type, value, state.regionNameList, state.RFIDList); }; + + const openUploadDialog = (type: string)=>{ + uploadRef.value.open(type) + } + // 删除 const onDelProductionDevice = (row: any) => { ElMessageBox.confirm(`此操作将永久删除该巡检点:“${row.code}”,是否继续?`, '提示', { @@ -200,6 +209,9 @@ return { Edit, Delete, + Upload, + uploadRef, + openUploadDialog, handleSearch, onOpenDialogRef, onHandleSizeChange, diff --git a/src/views/intellectInspect/inspectTaskManage/inspectTask/components/inspectTaskDialog.vue b/src/views/intellectInspect/inspectTaskManage/inspectTask/components/inspectTaskDialog.vue index 610775a..237c0db 100644 --- a/src/views/intellectInspect/inspectTaskManage/inspectTask/components/inspectTaskDialog.vue +++ b/src/views/intellectInspect/inspectTaskManage/inspectTask/components/inspectTaskDialog.vue @@ -99,7 +99,7 @@ <!-- </div>--> <div class="text item" v-for="i in RFIDList"> <div v-if="i.id == item.rfidId"> - 关联RFID:<span>{{ i.rfidName }}</span> + 关联RFID:<span>{{ i.rfid }}</span> </div> </div> <!-- <div class="text item">--> @@ -151,11 +151,11 @@ <el-option v-for="item in inspectPointAllList" :key="item.id" :value="item.id" :label="item.code"></el-option> </el-select> </el-form-item> - <el-form-item label="所属设备区域" prop="regionId"> - <el-input v-model="inspectPointForm.regionId" class="input-add" readonly /> + <el-form-item label="所属设备区域" prop="region"> + <el-input v-model="inspectPointForm.region" class="input-add" readonly /> </el-form-item> - <el-form-item label="关联RFID" prop="rfidId"> - <el-input v-model="inspectPointForm.rfidId" class="input-add" readonly /> + <el-form-item label="关联RFID" prop="rfid"> + <el-input v-model="inspectPointForm.rfid" class="input-add" readonly /> </el-form-item> <el-form-item label="选择巡检指标" prop="quotaId"> <el-select v-model="inspectPointForm.quotaId" @change="giveQuotaUnit" placeholder="请选择巡检指标" class="input-add"> @@ -253,7 +253,7 @@ code: string; regionId: number; rfidId: number; - rfidName: string; + rfid: string; region: string; } interface classGroup { @@ -275,8 +275,10 @@ pointId: number | null; pointUuid: string | null; regionId: number | null; + region: string regionUuid: string | null; rfidId: number | null; + rfid: string quotaId: number | null; quotaUnit: string | null; execSequence: number | null; @@ -305,8 +307,10 @@ pointId: null, pointUuid: null, regionId: null, + region: '', regionUuid: null, rfidId: null, + rfid: '', quotaId: null, quotaUnit: null, execSequence: null, @@ -395,8 +399,10 @@ pointId: null, pointUuid: null, regionId: null, + region: '', regionUuid: null, rfidId: null, + rfid: '', quotaId: null, quotaUnit: null, execSequence: null, @@ -566,7 +572,9 @@ const giveRegionAndRFID = () => { data.inspectPointForm.regionId = data.inspectPointAllList.find((item) => item.id === data.inspectPointForm.pointId)?.regionId as number; + data.inspectPointForm.region = data.inspectPointAllList.find((item) => item.id === data.inspectPointForm.pointId)?.region as string; data.inspectPointForm.rfidId = data.inspectPointAllList.find((item) => item.id === data.inspectPointForm.pointId)?.rfidId as number; + data.inspectPointForm.rfid = data.inspectPointAllList.find((item) => item.id === data.inspectPointForm.pointId)?.rfid as string; }; const giveClassGroup = () => { diff --git a/src/views/intellectInspect/inspectTaskManage/inspectTask/components/upload.vue b/src/views/intellectInspect/inspectTaskManage/inspectTask/components/upload.vue new file mode 100644 index 0000000..8aec706 --- /dev/null +++ b/src/views/intellectInspect/inspectTaskManage/inspectTask/components/upload.vue @@ -0,0 +1,204 @@ +<template> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowDialog" width="50%"> + <el-form :model="form" size="default" ref="formRef" :rules="rules" 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="模板"> + <el-button type="primary" @click="downloadFile">点击下载模板</el-button> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="文件上传"> + <el-upload accept=".xlsx,.xls" :auto-upload="false" method="post" :on-exceed="showTip" :limit='1' v-model:file-list="fileList" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove"> + <el-button type="primary">点击上传</el-button> + <template #tip> + <div class="el-upload__tip">尺寸小于2M,最多可上传1份</div> + </template> + </el-upload> + </el-form-item> + </el-col> + </el-row> + </el-form> + <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> + </div> +</template> + +<script lang="ts"> +import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import axios from "axios"; +import Cookies from "js-cookie"; +import * as XLSX from "xlsx"; +import {judgeReportApi} from "/@/api/dataUpload/saftyBaseInfo/judgeReport"; +import { lineApi } from "/@/api/intelligentLine/index"; + +// 定义接口来定义对象的类型 +interface DataState { + title: string; + isShowDialog: boolean; + form: { + files: any + } + rules:{}, + fileList: [], + uploadUrl: string, + header: {} +} + +export default defineComponent({ + name: 'reportDialog', + setup(props, context) { + const formRef = ref() + const state = reactive<DataState>({ + title: '', + isShowDialog: false, + form: { + files: '' + }, + rules:{ + }, + fileList: [], + uploadUrl: '', + header: { + uid: Cookies.get('uid'), + Authorization: Cookies.get('token') + } + }) + + // 页面加载时 + onMounted(() => { + + }) + // 打开弹窗 + const open = (type: string) => { + state.isShowDialog = true; + if (type === '任务') { + state.title = '巡检单元导入'; + } + if(type == 'id'){ + state.title = '巡检RFID导入'; + } + if(type == '区域'){ + state.title = '巡检区域导入'; + } + if(type == '点'){ + state.title = '巡检点导入'; + } + state.form = { + files: '' + } + state.fileList = [] + }; + + + + // 图片上传 + const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); + } + + const picSize = async(rawFile: any) => { + if(rawFile.size / 1024 / 1024 > 2){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过2M' + }); + return false + } + } + + + const handleRemove = (file, uploadFiles,type) => { + state.fileList = [] + } + + const downloadFile=()=>{ + let filePath = '' + let name = '' + if(state.title == '巡检单元导入'){ + filePath = 'excelFiles/missionUpload.xlsx' + name = '巡检单元导入模板.xlsx' + } + if(state.title == '巡检RFID导入'){ + filePath = 'excelFiles/RFIDUpload.xlsx' + name = '巡检RFID导入模板.xlsx' + } + if(state.title == '巡检区域导入'){ + filePath = 'excelFiles/regionUpload.xlsx' + name = '巡检区域导入模板.xlsx' + } + if(state.title == '巡检点导入'){ + filePath = 'excelFiles/pointUpload.xlsx' + name = '巡检点导入模板.xlsx' + } + const link = document.createElement('a') + link.href = filePath + link.target = '_blank' + link.download = name + link.click() + } + + // 新增修改 + const onSubmit = async () => { + if(state.fileList.length == 0){ + ElMessage({ + type: 'warning', + message: '请先选择导入文件' + }) + return + }else{ + let res = {} + if(state.title == '巡检单元导入'){ + res = await lineApi().uploadMission({file: state.fileList[0].raw}) + } + if(state.title == '巡检RFID导入'){ + res = await lineApi().uploadRfid({file: state.fileList[0].raw}) + } + if(state.title == '巡检区域导入'){ + res = await lineApi().uploadRegion({file: state.fileList[0].raw}) + } + if(state.title == '巡检点导入'){ + res = await lineApi().uploadPoint({file: state.fileList[0].raw}) + } + if(res.data.code == 200){ + ElMessage({ + type: 'success', + message: res.data.msg, + duration: 4000 + }) + state.fileList = [] + state.isShowDialog = false + context.emit('refresh') + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg, + duration: 4000 + }) + } + } + } + + return { + formRef, + downloadFile, + showTip, + picSize, + handleRemove, + open, + onSubmit, + ...toRefs(state) + }; + } +}); +</script> diff --git a/src/views/intellectInspect/inspectTaskManage/inspectTask/index.vue b/src/views/intellectInspect/inspectTaskManage/inspectTask/index.vue index 5feb9f9..bb6a6fd 100644 --- a/src/views/intellectInspect/inspectTaskManage/inspectTask/index.vue +++ b/src/views/intellectInspect/inspectTaskManage/inspectTask/index.vue @@ -31,12 +31,13 @@ <el-row class="cardTop"> <el-col :span="12" class="mainCardBtn"> <el-button type="primary" :icon="Plus" size="default" @click="openInspectTaskDialog('新增', {})">新增</el-button> + <el-button type="primary" :icon="Upload" size="default" @click="openUploadDialog('任务')">导入</el-button> <!-- <el-button type="danger" :icon="Delete" size="default" plain>删除</el-button>--> </el-col> <el-button type="primary" :icon="Refresh" size="default" /> </el-row> <el-table ref="multipleTableRef" :data="tableData.inspectTaskData" style="width: 100%" height="calc(100% - 100px)" :header-cell-style="{ background: '#fafafa' }" @selection-change="handleSelectionChange"> - <el-table-column type="selection" width="55" /> +<!-- <el-table-column type="selection" width="55" />--> <el-table-column property="unitName" label="任务名称" /> <el-table-column property="workType" label="任务类型"> <template #default="scope"> @@ -121,15 +122,17 @@ </div> </div> <inspect-task-dialog ref="inspectTaskDialogRef" @refreshInspectTask="getInspectionTask"></inspect-task-dialog> + <upload-dialog ref="uploadRef" @refresh="getInspectionTask"></upload-dialog> </div> </template> <script lang="ts"> import { toRefs, reactive, ref, onMounted } from 'vue'; -import { Edit, View, Plus, Delete, Refresh, Search, Download } from '@element-plus/icons-vue'; +import { Edit, View, Plus, Delete, Refresh, Search, Download, Upload } from '@element-plus/icons-vue'; import { ElTable, ElMessage, ElMessageBox } from 'element-plus'; import { inspectTaskApi } from '/@/api/intellectInspectSystem/inspectTask'; -import inspectTaskDialog from './components/inspectTaskDialog.vue'; +import inspectTaskDialog from './components/inspectTaskDialog.vue' +import uploadDialog from './components/upload.vue' import { departmentApi } from '/@/api/systemManage/department'; import { teamManageApi } from '/@/api/systemManage/personShiftManage/teamManage'; import { inspectPointApi } from '/@/api/intellectInspectSystem/inspectPointManage'; @@ -178,9 +181,10 @@ } export default { name: 'index', - components: { inspectTaskDialog }, + components: { inspectTaskDialog, uploadDialog }, setup() { const inspectTaskDialogRef = ref(); + const uploadRef = ref() const state = reactive<stateType>({ tableData: { inspectTaskData: [], @@ -425,6 +429,10 @@ } }; + const openUploadDialog = (type: string)=>{ + uploadRef.value.open(type) + } + // 分页改变 const onHandleSizeChange = (val: number) => { state.tableData.params.pageSize = val; @@ -467,7 +475,9 @@ Delete, Refresh, Plus, + Upload, reset, + openUploadDialog, changeStatus, changeGroup, parseNumber, @@ -476,6 +486,7 @@ onHandleSizeChange, onHandleCurrentChange, inspectTaskDialogRef, + uploadRef, openInspectTaskDialog, ...toRefs(state) }; diff --git a/src/views/intellectInspect/intelligentLine/index.vue b/src/views/intellectInspect/intelligentLine/index.vue index bacc19e..b447b2c 100644 --- a/src/views/intellectInspect/intelligentLine/index.vue +++ b/src/views/intellectInspect/intelligentLine/index.vue @@ -147,6 +147,7 @@ initialY:number|null xOffset:number|null yOffset:number|null + timer: null | any } export default { name: 'intelligentLine', @@ -168,11 +169,12 @@ initialX: 0, initialY: 0, xOffset: 0, - yOffset: 0 + yOffset: 0, + timer: null }); onMounted(() => { - setInterval(() => { + state.timer = setInterval(() => { state.present = new Date().toLocaleString(); }, 1000); let curId = route.query.id @@ -294,6 +296,7 @@ console.log('socket已经关闭'); }; }) + clearInterval(state.timer) draggableElement.value.removeEventListener('mousedown', handleMouseDown); draggableElement.value.removeEventListener('mousemove', handleMouseMove); draggableElement.value.removeEventListener('mouseup', handleMouseUp); diff --git a/src/views/loginPage/component/accountLogin.vue b/src/views/loginPage/component/accountLogin.vue index cbe9579..d67fed6 100644 --- a/src/views/loginPage/component/accountLogin.vue +++ b/src/views/loginPage/component/accountLogin.vue @@ -311,7 +311,6 @@ onSignIn, identify, confirmIdentity, - validatePass, validatePass2, ...toRefs(state) }; diff --git a/src/views/loginPage/loginPage.vue b/src/views/loginPage/loginPage.vue index ee6db15..5316985 100644 --- a/src/views/loginPage/loginPage.vue +++ b/src/views/loginPage/loginPage.vue @@ -7,7 +7,7 @@ <el-col :md="12"> <div class="loginContL"> <div class="apTitleT">新疆国泰新华</div> - <div class="apTitleB">安全风险预警监测系统(试运行)</div> + <div class="apTitleB">安全风险预警监测系统</div> <span></span> </div> </el-col> diff --git a/src/views/newHome/index.vue b/src/views/newHome/index.vue index e04132f..5e11dcb 100644 --- a/src/views/newHome/index.vue +++ b/src/views/newHome/index.vue @@ -21,7 +21,7 @@ <div class="leftCont"></div> <div class="topCont"> <div class="topInfo"> - <div class="topTit">新疆国泰新华<br />安全风险预警监测系统(试运行)</div> + <div class="topTit">新疆国泰新华<br />安全风险预警监测系统</div> <div class="topTime"> <div class="time"> {{ time }} @@ -91,6 +91,16 @@ </div> </div> <img class="bgImg" src="../../assets/newMenu/card-12.png" /> + </div> + <div class="grid-content cont-bg-2" v-throttle @click="render('12')"> + <div class="toplayer"> + <img class="iconImg" src="../../assets/newMenu/icon14.png" /> + <div> + <div class="itemTit">监管数据融合互通系统</div> + <div class="enTit">Regulatory Data Integration and Interoperability System</div> + </div> + </div> + <img class="bgImg" src="../../assets/newMenu/card-14.png" /> </div> <div class="grid-content cont-bg-2" v-throttle @click="render('7')"> <div class="toplayer"> @@ -183,7 +193,7 @@ </template> <script lang="ts"> -import { toRefs, reactive, computed, defineComponent, onMounted } from 'vue'; +import {toRefs, reactive, computed, defineComponent, onMounted, onUnmounted} from 'vue'; import { storeToRefs } from 'pinia'; import { useThemeConfig } from '/@/stores/themeConfig'; import logoMini from '/@/assets/logo-mini.svg'; @@ -216,6 +226,7 @@ date: string; weekDay: string; dayTime: string; + timer: null | any } export default defineComponent({ @@ -250,7 +261,8 @@ date: '', weekDay: '', dayTime: '', - isScreenfull: false + isScreenfull: false, + timer: null }); const userName = computed(() =>{ @@ -360,7 +372,7 @@ window.open('http://10.211.134.139:5522/#/login'); } const toManLocation = () =>{ - window.open('http://10.211.134.138:8081/GUOTAI'); + window.open('http://124.88.37.66:8081/location_system_5.4.9/login/login.html?company=GUOTAI&version=5.4.9'); } const throttle = (renderMenu: any, delay: number) => { let flag = true; @@ -422,12 +434,17 @@ state.once += 1; NextLoading.done(); getDateTime(); - setInterval(() => { + state.timer = setInterval(() => { getDateTime(); - }, 1000); + }, 30000); // loginBg(); // loginApp() - }); + }) + + onUnmounted(() => { + clearInterval(state.timer) + }); + return { render, userName, diff --git a/src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue b/src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue index 6882547..11544dc 100644 --- a/src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue +++ b/src/views/newSpecialWorkSystem/workTicket/sqjl/index.vue @@ -50,6 +50,11 @@ <el-button type="primary" :icon="Refresh" size="default" @click="reLoadData()" /> </el-row> <el-table ref="multipleTableRef" :data="applyData" style="width: 100%" height="calc(100% - 100px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column property="workPermitNo" label="作业编号" align="center"> + <template #default="scope"> + {{scope.row.workPermitNo?scope.row.workPermitNo:'—'}} + </template> + </el-table-column> <el-table-column property="seDepName" label="事业部" align="center"/> <el-table-column property="applyDepName" label="作业所在车间" align="center"/> <el-table-column property="workContent" label="作业内容" align="center"/> @@ -87,7 +92,7 @@ {{scope.row.guardianList.length}} </template> </el-table-column> - <el-table-column label="风险研判" align="center"> + <el-table-column label="作业状态" align="center"> <template #default="scope"> <el-tag>{{ statusList.find(i=>i.value === scope.row.status)?.label }}</el-tag> </template> @@ -98,7 +103,7 @@ <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 :disabled="scope.row.status == 7 ? false : true" link type="primary" size="small" :icon="Download" @click="downLoadBtn(scope.row)">导出作业票</el-button>--> + <el-button link type="primary" size="small" :icon="Download" @click="downLoadRecord(scope.row)">作业票预览</el-button> </template> </el-table-column> </el-table> @@ -203,15 +208,15 @@ </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-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%">--> @@ -276,13 +281,10 @@ dialogDetails: boolean; dialogStatus: boolean; deleteDialog: boolean; - downLoadDialog: boolean; pageIndex1: number; pageSize1: number; chosenIndex: null | number; deleteId: null | number; - downLoadId: null | number; - downLoadName: string; totalSize1: number; activeName: string; addRecord: {}; @@ -340,13 +342,10 @@ dialogDetails: false, dialogStatus: false, deleteDialog: false, - downLoadDialog: false, addRecord: {}, details: {}, statusInfo: {}, deleteId: null, - downLoadId: null, - downLoadName: '', deleteArr: [], dep4List: [ {id:49,name:'电石事业部'}, @@ -567,26 +566,21 @@ state.deleteDialog = false; }; - // 导出图表 - const downLoadBtn = (row:any) =>{ - state.downLoadId = row.workApplyId; - state.downLoadName = row.workTypeDesc + row.workPermitNo - state.downLoadDialog = true; - } // 导出方法 - const downLoadRecord = async (data: any) => { + const downLoadRecord = (row: any) => { // let res = await workApplyApi().postPrinting(data); - axios.post(import.meta.env.VITE_API_URL + `/work/apply/printingPdf`,data,{headers:{'Content-Type': 'application/json','Authorization': `${Cookies.get('token')}`,'uid':`${Cookies.get('uid')}`},responseType: 'blob'}).then(res=>{ + console.log(row,555) + axios.post(import.meta.env.VITE_API_URL + `/specialwork9step/work/down/load/pdf`,{ id: row.id},{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", state.downLoadName + "作业证.pdf"); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); + link.setAttribute("download", row.workTypeDesc + row.workPermitNo + "作业证.pdf"); + document.body.appendChild(link) + window.open(link.href) + document.body.removeChild(link) } else { ElMessage({ type: 'warning', @@ -595,11 +589,6 @@ } }) - }; - - const conFirmDownLoad = () => { - downLoadRecord({ applyWorkId: state.downLoadId }); - state.downLoadDialog = false; }; const handleSizeChange1 = (val: number) => { @@ -649,9 +638,8 @@ viewRecord, viewStatus, deleteRecordBtn, - downLoadBtn, + downLoadRecord, conFirmDelete, - conFirmDownLoad, getListByPage, handleSizeChange1, handleCurrentChange1, diff --git a/src/views/newSpecialWorkSystem/workTicket/wdsp/index.vue b/src/views/newSpecialWorkSystem/workTicket/wdsp/index.vue index 84dfa62..51866d3 100644 --- a/src/views/newSpecialWorkSystem/workTicket/wdsp/index.vue +++ b/src/views/newSpecialWorkSystem/workTicket/wdsp/index.vue @@ -238,14 +238,14 @@ export default defineComponent({ name: 'myApproval', components: { - fire: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/fireLog.vue')), - space: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/spaceLog.vue')), - hoist: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/hoistLog.vue')), - ground: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/groundLog.vue')), - broken: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/brokenLog.vue')), - height: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/heightLog.vue')), - power: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/powerLog.vue')), - plate: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/plateLog.vue')) + fire: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsp/components/fireLog.vue')), + space: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsp/components/spaceLog.vue')), + hoist: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsp/components/hoistLog.vue')), + ground: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsp/components/groundLog.vue')), + broken: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsp/components/brokenLog.vue')), + height: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsp/components/heightLog.vue')), + power: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsp/components/powerLog.vue')), + plate: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsp/components/plateLog.vue')) }, setup() { const userInfo = useUserInfo(); diff --git a/src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue b/src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue index 5eee2f8..8502469 100644 --- a/src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue +++ b/src/views/newSpecialWorkSystem/workTicket/wdsq/index.vue @@ -6,7 +6,7 @@ <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="结束时间" /> + <el-date-picker v-model="timeRange" value-format="YYYY-MM-DD" type="daterange" @change="giveTime" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" /> </div> <div class="basic-line" style="display:flex;white-space:nowrap;line-height: 40px"> <span>负责人:</span> @@ -44,7 +44,7 @@ <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="Download" size="default" @click="exportSheet()">导出当日记录</el-button> + <el-button type="primary" :icon="Download" size="default" @click="exportSheet()">导出记录</el-button> </el-col> <el-button type="primary" :icon="Refresh" size="default" @click="reLoadData()" /> </el-row> @@ -93,7 +93,7 @@ <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"> + <el-table-column fixed="right" label="操作" align="center" width="150"> <template #default="scope"> <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> @@ -293,7 +293,7 @@ const giveTime = () => { if (state.timeRange && state.timeRange !== null) { state.searPara.startTime = state.timeRange[0]; - state.searPara.endTime = state.timeRange[1]; + state.searPara.endTime = state.timeRange[1] } else { state.searPara.startTime = ''; state.searPara.endTime = ''; @@ -382,6 +382,7 @@ // 关键词查询记录 const searchRecord = async () => { + state.pageIndex1 = 1 getListByPage(); }; // 重置搜索 @@ -485,13 +486,17 @@ // 导出方法 const exportSheet = async () => { // let res = await workApplyApi().postPrinting(data); - axios.post(import.meta.env.VITE_API_URL + `/specialwork9step/work/export/excel`,{},{headers:{'Content-Type': 'application/json','Authorization': `${Cookies.get('token')}`,'uid':`${Cookies.get('uid')}`},responseType: 'blob'}).then(res=>{ + axios.post(import.meta.env.VITE_API_URL + `/specialwork9step/work/export/excel`,{startTime: state.searPara.startTime,endTime: state.searPara.endTime,secondDepId: state.searPara.secondDepId},{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/excel'}) link.style.display = "none"; link.href = URL.createObjectURL(blob); // 创建URL - link.setAttribute("download", "作业申报记录.xlsx"); + if(state.searPara.startTime !== '' && state.searPara.endTime !==''){ + link.setAttribute("download", state.searPara.startTime + '—' + state.searPara.endTime +"作业申报记录.xlsx") + }else{ + link.setAttribute("download", "作业申报记录.xlsx") + } document.body.appendChild(link); link.click(); document.body.removeChild(link); diff --git a/src/views/riskWarningSys/warningBigScreen/index.vue b/src/views/riskWarningSys/warningBigScreen/index.vue index 53f4a47..15c75bc 100644 --- a/src/views/riskWarningSys/warningBigScreen/index.vue +++ b/src/views/riskWarningSys/warningBigScreen/index.vue @@ -215,6 +215,7 @@ depProps: object; departList: Array<any>; lastTrain: number | null; + timer: any|null } export default defineComponent({ name: 'warningScreen', @@ -256,13 +257,14 @@ emitPath: false }, departList: [], + timer: null }); // 页面载入时执行方法 onMounted(() => { state.depValue = screenTheme.value.depId getTime(); getAllDepartment(); - setInterval(()=>{ + state.timer = setInterval(()=>{ getTime() },1000) getTheme() @@ -363,7 +365,7 @@ }; onBeforeUnmount(() =>{ - clearInterval() + clearInterval(state.timer) }) // 隐患状态列表 // const getDeviceRecord = async () => { diff --git a/src/views/specialWorkSystem/specialIndex/index.vue b/src/views/specialWorkSystem/specialIndex/index.vue index ce6908a..9e3b2f9 100644 --- a/src/views/specialWorkSystem/specialIndex/index.vue +++ b/src/views/specialWorkSystem/specialIndex/index.vue @@ -252,14 +252,15 @@ </div> </div> <el-dialog v-model="dialogDetails" title="作业申请详情" center> - <fire v-if="dialogType == 1" :details = details></fire> - <space v-else-if="dialogType == 2" :details = details></space> - <hoist v-else-if="dialogType == 3" :details = details></hoist> - <ground v-else-if="dialogType == 4" :details = details></ground> - <broken v-else-if="dialogType == 5" :details = details></broken> - <height v-else-if="dialogType == 6" :details = details></height> - <power v-else-if="dialogType == 7" :details = details></power> - <plate v-else :details = details></plate> +<!-- <fire v-if="dialogType == 1" :details = details></fire>--> +<!-- <space v-else-if="dialogType == 2" :details = details></space>--> +<!-- <hoist v-else-if="dialogType == 3" :details = details></hoist>--> +<!-- <ground v-else-if="dialogType == 4" :details = details></ground>--> +<!-- <broken v-else-if="dialogType == 5" :details = details></broken>--> +<!-- <height v-else-if="dialogType == 6" :details = details></height>--> +<!-- <power v-else-if="dialogType == 7" :details = details></power>--> +<!-- <plate v-else :details = details></plate>--> +<!-- <detail-log :type=dialogType :statusList=statusList :details = details></detail-log>--> <template #footer> <span class="dialog-footer"> <el-button type="primary" @click="dialogDetails = false" @@ -371,24 +372,24 @@ 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')), - 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')) + // fire: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/fireLog.vue')), + // space: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/spaceLog.vue')), + // hoist: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/hoistLog.vue')), + // ground: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/groundLog.vue')), + // broken: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/brokenLog.vue')), + // height: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/heightLog.vue')), + // power: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/powerLog.vue')), + // plate: defineAsyncComponent(() => import('/@/views/newSpecialWorkSystem/workTicket/wdsq/components/plateLog.vue')) }, setup() { - const userInfo = useUserInfo(); - const { userInfos } = storeToRefs(userInfo); - const router = useRouter(); + const userInfo = useUserInfo() + const { userInfos } = storeToRefs(userInfo) + const router = useRouter() const reviewFormRef = ref<FormInstance>() const zyfb = ref("eChartZyfb" + Date.now() + Math.random()) const slfx = ref("eChartSlfx" + Date.now() + Math.random()) const zyqs = ref("eChartZyqs" + Date.now() + Math.random()) - const videoRef = ref(); + const videoRef = ref() const recordRef = ref() const state = reactive<stateType>({ pageIndex: 1, @@ -897,44 +898,44 @@ }; // 查看记录 - const viewDetail = (row: any) => { - state.dialogType = row.workType - state.details = JSON.parse(JSON.stringify(row)); - if(state.details.workDetail.otherSpecialWork == '' || !state.details.workDetail.otherSpecialWork){ - state.details.workDetail.otherSpecialWork=[] - } - else { - const a = state.details.workDetail.otherSpecialWork - state.details.workDetail.otherSpecialWork = a.split(',').map((item) => { - return state.workTypeList.find((i: { id: number }) => i.id === Number(item))?.name; - }); - } - if(state.details.workDetail.involvedDepIds == '' || !state.details.workDetail.involvedDepIds){ - state.details.workDetail.involvedDepIds=[] - } - else { - const a = state.details.workDetail.involvedDepIds - state.details.workDetail.involvedDepIds = a.split(',').map((item) => { - return state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(item))?.depName; - }); - } - if(state.details.workDetail.csDepId){ - state.details.workDetail.csDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.csDepId))?.depName; - } - if(state.details.workDetail.operationDepId){ - state.details.workDetail.operationDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.operationDepId))?.depName; - } - if(state.details.workDetail.gbPath){ - state.details.workDetail.gbPath = state.details.workDetail.gbPath.split(',') - } - if(state.details.workDetail.bcPath){ - state.details.workDetail.bcPath = state.details.workDetail.bcPath.split(',') - } - if(state.details.workDetail.bpLocationMapPath){ - state.details.workDetail.bpLocationMapPath = state.details.workDetail.bpLocationMapPath.split(',') - } - state.dialogDetails = true; - }; + // const viewDetail = (row: any) => { + // state.dialogType = row.workType + // state.details = JSON.parse(JSON.stringify(row)); + // if(state.details.workDetail.otherSpecialWork == '' || !state.details.workDetail.otherSpecialWork){ + // state.details.workDetail.otherSpecialWork=[] + // } + // else { + // const a = state.details.workDetail.otherSpecialWork + // state.details.workDetail.otherSpecialWork = a.split(',').map((item) => { + // return state.workTypeList.find((i: { id: number }) => i.id === Number(item))?.name; + // }); + // } + // if(state.details.workDetail.involvedDepIds == '' || !state.details.workDetail.involvedDepIds){ + // state.details.workDetail.involvedDepIds=[] + // } + // else { + // const a = state.details.workDetail.involvedDepIds + // state.details.workDetail.involvedDepIds = a.split(',').map((item) => { + // return state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(item))?.depName; + // }); + // } + // if(state.details.workDetail.csDepId){ + // state.details.workDetail.csDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.csDepId))?.depName; + // } + // if(state.details.workDetail.operationDepId){ + // state.details.workDetail.operationDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.operationDepId))?.depName; + // } + // if(state.details.workDetail.gbPath){ + // state.details.workDetail.gbPath = state.details.workDetail.gbPath.split(',') + // } + // if(state.details.workDetail.bcPath){ + // state.details.workDetail.bcPath = state.details.workDetail.bcPath.split(',') + // } + // if(state.details.workDetail.bpLocationMapPath){ + // state.details.workDetail.bpLocationMapPath = state.details.workDetail.bpLocationMapPath.split(',') + // } + // state.dialogDetails = true; + // }; // const handleReview = (row: object)=>{ // state.dialogReview = true @@ -1052,7 +1053,7 @@ toApply, searchRecord, clearSearch, - viewDetail, + // viewDetail, viewRecord, viewTicket, downLoadTicket, diff --git a/src/views/specialWorkSystem/workTicket/wdsp/components/brokenLog.vue b/src/views/specialWorkSystem/workTicket/wdsp/components/brokenLog.vue deleted file mode 100644 index dcb6adc..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsp/components/brokenLog.vue +++ /dev/null @@ -1,152 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业单位ID"> - <el-input v-model="details.workDetail.operationDepId" readonly type="textarea" /> - </el-form-item> - <el-form-item label="断路原因"> - <el-input v-model="details.workDetail.bcReason" readonly type="textarea" /> - </el-form-item> - <el-form-item label="断路地段说明"> - <el-input v-model="details.workDetail.bcExplain" readonly type="textarea" /> - </el-form-item> - <el-form-item label="涉及相关部门"> - <el-input v-model="details.workDetail.involvedDepIds" readonly type="textarea"/> - </el-form-item> - <el-form-item label="图片"> - <el-image v-for="item in details.workDetail.bcPath" :preview-src-list="details.workDetail.bcPath" 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.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> -<!-- <el-form-item label="当前层级">--> -<!-- <el-input v-model="details.stepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="上一层级">--> -<!-- <el-input v-model="details.preStepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="下一层级">--> -<!-- <el-input v-model="details.nextStepId" readonly />--> -<!-- </el-form-item>--> - <el-form-item label="层级审批类型"> - <el-input v-model="details.stepTypeDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepSerial && details.stepSerial!=null" label="层级排序号"> - <el-input v-model="details.stepSerial" readonly /> - </el-form-item> - <el-form-item v-if="details.stepStartApprovalTime && details.stepStartApprovalTime!=null" label="层级预期开始审批时间"> - <el-input v-model="details.stepStartApprovalTime" readonly /> - </el-form-item> - <el-form-item v-if="details.stepFinishApprovalTime && details.stepFinishApprovalTime!=null" label="层级预期结束审批时间"> - <el-input v-model="details.stepFinishApprovalTime" readonly /> - </el-form-item> - <el-form-item label="审批人姓名"> - <el-input v-model="details.unitApprovalUname" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalStartTime && details.unitApprovalStartTime!=null" label="单元审批开始时间"> - <el-input v-model="details.unitApprovalStartTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalEndTime && details.unitApprovalEndTime!=null" label="单元审批结束时间"> - <el-input v-model="details.unitApprovalEndTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitResultDesc && details.unitResultDesc!=null" label="单元审批结果"> - <el-input v-model="details.unitResultDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.statusDesc && details.statusDesc!=null" label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepApprovalResultDesc && details.stepApprovalResultDesc!=null" label="审批结果"> - <el-input v-model="details.stepApprovalResultDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'space', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsp/components/fireLog.vue b/src/views/specialWorkSystem/workTicket/wdsp/components/fireLog.vue deleted file mode 100644 index ed30241..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsp/components/fireLog.vue +++ /dev/null @@ -1,137 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业方式"> - <el-input v-model="details.workDetail.hotMethod" readonly type="textarea" /> - </el-form-item> - <el-form-item label="关联其他作业"> - <el-input v-model="details.workDetail.otherSpecialWork" readonly type="textarea" /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> -<!-- <el-form-item label="当前层级">--> -<!-- <el-input v-model="details.stepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="上一层级">--> -<!-- <el-input v-model="details.preStepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="下一层级">--> -<!-- <el-input v-model="details.nextStepId" readonly />--> -<!-- </el-form-item>--> - <el-form-item label="层级审批类型"> - <el-input v-model="details.stepTypeDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepSerial && details.stepSerial!=null" label="层级排序号"> - <el-input v-model="details.stepSerial" readonly /> - </el-form-item> - <el-form-item v-if="details.stepStartApprovalTime && details.stepStartApprovalTime!=null" label="层级预期开始审批时间"> - <el-input v-model="details.stepStartApprovalTime" readonly /> - </el-form-item> - <el-form-item v-if="details.stepFinishApprovalTime && details.stepFinishApprovalTime!=null" label="层级预期结束审批时间"> - <el-input v-model="details.stepFinishApprovalTime" readonly /> - </el-form-item> - <el-form-item label="审批人姓名"> - <el-input v-model="details.unitApprovalUname" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalStartTime && details.unitApprovalStartTime!=null" label="单元审批开始时间"> - <el-input v-model="details.unitApprovalStartTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalEndTime && details.unitApprovalEndTime!=null" label="单元审批结束时间"> - <el-input v-model="details.unitApprovalEndTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitResultDesc && details.unitResultDesc!=null" label="单元审批结果"> - <el-input v-model="details.unitResultDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.statusDesc && details.statusDesc!=null" label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepApprovalResultDesc && details.stepApprovalResultDesc!=null" label="审批结果"> - <el-input v-model="details.stepApprovalResultDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'fire', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsp/components/groundLog.vue b/src/views/specialWorkSystem/workTicket/wdsp/components/groundLog.vue deleted file mode 100644 index 244330e..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsp/components/groundLog.vue +++ /dev/null @@ -1,152 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业单位"> - <el-input v-model="details.workDetail.operationDepId" readonly type="textarea" /> - </el-form-item> - <el-form-item label="范围"> - <el-input v-model="details.workDetail.gbScope" readonly type="textarea" /> - </el-form-item> - <el-form-item label="动土方式"> - <el-input v-model="details.workDetail.gbMethod" readonly type="textarea" /> - </el-form-item> - <el-form-item label="关联其他作业"> - <el-input v-model="details.workDetail.otherSpecialWork" readonly type="textarea"/> - </el-form-item> - <el-form-item label="图片"> - <el-image v-for="item in details.workDetail.gbPath" :preview-src-list="details.workDetail.gbPath" 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.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> -<!-- <el-form-item label="当前层级">--> -<!-- <el-input v-model="details.stepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="上一层级">--> -<!-- <el-input v-model="details.preStepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="下一层级">--> -<!-- <el-input v-model="details.nextStepId" readonly />--> -<!-- </el-form-item>--> - <el-form-item label="层级审批类型"> - <el-input v-model="details.stepTypeDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepSerial && details.stepSerial!=null" label="层级排序号"> - <el-input v-model="details.stepSerial" readonly /> - </el-form-item> - <el-form-item v-if="details.stepStartApprovalTime && details.stepStartApprovalTime!=null" label="层级预期开始审批时间"> - <el-input v-model="details.stepStartApprovalTime" readonly /> - </el-form-item> - <el-form-item v-if="details.stepFinishApprovalTime && details.stepFinishApprovalTime!=null" label="层级预期结束审批时间"> - <el-input v-model="details.stepFinishApprovalTime" readonly /> - </el-form-item> - <el-form-item label="审批人姓名"> - <el-input v-model="details.unitApprovalUname" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalStartTime && details.unitApprovalStartTime!=null" label="单元审批开始时间"> - <el-input v-model="details.unitApprovalStartTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalEndTime && details.unitApprovalEndTime!=null" label="单元审批结束时间"> - <el-input v-model="details.unitApprovalEndTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitResultDesc && details.unitResultDesc!=null" label="单元审批结果"> - <el-input v-model="details.unitResultDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.statusDesc && details.statusDesc!=null" label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepApprovalResultDesc && details.stepApprovalResultDesc!=null" label="审批结果"> - <el-input v-model="details.stepApprovalResultDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'space', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsp/components/heightLog.vue b/src/views/specialWorkSystem/workTicket/wdsp/components/heightLog.vue deleted file mode 100644 index 0fb8a7a..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsp/components/heightLog.vue +++ /dev/null @@ -1,146 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业单位ID"> - <el-input v-model="details.workDetail.operationDepId" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业高度"> - <el-input v-model="details.workDetail.operationHeight" readonly type="textarea"><template #append>米(m)</template></el-input> - </el-form-item> - <el-form-item label="关联其他作业"> - <el-input v-model="details.workDetail.otherSpecialWork" readonly type="textarea"/> - </el-form-item> - <el-form-item label="期望开始时间"> - <el-input v-model="details.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> -<!-- <el-form-item label="当前层级">--> -<!-- <el-input v-model="details.stepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="上一层级">--> -<!-- <el-input v-model="details.preStepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="下一层级">--> -<!-- <el-input v-model="details.nextStepId" readonly />--> -<!-- </el-form-item>--> - <el-form-item label="层级审批类型"> - <el-input v-model="details.stepTypeDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepSerial && details.stepSerial!=null" label="层级排序号"> - <el-input v-model="details.stepSerial" readonly /> - </el-form-item> - <el-form-item v-if="details.stepStartApprovalTime && details.stepStartApprovalTime!=null" label="层级预期开始审批时间"> - <el-input v-model="details.stepStartApprovalTime" readonly /> - </el-form-item> - <el-form-item v-if="details.stepFinishApprovalTime && details.stepFinishApprovalTime!=null" label="层级预期结束审批时间"> - <el-input v-model="details.stepFinishApprovalTime" readonly /> - </el-form-item> - <el-form-item label="审批人姓名"> - <el-input v-model="details.unitApprovalUname" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalStartTime && details.unitApprovalStartTime!=null" label="单元审批开始时间"> - <el-input v-model="details.unitApprovalStartTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalEndTime && details.unitApprovalEndTime!=null" label="单元审批结束时间"> - <el-input v-model="details.unitApprovalEndTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitResultDesc && details.unitResultDesc!=null" label="单元审批结果"> - <el-input v-model="details.unitResultDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.statusDesc && details.statusDesc!=null" label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepApprovalResultDesc && details.stepApprovalResultDesc!=null" label="审批结果"> - <el-input v-model="details.stepApprovalResultDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'space', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsp/components/hoistLog.vue b/src/views/specialWorkSystem/workTicket/wdsp/components/hoistLog.vue deleted file mode 100644 index 3b4dc2a..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsp/components/hoistLog.vue +++ /dev/null @@ -1,146 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="吊装工具名称"> - <el-input v-model="details.workDetail.hoistingToolName" readonly type="textarea" /> - </el-form-item> - <el-form-item label="起吊物体重量"> - <el-input v-model="details.workDetail.weightMass" readonly type="textarea"><template #append>吨(t)</template></el-input> - </el-form-item> - <el-form-item label="关联其他作业"> - <el-input v-model="details.workDetail.otherSpecialWork" readonly type="textarea"/> - </el-form-item> - <el-form-item label="期望开始时间"> - <el-input v-model="details.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> -<!-- <el-form-item label="当前层级">--> -<!-- <el-input v-model="details.stepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="上一层级">--> -<!-- <el-input v-model="details.preStepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="下一层级">--> -<!-- <el-input v-model="details.nextStepId" readonly />--> -<!-- </el-form-item>--> - <el-form-item label="层级审批类型"> - <el-input v-model="details.stepTypeDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepSerial && details.stepSerial!=null" label="层级排序号"> - <el-input v-model="details.stepSerial" readonly /> - </el-form-item> - <el-form-item v-if="details.stepStartApprovalTime && details.stepStartApprovalTime!=null" label="层级预期开始审批时间"> - <el-input v-model="details.stepStartApprovalTime" readonly /> - </el-form-item> - <el-form-item v-if="details.stepFinishApprovalTime && details.stepFinishApprovalTime!=null" label="层级预期结束审批时间"> - <el-input v-model="details.stepFinishApprovalTime" readonly /> - </el-form-item> - <el-form-item label="审批人姓名"> - <el-input v-model="details.unitApprovalUname" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalStartTime && details.unitApprovalStartTime!=null" label="单元审批开始时间"> - <el-input v-model="details.unitApprovalStartTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalEndTime && details.unitApprovalEndTime!=null" label="单元审批结束时间"> - <el-input v-model="details.unitApprovalEndTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitResultDesc && details.unitResultDesc!=null" label="单元审批结果"> - <el-input v-model="details.unitResultDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.statusDesc && details.statusDesc!=null" label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepApprovalResultDesc && details.stepApprovalResultDesc!=null" label="审批结果"> - <el-input v-model="details.stepApprovalResultDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'space', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsp/components/plateLog.vue b/src/views/specialWorkSystem/workTicket/wdsp/components/plateLog.vue deleted file mode 100644 index f307fc0..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsp/components/plateLog.vue +++ /dev/null @@ -1,170 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="盲板编号"> - <el-input v-model="details.workDetail.bpCode" readonly type="textarea" /> - </el-form-item> - <el-form-item label="主要介质"> - <el-input v-model="details.workDetail.mainMedia" readonly type="textarea" /> - </el-form-item> - <el-form-item label="温度"> - <el-input v-model="details.workDetail.temperature" readonly type="textarea"><template #append>摄氏度(℃)</template></el-input> - </el-form-item> - <el-form-item label="压力"> - <el-input v-model="details.workDetail.pressure" readonly type="textarea"><template #append>千帕(kPa)</template></el-input> - </el-form-item> - <el-form-item label="盲板材质"> - <el-input v-model="details.workDetail.bpMaterialQuality" readonly type="textarea"/> - </el-form-item> - <el-form-item label="盲板规格"> - <el-input v-model="details.workDetail.bpSpecification" readonly type="textarea"/> - </el-form-item> - <el-form-item label="盲板位置"> - <el-input v-model="details.workDetail.bpLocation" readonly type="textarea"/> - </el-form-item> - <el-form-item label="装盲板时间"> - <el-input v-model="details.workDetail.installBpTime" readonly/> - </el-form-item> - <el-form-item label="拆盲板时间"> - <el-input v-model="details.workDetail.uninstallBpTime" readonly/> - </el-form-item> - <el-form-item label="关联其他作业"> - <el-input v-model="details.workDetail.otherSpecialWork" readonly type="textarea"/> - </el-form-item> - <el-form-item label="盲板位置图"> - <el-image v-for="item in details.workDetail.bpLocationMapPath" :preview-src-list="details.workDetail.bpLocationMapPath" 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.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> -<!-- <el-form-item label="当前层级">--> -<!-- <el-input v-model="details.stepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="上一层级">--> -<!-- <el-input v-model="details.preStepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="下一层级">--> -<!-- <el-input v-model="details.nextStepId" readonly />--> -<!-- </el-form-item>--> - <el-form-item label="层级审批类型"> - <el-input v-model="details.stepTypeDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepSerial && details.stepSerial!=null" label="层级排序号"> - <el-input v-model="details.stepSerial" readonly /> - </el-form-item> - <el-form-item v-if="details.stepStartApprovalTime && details.stepStartApprovalTime!=null" label="层级预期开始审批时间"> - <el-input v-model="details.stepStartApprovalTime" readonly /> - </el-form-item> - <el-form-item v-if="details.stepFinishApprovalTime && details.stepFinishApprovalTime!=null" label="层级预期结束审批时间"> - <el-input v-model="details.stepFinishApprovalTime" readonly /> - </el-form-item> - <el-form-item label="审批人姓名"> - <el-input v-model="details.unitApprovalUname" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalStartTime && details.unitApprovalStartTime!=null" label="单元审批开始时间"> - <el-input v-model="details.unitApprovalStartTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalEndTime && details.unitApprovalEndTime!=null" label="单元审批结束时间"> - <el-input v-model="details.unitApprovalEndTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitResultDesc && details.unitResultDesc!=null" label="单元审批结果"> - <el-input v-model="details.unitResultDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.statusDesc && details.statusDesc!=null" label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepApprovalResultDesc && details.stepApprovalResultDesc!=null" label="审批结果"> - <el-input v-model="details.stepApprovalResultDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'space', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsp/components/powerLog.vue b/src/views/specialWorkSystem/workTicket/wdsp/components/powerLog.vue deleted file mode 100644 index f3c893c..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsp/components/powerLog.vue +++ /dev/null @@ -1,149 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="电源接入点"> - <el-input v-model="details.workDetail.powerAccessPoint" readonly type="textarea" /> - </el-form-item> - <el-form-item label="工作电压"> - <el-input v-model="details.workDetail.workingVoltage" readonly type="textarea"><template #append>伏特(v)</template></el-input> - </el-form-item> - <el-form-item label="用电设备及功率"> - <el-input v-model="details.workDetail.equipmentAndPower" readonly type="textarea" /> - </el-form-item> - <el-form-item label="关联其他作业"> - <el-input v-model="details.workDetail.otherSpecialWork" readonly type="textarea"/> - </el-form-item> - <el-form-item label="期望开始时间"> - <el-input v-model="details.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> -<!-- <el-form-item label="当前层级">--> -<!-- <el-input v-model="details.stepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="上一层级">--> -<!-- <el-input v-model="details.preStepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="下一层级">--> -<!-- <el-input v-model="details.nextStepId" readonly />--> -<!-- </el-form-item>--> - <el-form-item label="层级审批类型"> - <el-input v-model="details.stepTypeDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepSerial && details.stepSerial!=null" label="层级排序号"> - <el-input v-model="details.stepSerial" readonly /> - </el-form-item> - <el-form-item v-if="details.stepStartApprovalTime && details.stepStartApprovalTime!=null" label="层级预期开始审批时间"> - <el-input v-model="details.stepStartApprovalTime" readonly /> - </el-form-item> - <el-form-item v-if="details.stepFinishApprovalTime && details.stepFinishApprovalTime!=null" label="层级预期结束审批时间"> - <el-input v-model="details.stepFinishApprovalTime" readonly /> - </el-form-item> - <el-form-item label="审批人姓名"> - <el-input v-model="details.unitApprovalUname" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalStartTime && details.unitApprovalStartTime!=null" label="单元审批开始时间"> - <el-input v-model="details.unitApprovalStartTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalEndTime && details.unitApprovalEndTime!=null" label="单元审批结束时间"> - <el-input v-model="details.unitApprovalEndTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitResultDesc && details.unitResultDesc!=null" label="单元审批结果"> - <el-input v-model="details.unitResultDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.statusDesc && details.statusDesc!=null" label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepApprovalResultDesc && details.stepApprovalResultDesc!=null" label="审批结果"> - <el-input v-model="details.stepApprovalResultDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'space', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsp/components/spaceLog.vue b/src/views/specialWorkSystem/workTicket/wdsp/components/spaceLog.vue deleted file mode 100644 index d9feabc..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsp/components/spaceLog.vue +++ /dev/null @@ -1,149 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="受限空间所属单位"> - <el-input v-model="details.workDetail.csDepId" readonly type="textarea" /> - </el-form-item> - <el-form-item label="受限空间名称"> - <el-input v-model="details.workDetail.csName" readonly type="textarea" /> - </el-form-item> - <el-form-item label="空间原有介质名称"> - <el-input v-model="details.workDetail.csOriginalName" readonly type="textarea" /> - </el-form-item> - <el-form-item label="关联其他作业"> - <el-input v-model="details.workDetail.otherSpecialWork" readonly type="textarea" /> - </el-form-item> - <el-form-item label="期望开始时间"> - <el-input v-model="details.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> -<!-- <el-form-item label="当前层级">--> -<!-- <el-input v-model="details.stepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="上一层级">--> -<!-- <el-input v-model="details.preStepId" readonly />--> -<!-- </el-form-item>--> -<!-- <el-form-item label="下一层级">--> -<!-- <el-input v-model="details.nextStepId" readonly />--> -<!-- </el-form-item>--> - <el-form-item label="层级审批类型"> - <el-input v-model="details.stepTypeDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepSerial && details.stepSerial!=null" label="层级排序号"> - <el-input v-model="details.stepSerial" readonly /> - </el-form-item> - <el-form-item v-if="details.stepStartApprovalTime && details.stepStartApprovalTime!=null" label="层级预期开始审批时间"> - <el-input v-model="details.stepStartApprovalTime" readonly /> - </el-form-item> - <el-form-item v-if="details.stepFinishApprovalTime && details.stepFinishApprovalTime!=null" label="层级预期结束审批时间"> - <el-input v-model="details.stepFinishApprovalTime" readonly /> - </el-form-item> - <el-form-item label="审批人姓名"> - <el-input v-model="details.unitApprovalUname" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalStartTime && details.unitApprovalStartTime!=null" label="单元审批开始时间"> - <el-input v-model="details.unitApprovalStartTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitApprovalEndTime && details.unitApprovalEndTime!=null" label="单元审批结束时间"> - <el-input v-model="details.unitApprovalEndTime" readonly /> - </el-form-item> - <el-form-item v-if="details.unitResultDesc && details.unitResultDesc!=null" label="单元审批结果"> - <el-input v-model="details.unitResultDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.statusDesc && details.statusDesc!=null" label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - <el-form-item v-if="details.stepApprovalResultDesc && details.stepApprovalResultDesc!=null" label="审批结果"> - <el-input v-model="details.stepApprovalResultDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'space', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsp/index.vue b/src/views/specialWorkSystem/workTicket/wdsp/index.vue deleted file mode 100644 index 84dfa62..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsp/index.vue +++ /dev/null @@ -1,815 +0,0 @@ -<template> - <div class="home-container"> -<!-- <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">--> -<!-- <el-tab-pane label="申请中" name="1">--> - <div style="height: 100%"> - <el-row class="homeCard"> - <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-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> - <el-table ref="multipleTableRef" :data="applyData" style="width: 100%" height="calc(100% - 100px)" :header-cell-style="{ background: '#fafafa' }"> - <el-table-column property="applyUname" label="申请人" /> - <el-table-column property="depName" label="部门名称" /> - <el-table-column property="operators" label="作业人" /> - <el-table-column property="workTypeDesc" label="作业类型" /> - <el-table-column property="workLevelDesc" label="作业等级" /> - <el-table-column property="applyTime" label="申请时间" width="180" /> - <el-table-column label="审批状态" align="center" width="180"> - <template #default="scope"> - <el-tag :type="scope.row.status==2?'success':(scope.row.status==8||scope.row.status==9)?'warning':'danger'">{{ scope.row.statusDesc }}</el-tag> - </template> - </el-table-column> - <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="success" size="small" :icon="Finished" @click="viewStatus(scope.row)">进度</el-button> -<!-- <el-button link type="warning" size="small" :icon="Delete" @click="deleteRecordBtn(scope.row)">终止</el-button>--> - </template> - </el-table-column> - </el-table> - <div class="pageBtn"> - <el-pagination v-model:currentPage="pageIndex1" v-model:page-size="pageSize1" :page-sizes="[10, 15]" small="false" background layout="total, sizes, prev, pager, next, jumper" :total="totalSize1" @size-change="handleSizeChange1" @current-change="handleCurrentChange1" /> - </div> - </div> - </div> - </div> - <el-dialog v-model="dialogDetails" title="作业审批详情" center> - <fire v-if="dialogType == 1" :details = details></fire> - <space v-else-if="dialogType == 2" :details = details></space> - <hoist v-else-if="dialogType == 3" :details = details></hoist> - <ground v-else-if="dialogType == 4" :details = details></ground> - <broken v-else-if="dialogType == 5" :details = details></broken> - <height v-else-if="dialogType == 6" :details = details></height> - <power v-else-if="dialogType == 7" :details = details></power> - <plate v-else :details = details></plate> - <template #footer> - <span class="dialog-footer"> - <el-button type="primary" @click="dialogDetails = false" - >确认</el-button - > - </span> - </template> - </el-dialog> - <el-dialog v-model="dialogStatus" title="作业审批进度" center 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 != 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 @close="indexClear"> - <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-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>--> - </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 { Edit, View, Plus, Delete, Refresh, Search, Finished } from '@element-plus/icons-vue'; -import { ElTable } from 'element-plus'; -import { FormInstance, FormRules, ElMessage } from 'element-plus'; -import { workApprovalApi } from '/@/api/specialWorkSystem/workApproval'; -import type { TabsPaneContext } from 'element-plus'; -import {teamManageApi} from "/@/api/systemManage/basicDateManage/personShiftManage/teamManage"; - -// 定义接口来定义对象的类型 -interface stateType { - applyData: Array<string>; - workTimeList: Array<string>; - multipleSelection: Array<any>; - deleteArr: Array<any>; - approveInfo: Object; - dialogDetails: boolean; - dialogStatus: boolean; - deleteDialog: boolean; - pageIndex1: number; - pageSize1: number; - chosenIndex: null | number; - deleteId: null | number; - searchWord: string; - totalSize1: number; - activeName: string; - addRecord: {}; - details: {}; - statusInfo: {}; - workType: Array<type>; - dialogType: number | null; - departmentList: Array<any>; - departmentRecursionList: Array<DepartmentState>; -} -interface type { - id: number; - name: string; -} -interface DepartmentState { - depId: number; - depName: string; -} -export default defineComponent({ - name: 'myApproval', - components: { - fire: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/fireLog.vue')), - space: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/spaceLog.vue')), - hoist: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/hoistLog.vue')), - ground: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/groundLog.vue')), - broken: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/brokenLog.vue')), - height: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/heightLog.vue')), - power: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/powerLog.vue')), - plate: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/wdsp/components/plateLog.vue')) - }, - setup() { - const userInfo = useUserInfo(); - const { userInfos } = storeToRefs(userInfo); - const router = useRouter(); - const state = reactive<stateType>({ - pageIndex1: 1, - pageSize1: 10, - totalSize1: 0, - dialogType: null, - activeName: '1', - departmentList: [], - departmentRecursionList: [], - chosenIndex: null, - searchWord: '', - applyData: [], - workTimeList: [], - multipleSelection: [], - approveInfo: { - approvalSteps: [], - operators: [] - }, - dialogDetails: false, - dialogStatus: false, - deleteDialog: false, - addRecord: {}, - details: {}, - statusInfo: {}, - deleteId: null, - deleteArr: [], - workType: [ - { id: 1, name: '动火作业' }, - { id: 2, name: '受限空间作业' }, - { id: 3, name: '吊装作业' }, - { id: 4, name: '动土作业' }, - { id: 5, name: '断路作业' }, - { id: 6, name: '高处作业' }, - { id: 7, name: '临时用电作业' }, - { id: 8, name: '盲板抽堵作业' } - ] - }); - interface User { - name: string; - list: []; - info: string; - } - - // 刷新 - const reLoadData = async () => { - getListByPage(); - }; - - // 填写表单 - const toApply = () => { - router.push({ - path: 'zysq' - }); - }; - - const handleClick = (tab: TabsPaneContext, event: Event) => { - console.log(tab, event); - }; - - // 获取部门列表 - const getAllDepartment = async () => { - let res = await teamManageApi().getAllDepartment(); - if (res.data.code === '200') { - state.departmentList = JSON.parse(JSON.stringify(res.data.data)) - recursion(state.departmentList); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - // 获取层级审批数据 - // const getApprovalData = async (id) => { - // let res = await workApprovalApi().getApprovalData({workApplyId: id}); - // if (res.data.code === '200') { - // console.log(res.data.data,'层级数据') - // // state.departmentList = JSON.parse(JSON.stringify(res.data.data)) - // // recursion(state.departmentList); - // } else { - // ElMessage({ - // type: 'warning', - // message: res.data.msg - // }); - // } - // }; - - const recursion = (value: any) => { - for (let i of value) { - if (i.children.length !== 0) { - state.departmentRecursionList.push(i); - recursion(i.children); - } else { - state.departmentRecursionList.push(i); - } - } - }; - - // 分页获取工作时间组列表 - const getListByPage = async () => { - const data = { pageSize: state.pageSize1, pageIndex: state.pageIndex1, searchParams: { workType: state.searchWord } }; - let res = await workApprovalApi().getApprovalListPage(data); - if (res.data.code === '200') { - state.applyData = JSON.parse(JSON.stringify(res.data.data)); - state.applyData = state.applyData.map((item) => { - if (item.operators == null || item.operators == []) { - item.operators = []; - } else { - item.operators = Array.from(item.operators, ({ operatorUname }) => operatorUname); - } - return item; - }); - state.totalSize1 = res.data.total; - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - // 关键词查询记录 - const searchRecord = async () => { - if (state.searchWord == '') { - ElMessage({ - type: 'warning', - message: '请输入查询关键词' - }); - } else { - getListByPage(); - } - }; - // 重置搜索 - const clearSearch = async () => { - state.searchWord = ''; - getListByPage(); - }; - - // 查看进度 - const viewStatus = (row) => { - getStatus({ workApplyId: row.workApplyId }); - state.dialogStatus = true; - }; - - // 查询进度方法 - const getStatus = async (data: any) => { - let res = await workApprovalApi().getApprovalStatus(data); - if (res.data.code === '200') { - state.approveInfo = JSON.parse(JSON.stringify(res.data.data)); - state.approveInfo.operators = Array.from(state.approveInfo.operators, ({ operatorUname }) => operatorUname); - console.log(state.approveInfo, '我的审批'); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - const deleteRecordBtn = (row) => { - state.deleteId = row.workApplyId; - state.deleteDialog = true; - }; - - // 取消申请方法 - const deleteRecord = async (data: any) => { - let res = await workApprovalApi().postAbord(data); - if (res.data.code === '200') { - ElMessage({ - type: 'success', - message: '取消成功!' - }); - getListByPage(); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - const conFirmDelete = () => { - deleteRecord({ workApplyId: state.deleteId }); - state.deleteDialog = false; - }; - - const handleSizeChange1 = (val: number) => { - state.pageSize1 = val; - getListByPage(); - }; - const handleCurrentChange1 = (val: number) => { - state.pageIndex1 = val; - getListByPage(); - }; - - // 查看记录 - const viewRecord = (row: any) => { - state.dialogType = row.workType - state.details = JSON.parse(JSON.stringify(row)); - console.log(state.details,'details') - // getApprovalData(state.details.workApplyId) - if(state.details.workDetail.otherSpecialWork == '' || !state.details.workDetail.otherSpecialWork){ - state.details.workDetail.otherSpecialWork=[] - } - else { - console.log(state.details.workDetail.otherSpecialWork,'split') - const a = state.details.workDetail.otherSpecialWork - state.details.workDetail.otherSpecialWork = a.split(',').map((item) => { - return state.workType.find((i: { id: number }) => i.id === Number(item))?.name; - }); - } - if(state.details.workDetail.involvedDepIds == '' || !state.details.workDetail.involvedDepIds){ - state.details.workDetail.involvedDepIds=[] - } - else { - const a = state.details.workDetail.involvedDepIds - state.details.workDetail.involvedDepIds = a.split(',').map((item) => { - return state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(item))?.depName; - }); - } - if(state.details.workDetail.csDepId){ - state.details.workDetail.csDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.csDepId))?.depName; - } - if(state.details.workDetail.operationDepId){ - state.details.workDetail.operationDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.operationDepId))?.depName; - } - if(state.details.workDetail.gbPath){ - state.details.workDetail.gbPath = state.details.workDetail.gbPath.split(',') - } - if(state.details.workDetail.bcPath){ - state.details.workDetail.bcPath = state.details.workDetail.bcPath.split(',') - } - if(state.details.workDetail.bpLocationMapPath){ - state.details.workDetail.bpLocationMapPath = state.details.workDetail.bpLocationMapPath.split(',') - } - state.dialogDetails = true; - }; - - // 折线图 - const renderMenu = async (value: string) => { - Session.set('projectId', value); - userInfos.value.projectId = value; - await initBackEndControlRoutes(); - }; - - // 页面载入时执行方法 - onMounted(() => { - getListByPage(); - getAllDepartment() - }); - - return { - View, - Edit, - Delete, - Refresh, - Plus, - Finished, - reLoadData, - toApply, - handleClick, - searchRecord, - clearSearch, - viewRecord, - viewStatus, - deleteRecordBtn, - conFirmDelete, - getListByPage, - handleSizeChange1, - handleCurrentChange1, - ...toRefs(state) - }; - } -}); -</script> - -<style scoped lang="scss"> -$homeNavLengh: 8; -.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); - } - } - .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 { - 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/workTicket/wdsq/components/brokenLog.vue b/src/views/specialWorkSystem/workTicket/wdsq/components/brokenLog.vue deleted file mode 100644 index b32213d..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsq/components/brokenLog.vue +++ /dev/null @@ -1,131 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业单位"> - <el-input v-model="details.workDetail.operationDepId" readonly type="textarea" /> - </el-form-item> - <el-form-item label="断路原因"> - <el-input v-model="details.workDetail.bcReason" readonly type="textarea" /> - </el-form-item> - <el-form-item label="断路地段说明"> - <el-input v-model="details.workDetail.bcExplain" readonly type="textarea" /> - </el-form-item> - <el-form-item label="涉及相关部门"> - <el-input v-model="details.workDetail.involvedDepIds" readonly type="textarea"/> - </el-form-item> - <el-form-item label="图片"> - <el-image v-for="item in details.workDetail.bcPath" :preview-src-list="details.workDetail.bcPath" style="width: 150px; height: 150px;margin-right: 50px;margin-bottom: 20px" :src="item" fit="cover" /> - </el-form-item> - <el-form-item label="物资状态"> - <span>{{ details.materialStatus==0?'未关联物资':(details.materialStatus==1?'必选物资配备不足':(details.materialStatus==2?'必选物资配备齐全':(details.materialStatus==3?'物资配置专业':(details.materialStatus==4?'物资配置高端':'-')))) }}</span> - </el-form-item> - <el-form-item label="关联物资" v-if="details.workMaterial.length>0"> - <el-table :data="details.workMaterial" style="width: 100%" border> - <el-table-column prop="bigClassifyName" label="物资类型" align="center"/> - <el-table-column prop="materialName" label="物资名称" align="center"/> - <el-table-column prop="configurationLevel" label="配置级别" align="center"> - <template #default="scope"> - {{scope.row.configurationLevel == 0?'必选':(scope.row.configurationLevel == 1? '可选':'高配')}} - </template> - </el-table-column> - <el-table-column prop="useCount" label="配置数量" align="center"/> - </el-table> - </el-form-item> - <el-form-item label="期望开始时间"> - <el-input v-model="details.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> - <el-form-item label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'space', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsq/components/fireLog.vue b/src/views/specialWorkSystem/workTicket/wdsq/components/fireLog.vue deleted file mode 100644 index 6386a7e..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsq/components/fireLog.vue +++ /dev/null @@ -1,122 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业方式"> - <el-input v-model="details.workDetail.hotMethod" readonly type="textarea" /> - </el-form-item> - <el-form-item label="物资状态"> - <span>{{ details.materialStatus==0?'未关联物资':(details.materialStatus==1?'必选物资配备不足':(details.materialStatus==2?'必选物资配备齐全':(details.materialStatus==3?'物资配置专业':(details.materialStatus==4?'物资配置高端':'-')))) }}</span> - </el-form-item> - <el-form-item label="关联物资" v-if="details.workMaterial&&details.workMaterial.length>0"> - <el-table :data="details.workMaterial" style="width: 100%" border> - <el-table-column prop="bigClassifyName" label="物资类型" align="center"/> - <el-table-column prop="materialName" label="物资名称" align="center"/> - <el-table-column prop="configurationLevel" label="配置级别" align="center"> - <template #default="scope"> - {{scope.row.configurationLevel == 0?'必选':(scope.row.configurationLevel == 1? '可选':'高配')}} - </template> - </el-table-column> - <el-table-column prop="useCount" label="配置数量" align="center"/> - </el-table> - </el-form-item> - <el-form-item label="关联其他作业"> - <el-input v-model="details.workDetail.otherSpecialWork" readonly type="textarea" /> - </el-form-item> - <el-form-item label="期望开始时间"> - <el-input v-model="details.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> - <el-form-item label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'fire', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsq/components/groundLog.vue b/src/views/specialWorkSystem/workTicket/wdsq/components/groundLog.vue deleted file mode 100644 index ed728d7..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsq/components/groundLog.vue +++ /dev/null @@ -1,131 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业单位"> - <el-input v-model="details.workDetail.operationDepId" readonly type="textarea" /> - </el-form-item> - <el-form-item label="范围"> - <el-input v-model="details.workDetail.gbScope" readonly type="textarea" /> - </el-form-item> - <el-form-item label="动土方式"> - <el-input v-model="details.workDetail.gbMethod" readonly type="textarea" /> - </el-form-item> - <el-form-item label="物资状态"> - <span>{{ details.materialStatus==0?'未关联物资':(details.materialStatus==1?'必选物资配备不足':(details.materialStatus==2?'必选物资配备齐全':(details.materialStatus==3?'物资配置专业':(details.materialStatus==4?'物资配置高端':'-')))) }}</span> - </el-form-item> - <el-form-item label="关联物资" v-if="details.workMaterial&&details.workMaterial.length>0"> - <el-table :data="details.workMaterial" style="width: 100%" border> - <el-table-column prop="bigClassifyName" label="物资类型" align="center"/> - <el-table-column prop="materialName" label="物资名称" align="center"/> - <el-table-column prop="configurationLevel" label="配置级别" align="center"> - <template #default="scope"> - {{scope.row.configurationLevel == 0?'必选':(scope.row.configurationLevel == 1? '可选':'高配')}} - </template> - </el-table-column> - <el-table-column prop="useCount" label="配置数量" align="center"/> - </el-table> - </el-form-item> - <el-form-item label="关联其他作业"> - <el-input v-model="details.workDetail.otherSpecialWork" readonly type="textarea"/> - </el-form-item> - <el-form-item label="图片"> - <el-image v-for="item in details.workDetail.gbPath" :preview-src-list="details.workDetail.gbPath" 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.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> - <el-form-item label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'space', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsq/components/heightLog.vue b/src/views/specialWorkSystem/workTicket/wdsq/components/heightLog.vue deleted file mode 100644 index f95c6e9..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsq/components/heightLog.vue +++ /dev/null @@ -1,125 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业单位"> - <el-input v-model="details.workDetail.operationDepId" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业高度"> - <el-input v-model="details.workDetail.operationHeight" readonly type="textarea"><template #append>米(m)</template></el-input> - </el-form-item> - <el-form-item label="物资状态"> - <span>{{ details.materialStatus==0?'未关联物资':(details.materialStatus==1?'必选物资配备不足':(details.materialStatus==2?'必选物资配备齐全':(details.materialStatus==3?'物资配置专业':(details.materialStatus==4?'物资配置高端':'-')))) }}</span> - </el-form-item> - <el-form-item label="关联物资" v-if="details.workMaterial&&details.workMaterial.length>0"> - <el-table :data="details.workMaterial" style="width: 100%" border> - <el-table-column prop="bigClassifyName" label="物资类型" align="center"/> - <el-table-column prop="materialName" label="物资名称" align="center"/> - <el-table-column prop="configurationLevel" label="配置级别" align="center"> - <template #default="scope"> - {{scope.row.configurationLevel == 0?'必选':(scope.row.configurationLevel == 1? '可选':'高配')}} - </template> - </el-table-column> - <el-table-column prop="useCount" label="配置数量" align="center"/> - </el-table> - </el-form-item> - <el-form-item label="关联其他作业"> - <el-input v-model="details.workDetail.otherSpecialWork" readonly type="textarea"/> - </el-form-item> - <el-form-item label="期望开始时间"> - <el-input v-model="details.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> - <el-form-item label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'space', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsq/components/hoistLog.vue b/src/views/specialWorkSystem/workTicket/wdsq/components/hoistLog.vue deleted file mode 100644 index 1086537..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsq/components/hoistLog.vue +++ /dev/null @@ -1,125 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="吊装工具名称"> - <el-input v-model="details.workDetail.hoistingToolName" readonly type="textarea" /> - </el-form-item> - <el-form-item label="起吊物体重量"> - <el-input v-model="details.workDetail.weightMass" readonly type="textarea"><template #append>吨(t)</template></el-input> - </el-form-item> - <el-form-item label="物资状态"> - <span>{{ details.materialStatus==0?'未关联物资':(details.materialStatus==1?'必选物资配备不足':(details.materialStatus==2?'必选物资配备齐全':(details.materialStatus==3?'物资配置专业':(details.materialStatus==4?'物资配置高端':'-')))) }}</span> - </el-form-item> - <el-form-item label="关联物资" v-if="details.workMaterial&&details.workMaterial.length>0"> - <el-table :data="details.workMaterial" style="width: 100%" border> - <el-table-column prop="bigClassifyName" label="物资类型" align="center"/> - <el-table-column prop="materialName" label="物资名称" align="center"/> - <el-table-column prop="configurationLevel" label="配置级别" align="center"> - <template #default="scope"> - {{scope.row.configurationLevel == 0?'必选':(scope.row.configurationLevel == 1? '可选':'高配')}} - </template> - </el-table-column> - <el-table-column prop="useCount" label="配置数量" align="center"/> - </el-table> - </el-form-item> - <el-form-item label="关联其他作业"> - <el-input v-model="details.workDetail.otherSpecialWork" readonly type="textarea"/> - </el-form-item> - <el-form-item label="期望开始时间"> - <el-input v-model="details.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> - <el-form-item label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'space', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsq/components/plateLog.vue b/src/views/specialWorkSystem/workTicket/wdsq/components/plateLog.vue deleted file mode 100644 index 69620a3..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsq/components/plateLog.vue +++ /dev/null @@ -1,149 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="盲板编号"> - <el-input v-model="details.workDetail.bpCode" readonly type="textarea" /> - </el-form-item> - <el-form-item label="主要介质"> - <el-input v-model="details.workDetail.mainMedia" readonly type="textarea" /> - </el-form-item> - <el-form-item label="温度"> - <el-input v-model="details.workDetail.temperature" readonly type="textarea"><template #append>摄氏度(℃)</template></el-input> - </el-form-item> - <el-form-item label="压力"> - <el-input v-model="details.workDetail.pressure" readonly type="textarea"><template #append>千帕(kPa)</template></el-input> - </el-form-item> - <el-form-item label="盲板材质"> - <el-input v-model="details.workDetail.bpMaterialQuality" readonly type="textarea"/> - </el-form-item> - <el-form-item label="盲板规格"> - <el-input v-model="details.workDetail.bpSpecification" readonly type="textarea"/> - </el-form-item> - <el-form-item label="盲板位置"> - <el-input v-model="details.workDetail.bpLocation" readonly type="textarea"/> - </el-form-item> - <el-form-item label="装盲板时间"> - <el-input v-model="details.workDetail.installBpTime" readonly/> - </el-form-item> - <el-form-item label="拆盲板时间"> - <el-input v-model="details.workDetail.uninstallBpTime" readonly/> - </el-form-item> - <el-form-item label="物资状态"> - <span>{{ details.materialStatus==0?'未关联物资':(details.materialStatus==1?'必选物资配备不足':(details.materialStatus==2?'必选物资配备齐全':(details.materialStatus==3?'物资配置专业':(details.materialStatus==4?'物资配置高端':'-')))) }}</span> - </el-form-item> - <el-form-item label="关联物资" v-if="details.workMaterial&&details.workMaterial.length>0"> - <el-table :data="details.workMaterial" style="width: 100%" border> - <el-table-column prop="bigClassifyName" label="物资类型" align="center"/> - <el-table-column prop="materialName" label="物资名称" align="center"/> - <el-table-column prop="configurationLevel" label="配置级别" align="center"> - <template #default="scope"> - {{scope.row.configurationLevel == 0?'必选':(scope.row.configurationLevel == 1? '可选':'高配')}} - </template> - </el-table-column> - <el-table-column prop="useCount" label="配置数量" align="center"/> - </el-table> - </el-form-item> - <el-form-item label="关联其他作业"> - <el-input v-model="details.workDetail.otherSpecialWork" readonly type="textarea"/> - </el-form-item> - <el-form-item label="盲板位置图"> - <el-image v-for="item in details.workDetail.bpLocationMapPath" :preview-src-list="details.workDetail.bpLocationMapPath" 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.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> - <el-form-item label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'space', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsq/components/powerLog.vue b/src/views/specialWorkSystem/workTicket/wdsq/components/powerLog.vue deleted file mode 100644 index cf81c13..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsq/components/powerLog.vue +++ /dev/null @@ -1,128 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea" /> - </el-form-item> - <el-form-item label="电源接入点"> - <el-input v-model="details.workDetail.powerAccessPoint" readonly type="textarea" /> - </el-form-item> - <el-form-item label="工作电压"> - <el-input v-model="details.workDetail.workingVoltage" readonly type="textarea"><template #append>伏特(v)</template></el-input> - </el-form-item> - <el-form-item label="用电设备及功率"> - <el-input v-model="details.workDetail.equipmentAndPower" readonly type="textarea" /> - </el-form-item> - <el-form-item label="物资状态"> - <span>{{ details.materialStatus==0?'未关联物资':(details.materialStatus==1?'必选物资配备不足':(details.materialStatus==2?'必选物资配备齐全':(details.materialStatus==3?'物资配置专业':(details.materialStatus==4?'物资配置高端':'-')))) }}</span> - </el-form-item> - <el-form-item label="关联物资" v-if="details.workMaterial&&details.workMaterial.length>0"> - <el-table :data="details.workMaterial" style="width: 100%" border> - <el-table-column prop="bigClassifyName" label="物资类型" align="center"/> - <el-table-column prop="materialName" label="物资名称" align="center"/> - <el-table-column prop="configurationLevel" label="配置级别" align="center"> - <template #default="scope"> - {{scope.row.configurationLevel == 0?'必选':(scope.row.configurationLevel == 1? '可选':'高配')}} - </template> - </el-table-column> - <el-table-column prop="useCount" label="配置数量" align="center"/> - </el-table> - </el-form-item> - <el-form-item label="关联其他作业"> - <el-input v-model="details.workDetail.otherSpecialWork" readonly type="textarea"/> - </el-form-item> - <el-form-item label="期望开始时间"> - <el-input v-model="details.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> - <el-form-item label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'space', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsq/components/spaceLog.vue b/src/views/specialWorkSystem/workTicket/wdsq/components/spaceLog.vue deleted file mode 100644 index d6b4606..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsq/components/spaceLog.vue +++ /dev/null @@ -1,128 +0,0 @@ -<template> - <div style="height: 100%"> - <el-form :model="details" label-width="150px"> - <el-form-item label="作业申请单号"> - <el-input v-model="details.workPermitNo" readonly /> - </el-form-item> - <el-form-item label="申请人"> - <el-input v-model="details.applyUname" readonly /> - </el-form-item> - <el-form-item label="部门名称"> - <el-input v-model="details.depName" readonly /> - </el-form-item> - <el-form-item label="作业人"> - <el-input v-model="details.operators" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业类型"> - <el-input v-model="details.workTypeDesc" readonly /> - </el-form-item> - <el-form-item label="作业等级"> - <el-input v-model="details.workLevelDesc" readonly /> - </el-form-item> - <el-form-item label="作业内容"> - <el-input v-model="details.workContent" readonly type="textarea" /> - </el-form-item> - <el-form-item label="作业地址"> - <el-input v-model="details.workLocation" readonly type="textarea"/> - </el-form-item> - <el-form-item label="受限空间所属单位"> - <el-input v-model="details.workDetail.csDepId" readonly type="textarea" /> - </el-form-item> - <el-form-item label="受限空间名称"> - <el-input v-model="details.workDetail.csName" readonly type="textarea" /> - </el-form-item> - <el-form-item label="空间原有介质名称"> - <el-input v-model="details.workDetail.csOriginalName" readonly type="textarea" /> - </el-form-item> - <el-form-item label="物资状态"> - <span>{{ details.materialStatus==0?'未关联物资':(details.materialStatus==1?'必选物资配备不足':(details.materialStatus==2?'必选物资配备齐全':(details.materialStatus==3?'物资配置专业':(details.materialStatus==4?'物资配置高端':'-')))) }}</span> - </el-form-item> - <el-form-item label="关联物资" v-if="details.workMaterial&&details.workMaterial.length>0"> - <el-table :data="details.workMaterial" style="width: 100%" border> - <el-table-column prop="bigClassifyName" label="物资类型" align="center"/> - <el-table-column prop="materialName" label="物资名称" align="center"/> - <el-table-column prop="configurationLevel" label="配置级别" align="center"> - <template #default="scope"> - {{scope.row.configurationLevel == 0?'必选':(scope.row.configurationLevel == 1? '可选':'高配')}} - </template> - </el-table-column> - <el-table-column prop="useCount" label="配置数量" align="center"/> - </el-table> - </el-form-item> - <el-form-item label="关联其他作业"> - <el-input v-model="details.workDetail.otherSpecialWork" readonly type="textarea" /> - </el-form-item> - <el-form-item label="期望开始时间"> - <el-input v-model="details.expStartTime" readonly /> - </el-form-item> - <el-form-item label="期望结束时间"> - <el-input v-model="details.expEndTime" readonly /> - </el-form-item> - <el-form-item label="申请时间"> - <el-input v-model="details.applyTime" readonly /> - </el-form-item> - <el-form-item label="当前状态"> - <el-input v-model="details.statusDesc" readonly /> - </el-form-item> - </el-form> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - form: Object, - workerList: Array<any>, - workTypeList: Array<any>, - workLevelList: Array<any>, - otherWorkList: Array<any> - } - export default defineComponent({ - name: 'space', - components: {}, - props:['details'], - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - return { - Search - }; - }, - }); -</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; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/wdsq/index.vue b/src/views/specialWorkSystem/workTicket/wdsq/index.vue deleted file mode 100644 index 340b902..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsq/index.vue +++ /dev/null @@ -1,877 +0,0 @@ -<template> - <div class="home-container"> -<!-- <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">--> -<!-- <el-tab-pane label="申请中" name="1">--> - <div style="height: 100%"> - <el-row class="homeCard"> - <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-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> - <el-table ref="multipleTableRef" :data="applyData" style="width: 100%" height="calc(100% - 100px)" :header-cell-style="{ background: '#fafafa' }"> - <el-table-column property="workPermitNo" label="作业申请单号" width="180" /> - <el-table-column property="applyUname" label="申请人" /> - <el-table-column property="depName" label="部门名称" /> - <el-table-column property="operators" label="作业人" /> - <el-table-column property="workTypeDesc" label="作业类型" /> - <el-table-column property="workLevelDesc" label="作业等级" /> - <el-table-column property="materialStatus" label="物资状态" align="center" width="180"> - <template #default="scope"> - <span>{{ scope.row.materialStatus==0?'未关联物资':(scope.row.materialStatus==1?'必选物资配备不足':(scope.row.materialStatus==2?'必选物资配备齐全':(scope.row.materialStatus==3?'物资配置专业':(scope.row.materialStatus==4?'物资配置高端':'-')))) }}</span> - </template> - </el-table-column> - <el-table-column property="applyTime" label="申请时间" width="180" /> - <el-table-column label="申请状态" align="center" width="180"> - <template #default="scope"> - <el-tag :type="scope.row.status==2?'success':(scope.row.status==8||scope.row.status==9)?'warning':'danger'">{{ scope.row.statusDesc }}</el-tag> - </template> - </el-table-column> - <el-table-column fixed="right" label="操作" align="center" width="300"> - <template #default="scope"> - <el-button link type="primary" size="small" :icon="View" @click="viewRecord(scope.row)">查看</el-button> - <el-button link type="success" size="small" :icon="Finished" @click="viewStatus(scope.row)">进度</el-button> - <el-button link type="warning" size="small" :icon="Delete" @click="deleteRecordBtn(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> - </el-table> - <div class="pageBtn"> - <el-pagination v-model:currentPage="pageIndex1" v-model:page-size="pageSize1" :page-sizes="[10, 15]" small="false" background layout="total, sizes, prev, pager, next, jumper" :total="totalSize1" @size-change="handleSizeChange1" @current-change="handleCurrentChange1" /> - </div> - </div> - </div> - </div> - <el-dialog v-model="dialogDetails" title="作业申请详情" center> - <fire v-if="dialogType == 1" :details = details></fire> - <space v-else-if="dialogType == 2" :details = details></space> - <hoist v-else-if="dialogType == 3" :details = details></hoist> - <ground v-else-if="dialogType == 4" :details = details></ground> - <broken v-else-if="dialogType == 5" :details = details></broken> - <height v-else-if="dialogType == 6" :details = details></height> - <power v-else-if="dialogType == 7" :details = details></power> - <plate v-else :details = details></plate> - <template #footer> - <span class="dialog-footer"> - <el-button type="primary" @click="dialogDetails = false" - >确认</el-button - > - </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>--> - </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 { 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 { workApplyApi } from '/@/api/specialWorkSystem/workApply'; -import type { TabsPaneContext } from 'element-plus'; -import {teamManageApi} from "/@/api/systemManage/basicDateManage/personShiftManage/teamManage"; -import Cookies from 'js-cookie'; -import axios from 'axios'; - -// 定义接口来定义对象的类型 -interface stateType { - applyData: Array<string>; - workTimeList: Array<string>; - multipleSelection: Array<any>; - deleteArr: Array<any>; - 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: {}; - details: {}; - statusInfo: {}; - workType: Array<type>; - dialogType: number | null; - departmentList: Array<any>; - departmentRecursionList: Array<DepartmentState>; -} -interface type { - id: number; - name: string; -} -interface DepartmentState { - depId: number; - depName: string; -} -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')) - }, - setup() { - const userInfo = useUserInfo(); - const { userInfos } = storeToRefs(userInfo); - const router = useRouter(); - const state = reactive<stateType>({ - pageIndex1: 1, - pageSize1: 10, - totalSize1: 0, - dialogType: null, - activeName: '1', - departmentList: [], - departmentRecursionList: [], - chosenIndex: null, - searchWord: '', - applyData: [], - workTimeList: [], - multipleSelection: [], - approveInfo: { - approvalSteps: [], - operators: [] - }, - dialogDetails: false, - dialogStatus: false, - deleteDialog: false, - downLoadDialog: false, - addRecord: {}, - details: {}, - statusInfo: {}, - deleteId: null, - downLoadId: null, - downLoadName: '', - deleteArr: [], - workType: [ - { id: 1, name: '动火作业' }, - { id: 2, name: '受限空间作业' }, - { id: 3, name: '吊装作业' }, - { id: 4, name: '动土作业' }, - { id: 5, name: '断路作业' }, - { id: 6, name: '高处作业' }, - { id: 7, name: '临时用电作业' }, - { id: 8, name: '盲板抽堵作业' } - ] - }); - interface User { - name: string; - list: []; - info: string; - } - - // 刷新 - const reLoadData = async () => { - getListByPage(); - }; - - // 填写表单 - const toApply = () => { - router.push({ - path: 'zysq' - }); - }; - - const handleClick = (tab: TabsPaneContext, event: Event) => { - }; - - // 获取部门列表 - const getAllDepartment = async () => { - let res = await teamManageApi().getAllDepartment(); - if (res.data.code === '200') { - state.departmentList = JSON.parse(JSON.stringify(res.data.data)) - recursion(state.departmentList); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - const recursion = (value: any) => { - for (let i of value) { - if (i.children.length !== 0) { - state.departmentRecursionList.push(i); - recursion(i.children); - } else { - state.departmentRecursionList.push(i); - } - } - }; - - // 分页获取 - const getListByPage = async () => { - const data = { pageSize: state.pageSize1, pageIndex: state.pageIndex1, searchParams: { workType: state.searchWord } }; - let res = await workApplyApi().getApplyListPage(data); - if (res.data.code === '200') { - state.applyData = JSON.parse(JSON.stringify(res.data.data)); - console.log(state.applyData,'applyData') - state.applyData = state.applyData.map((item) => { - if (item.operators == null || item.operators == []) { - item.operators = []; - } else { - item.operators = Array.from(item.operators, ({ operatorUname }) => operatorUname); - } - return item; - }); - state.totalSize1 = res.data.total; - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - // 表格数据格式化 - const toNames = (row, column, cellValue, index) => { - if (row.list == []) { - return []; - } else { - const nameList = []; - for (let i = 0; i < row.list.length; i++) { - for (let t = 0; t < state.workTimeList.length; t++) { - if (row.list[i] == state.workTimeList[t].id) { - nameList.push(state.workTimeList[t].name); - } - } - } - return nameList.join(); - } - }; - - // 关键词查询记录 - const searchRecord = async () => { - if (state.searchWord == '') { - ElMessage({ - type: 'warning', - message: '请输入查询关键词' - }); - } else { - getListByPage(); - } - }; - // 重置搜索 - const clearSearch = async () => { - state.searchWord = ''; - getListByPage(); - }; - - // 查看进度 - const viewStatus = (row) => { - getStatus({ workApplyId: row.workApplyId }); - state.dialogStatus = true; - }; - - // 查询进度方法 - const getStatus = async (data: any) => { - let res = await workApplyApi().getStatus(data); - if (res.data.code === '200') { - state.approveInfo = JSON.parse(JSON.stringify(res.data.data)); - state.approveInfo.operators = Array.from(state.approveInfo.operators, ({ operatorUname }) => operatorUname); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - 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({ - type: 'success', - message: '删除成功!' - }); - getListByPage(); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - const conFirmDelete = () => { - deleteRecord({ workApplyId: state.deleteId }); - state.deleteDialog = false; - }; - - // 导出图表 - const downLoadBtn = (row:any) =>{ - state.downLoadId = row.workApplyId; - state.downLoadName = row.workTypeDesc + row.workPermitNo - state.downLoadDialog = true; - } - - // 导出方法 - const downLoadRecord = async (data: any) => { - // let res = await workApplyApi().postPrinting(data); - axios.post(import.meta.env.VITE_API_URL + `/work/apply/printingPdf`,data,{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", state.downLoadName + "作业证.pdf"); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }) - - }; - - const conFirmDownLoad = () => { - downLoadRecord({ applyWorkId: state.downLoadId }); - state.downLoadDialog = false; - }; - - const handleSizeChange1 = (val: number) => { - state.pageSize1 = val; - getListByPage(); - }; - const handleCurrentChange1 = (val: number) => { - state.pageIndex1 = val; - getListByPage(); - }; - - // 查看记录 - const viewRecord = (row: any) => { - state.dialogType = row.workType - state.details = JSON.parse(JSON.stringify(row)); - if(state.details.workDetail.otherSpecialWork == '' || !state.details.workDetail.otherSpecialWork){ - state.details.workDetail.otherSpecialWork=[] - } - else { - const a = state.details.workDetail.otherSpecialWork - state.details.workDetail.otherSpecialWork = a.split(',').map((item) => { - return state.workType.find((i: { id: number }) => i.id === Number(item))?.name; - }); - } - if(state.details.workDetail.involvedDepIds == '' || !state.details.workDetail.involvedDepIds){ - state.details.workDetail.involvedDepIds=[] - } - else { - const a = state.details.workDetail.involvedDepIds - state.details.workDetail.involvedDepIds = a.split(',').map((item) => { - return state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(item))?.depName; - }); - } - if(state.details.workDetail.csDepId){ - state.details.workDetail.csDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.csDepId))?.depName; - } - if(state.details.workDetail.operationDepId){ - state.details.workDetail.operationDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.operationDepId))?.depName; - } - if(state.details.workDetail.gbPath){ - state.details.workDetail.gbPath = state.details.workDetail.gbPath.split(',') - } - if(state.details.workDetail.bcPath){ - state.details.workDetail.bcPath = state.details.workDetail.bcPath.split(',') - } - if(state.details.workDetail.bpLocationMapPath){ - state.details.workDetail.bpLocationMapPath = state.details.workDetail.bpLocationMapPath.split(',') - } - state.dialogDetails = true; - }; - - // 折线图 - const renderMenu = async (value: string) => { - Session.set('projectId', value); - userInfos.value.projectId = value; - await initBackEndControlRoutes(); - }; - - // 页面载入时执行方法 - onMounted(() => { - getListByPage(); - getAllDepartment() - }); - - return { - View, - Edit, - Delete, - Refresh, - Plus, - Finished, - Download, - reLoadData, - toApply, - handleClick, - toNames, - searchRecord, - clearSearch, - viewRecord, - viewStatus, - deleteRecordBtn, - downLoadBtn, - conFirmDelete, - conFirmDownLoad, - getListByPage, - handleSizeChange1, - handleCurrentChange1, - ...toRefs(state) - }; - } -}); -</script> - -<style scoped lang="scss"> -$homeNavLengh: 8; -.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); - } - } - .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 { - 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/workTicket/wdsqjl/index.vue b/src/views/specialWorkSystem/workTicket/wdsqjl/index.vue deleted file mode 100644 index e38b1c2..0000000 --- a/src/views/specialWorkSystem/workTicket/wdsqjl/index.vue +++ /dev/null @@ -1,904 +0,0 @@ -<template> - <div class="home-container"> -<!-- <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">--> -<!-- <el-tab-pane label="申请中" name="1">--> - <div style="height: 100%"> - <el-row class="homeCard"> - <el-col :span="5" style="display:flex;align-items: center"> - <span style="white-space: nowrap">作业类型:</span> - <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> - </div> - </el-col> - <el-col :span="5" style="display:flex;align-items: center"> - <span style="white-space: nowrap">申请部门:</span> - <div class="grid-content topInfo"> - <el-cascader v-model="searchDep" :options="departmentList" :props="casProps" :show-all-levels="false"/> - </div> - </el-col> - <el-col :span="8" style="display:flex;align-items: center;"> - <span style="white-space: nowrap;margin-left: 20px">申请时间:</span> - <div class="grid-content topInfo"> - <el-date-picker - v-model="searchDate" - type="daterange" - unlink-panels - range-separator="至" - start-placeholder="开始日期" - end-placeholder="结束日期" - format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" - /> - </div> - </el-col> - <el-button type="primary" style="margin-left: 20px" @click="searchRecord">查询</el-button> - <el-button plain @click="clearSearch">重置</el-button> - </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> - <el-table ref="multipleTableRef" :data="applyData" style="width: 100%" height="calc(100% - 100px)" :header-cell-style="{ background: '#fafafa' }"> - <el-table-column property="workPermitNo" label="作业申请单号" width="180" align="center"/> - <el-table-column property="applyUname" label="申请人" align="center"/> - <el-table-column property="depName" label="部门名称" align="center"/> - <el-table-column property="operators" label="作业人" align="center"/> - <el-table-column property="workTypeDesc" label="作业类型" align="center"/> - <el-table-column property="workLevelDesc" label="作业等级" align="center"/> - <el-table-column property="materialStatus" label="物资状态" align="center" width="180"> - <template #default="scope"> - <span>{{ scope.row.materialStatus==0?'未关联物资':(scope.row.materialStatus==1?'必选物资配备不足':(scope.row.materialStatus==2?'必选物资配备齐全':(scope.row.materialStatus==3?'物资配置专业':(scope.row.materialStatus==4?'物资配置高端':'-')))) }}</span> - </template> - </el-table-column> - <el-table-column property="applyTime" label="申请时间" width="180" align="center"/> - <el-table-column label="申请状态" align="center" width="140"> - <template #default="scope"> - <el-tag :type="scope.row.status==2?'success':(scope.row.status==8||scope.row.status==9)?'warning':'danger'">{{ scope.row.statusDesc }}</el-tag> - </template> - </el-table-column> - <el-table-column label="作业状态" align="center"> - <template #default="scope"> - <el-tag :type="scope.row.working == null? 'danger':scope.row.working.workStatus==2?'success':scope.row.working.workStatus==1?'warning':'danger'">{{ scope.row.working==null?'未开始':scope.row.working.workStatus == 1?'开始': scope.row.working.workStatus == 2?'结束':'未开始'}}</el-tag> - </template> - </el-table-column> - <el-table-column label="验收状态" align="center"> - <template #default="scope"> - <el-tag :type="scope.row.working == null? 'danger':scope.row.working.workAcceptStatus==2?'success':scope.row.working.workAcceptStatus== 1?'warning':'danger'">{{ scope.row.working==null?'未开始':scope.row.working.workAcceptStatus == 1?'等待验收': scope.row.working.workAcceptStatus == 2? '已验收':'未开始'}}</el-tag> - </template> - </el-table-column> - <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="success" size="small" :icon="Finished" @click="viewStatus(scope.row)">进度</el-button> - <el-button :disabled="scope.row.working && scope.row.working.workAcceptStatus == 2 ? false : true" link type="primary" size="small" :icon="Download" @click="downLoadBtn(scope.row)">导出作业票</el-button> - </template> - </el-table-column> - </el-table> - <div class="pageBtn"> - <el-pagination v-model:currentPage="pageIndex1" v-model:page-size="pageSize1" :page-sizes="[10, 15]" small="false" background layout="total, sizes, prev, pager, next, jumper" :total="totalSize1" @size-change="handleSizeChange1" @current-change="handleCurrentChange1" /> - </div> - </div> - </div> - </div> - <el-dialog v-model="dialogDetails" title="作业申请详情" center> - <fire v-if="dialogType == 1" :details = details></fire> - <space v-else-if="dialogType == 2" :details = details></space> - <hoist v-else-if="dialogType == 3" :details = details></hoist> - <ground v-else-if="dialogType == 4" :details = details></ground> - <broken v-else-if="dialogType == 5" :details = details></broken> - <height v-else-if="dialogType == 6" :details = details></height> - <power v-else-if="dialogType == 7" :details = details></power> - <plate v-else :details = details></plate> - <template #footer> - <span class="dialog-footer"> - <el-button type="primary" @click="dialogDetails = false" - >确认</el-button - > - </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>{{ item.approvalResultDesc }}</span> - </div> - <div class="text" v-if="item.approvalTypeDesc"> - 层级类型:<span>{{ item.approvalTypeDesc }}</span> - </div> - <div class="text" v-if="item.auditTypeDesc"> - 审批类型:<span>{{ item.auditTypeDesc }}</span> - </div> - <div class="text" v-if="item.personTypeDesc"> - 人员类型:<span>{{ item.personTypeDesc }}</span> - </div> - <div class="text" v-if="item.contentTypeDesc"> - 内容类型:<span>{{ item.contentTypeDesc }}</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" v-if="item.contentType==1"> - <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 != 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="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>--> - </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 { 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 { workApplyApi } from '/@/api/specialWorkSystem/workApply'; -import type { TabsPaneContext } from 'element-plus'; -import {teamManageApi} from "/@/api/systemManage/basicDateManage/personShiftManage/teamManage"; -import Cookies from 'js-cookie'; -import axios from 'axios'; - -// 定义接口来定义对象的类型 -interface stateType { - applyData: Array<string>; - workTimeList: Array<string>; - multipleSelection: Array<any>; - deleteArr: Array<any>; - casProps: {}; - 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: number | null; - searchDep: number | null; - searchDate: Array<any>, - totalSize1: number; - activeName: string; - addRecord: {}; - details: {}; - statusInfo: {}; - workType: Array<type>; - dialogType: number | null; - departmentList: Array<any>; - departmentRecursionList: Array<DepartmentState>; -} -interface type { - id: number; - name: string; -} -interface DepartmentState { - depId: number; - depName: string; -} -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')) - }, - setup() { - const userInfo = useUserInfo(); - const { userInfos } = storeToRefs(userInfo); - const router = useRouter(); - const state = reactive<stateType>({ - pageIndex1: 1, - pageSize1: 10, - totalSize1: 0, - dialogType: null, - activeName: '1', - departmentList: [], - departmentRecursionList: [], - chosenIndex: null, - searchWord: null, - searchDep: null, - searchDate: [], - applyData: [], - workTimeList: [], - multipleSelection: [], - approveInfo: { - approvalSteps: [], - operators: [] - }, - casProps: { - expandTrigger: 'hover', - emitPath: false, - value: 'depId', - label: 'depName', - checkStrictly: true - }, - dialogDetails: false, - dialogStatus: false, - deleteDialog: false, - downLoadDialog: false, - addRecord: {}, - details: {}, - statusInfo: {}, - deleteId: null, - downLoadId: null, - downLoadName: '', - deleteArr: [], - workType: [ - { id: 1, name: '动火作业' }, - { id: 2, name: '受限空间作业' }, - { id: 3, name: '吊装作业' }, - { id: 4, name: '动土作业' }, - { id: 5, name: '断路作业' }, - { id: 6, name: '高处作业' }, - { id: 7, name: '临时用电作业' }, - { id: 8, name: '盲板抽堵作业' } - ] - }); - interface User { - name: string; - list: []; - info: string; - } - - // 刷新 - const reLoadData = async () => { - getListByPage(); - }; - - // 填写表单 - const toApply = () => { - router.push({ - path: 'zysq' - }); - }; - - const handleClick = (tab: TabsPaneContext, event: Event) => { - }; - - // 获取部门列表 - const getAllDepartment = async () => { - let res = await teamManageApi().getAllDepartment(); - if (res.data.code === '200') { - state.departmentList = JSON.parse(JSON.stringify(res.data.data)) - // recursion(state.departmentList); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - // const recursion = (value: any) => { - // for (let i of value) { - // if (i.children.length !== 0) { - // state.departmentRecursionList.push(i); - // recursion(i.children); - // } else { - // state.departmentRecursionList.push(i); - // } - // } - // }; - - // 分页获取列表 - const getListByPage = async () => { - const dateRange = JSON.parse(JSON.stringify(state.searchDate)) - if(dateRange[1]){dateRange[1] = dateRange[1].replace('00:00:00','23:59:59')} - const data = { pageSize: state.pageSize1, pageIndex: state.pageIndex1, searchParams: { workType: state.searchWord, applyDepId: state.searchDep,applyStartTime: dateRange[0],applyEndTime: dateRange[1]} }; - let res = await workApplyApi().getApplyList(data); - if (res.data.code === '200') { - state.applyData = JSON.parse(JSON.stringify(res.data.data)); - state.applyData = state.applyData.map((item) => { - if (item.operators == null || item.operators == []) { - item.operators = []; - } else { - item.operators = Array.from(item.operators, ({ operatorUname }) => operatorUname); - } - return item; - }); - state.totalSize1 = res.data.total; - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - // 表格数据格式化 - const toNames = (row, column, cellValue, index) => { - if (row.list == []) { - return []; - } else { - const nameList = []; - for (let i = 0; i < row.list.length; i++) { - for (let t = 0; t < state.workTimeList.length; t++) { - if (row.list[i] == state.workTimeList[t].id) { - nameList.push(state.workTimeList[t].name); - } - } - } - return nameList.join(); - } - }; - - // 关键词查询记录 - const searchRecord = async () => { - if (state.searchWord == null && state.searchDep == null && state.searchDate == []) { - ElMessage({ - type: 'warning', - message: '请输入查询关键词' - }); - } else { - getListByPage(); - } - }; - // 重置搜索 - const clearSearch = async () => { - state.searchWord = null; - state.searchDep = null; - state.searchDate = [] - getListByPage(); - }; - - // 查看进度 - const viewStatus = (row) => { - getStatus({ workApplyId: row.workApplyId }); - }; - - // 查询进度方法 - const getStatus = async (data: any) => { - let res = await workApplyApi().getAllStatus(data); - if (res.data.code === '200') { - state.approveInfo = JSON.parse(JSON.stringify(res.data.data)); - state.approveInfo.operators = Array.from(state.approveInfo.operators, ({ operatorUname }) => operatorUname); - state.dialogStatus = true; - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - const deleteRecordBtn = (row) => { - state.deleteId = row.workApplyId; - state.deleteDialog = true; - }; - - // 导出图表 - const downLoadBtn = (row:any) =>{ - state.downLoadId = row.workApplyId; - state.downLoadName = row.workTypeDesc + row.workPermitNo - state.downLoadDialog = true; - } - - // 导出方法 - const downLoadRecord = async (data: any) => { - // let res = await workApplyApi().postPrinting(data); - axios.post(import.meta.env.VITE_API_URL + `/work/apply/printingPdf`,data,{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", state.downLoadName + "作业证.pdf"); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } else { - ElMessage({ - type: 'warning', - message: '导出失败' - }); - } - }) - - }; - - const conFirmDownLoad = () => { - downLoadRecord({ applyWorkId: state.downLoadId }); - state.downLoadDialog = false; - }; - - const handleSizeChange1 = (val: number) => { - state.pageSize1 = val; - getListByPage(); - }; - const handleCurrentChange1 = (val: number) => { - state.pageIndex1 = val; - getListByPage(); - }; - - // 查看记录 - const viewRecord = (row: any) => { - state.dialogType = row.workType - state.details = JSON.parse(JSON.stringify(row)); - if(state.details.workDetail.otherSpecialWork == '' || !state.details.workDetail.otherSpecialWork){ - state.details.workDetail.otherSpecialWork=[] - } - else { - const a = state.details.workDetail.otherSpecialWork - state.details.workDetail.otherSpecialWork = a.split(',').map((item) => { - return state.workType.find((i: { id: number }) => i.id === Number(item))?.name; - }); - } - if(state.details.workDetail.involvedDepIds == '' || !state.details.workDetail.involvedDepIds){ - state.details.workDetail.involvedDepIds=[] - } - else { - const a = state.details.workDetail.involvedDepIds - state.details.workDetail.involvedDepIds = a.split(',').map((item) => { - return state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(item))?.depName; - }); - } - if(state.details.workDetail.csDepId){ - state.details.workDetail.csDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.csDepId))?.depName; - } - if(state.details.workDetail.operationDepId){ - state.details.workDetail.operationDepId = state.departmentRecursionList.find((i: { depId: number }) => i.depId === Number(state.details.workDetail.operationDepId))?.depName; - } - if(state.details.workDetail.gbPath){ - state.details.workDetail.gbPath = state.details.workDetail.gbPath.split(',') - } - if(state.details.workDetail.bcPath){ - state.details.workDetail.bcPath = state.details.workDetail.bcPath.split(',') - } - if(state.details.workDetail.bpLocationMapPath){ - state.details.workDetail.bpLocationMapPath = state.details.workDetail.bpLocationMapPath.split(',') - } - state.dialogDetails = true; - }; - - // 折线图 - const renderMenu = async (value: string) => { - Session.set('projectId', value); - userInfos.value.projectId = value; - await initBackEndControlRoutes(); - }; - - // 页面载入时执行方法 - onMounted(() => { - getListByPage(); - getAllDepartment() - }); - - return { - View, - Edit, - Delete, - Refresh, - Plus, - Finished, - Download, - reLoadData, - toApply, - handleClick, - toNames, - searchRecord, - clearSearch, - viewRecord, - viewStatus, - deleteRecordBtn, - downLoadBtn, - conFirmDownLoad, - getListByPage, - handleSizeChange1, - handleCurrentChange1, - ...toRefs(state) - }; - } -}); -</script> - -<style scoped lang="scss"> -$homeNavLengh: 8; -.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); - } - } - .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 { - font-weight: bolder; - color: #409eff; - } - - &: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 { - display: flex; - align-items: center; - margin-bottom: 20px; - &:last-child { - margin-bottom: 0; - } - .grid-content { - align-items: center; - min-height: 36px; - } - - .topInfo { - width: 100%; - display: flex; - align-items: center; - font-size: 16px; - font-weight: bold; - - & > div { - white-space: nowrap; - margin-right: 20px; - } - } - } -} -.el-card { - border: 0; -} -.el-input{ - width: 100% !important; -} -::v-deep(.el-date-editor){ - width: 100%; -} -.el-select{ - width: 100%; -} -:deep(.el-cascader){ - width: 100% !important; -} -</style> diff --git a/src/views/specialWorkSystem/workTicket/zysq/components/broken.vue b/src/views/specialWorkSystem/workTicket/zysq/components/broken.vue deleted file mode 100644 index 65df3eb..0000000 --- a/src/views/specialWorkSystem/workTicket/zysq/components/broken.vue +++ /dev/null @@ -1,518 +0,0 @@ -<template> - <div class="home-container"> - <div style="height: 100%"> - <el-form :model="form" label-width="150px" :rules="applyRules" ref="ruleFormRef"> - <div class="homeCard"> - <el-row> - <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" multiple> - <el-option - v-for="item in workerList" - :key="item.uid" - :label="item.username" - :value="item.uid" - /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业时间" prop="workTimeLine"> - <el-date-picker - v-model="form.workTimeLine" - format="YYYY-MM-DD HH:mm" - value-format="YYYY-MM-DD HH:mm:00" - type="datetimerange" - range-separator="至" - start-placeholder="开始时间" - end-placeholder="结束时间" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业内容" prop="workContent"> - <el-input - v-model="form.workContent" - autosize - type="textarea" - placeholder="请输入作业内容" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业地址" prop="workLocation"> - <el-input - v-model="form.workLocation" - autosize - type="textarea" - placeholder="请输入作业地址" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="危害辨识" prop="hazardIdentification"> - <el-input - v-model="form.hazardIdentification" - placeholder="请输入危害辨识" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="关联视频设备" prop="cameraIds"> - <el-select v-model="form.cameraIds" multiple> - <el-option - v-for="item in deviceList" - :key="item.id" - :label="item.name" - :value="item.id" - /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <el-divider border-style="dashed"/> - <el-row> - <el-col :span="12"> - <el-form-item label="作业单位" prop="workDetail.operationDepId"> -<!-- <el-select v-model="form.workDetail.operationDepId">--> -<!-- <el-option--> -<!-- v-for="item in csDepList"--> -<!-- :key="item.value"--> -<!-- :label="item.label"--> -<!-- :value="item.value"--> -<!-- />--> -<!-- </el-select>--> - <el-cascader v-model="form.workDetail.operationDepId" :options="departList" :props="casProps2" :show-all-levels="false" @change="handleChange2" /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="断路原因" prop="workDetail.bcReason"> - <el-input - v-model="form.workDetail.bcReason" - autosize - type="textarea" - placeholder="请输入" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="断路地段说明" prop="workDetail.bcExplain"> - <el-input - v-model="form.workDetail.bcExplain" - autosize - type="textarea" - placeholder="请输入" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="涉及相关部门" prop="workDetail.involvedDepIds"> - <el-cascader v-model="form.workDetail.involvedDepIds" :options="departList" :props="casProps" :show-all-levels="false" @change="handleChange" /> - </el-form-item> - </el-col> - </el-row> - <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" :before-remove="beforeRemove" :before-upload="getUploadUrl"> - <el-icon><Plus /></el-icon> - <template #tip> - <div class="el-upload__tip">上传jpg/png图片尺寸小于500KB,最多可上传3张</div> - </template> - </el-upload> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="选择关联物资"> - <el-button type="primary" @click="openMaList">选择物资标准</el-button> - </el-form-item> - </el-col> - </el-row> - </div> - </el-form> - <material-dialog ref="material" @conFirmMaterials="conFirmMaterials"></material-dialog> - <div class="applyBtn"> - <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">发起申请</el-button> - </div> - </div> - <el-dialog v-model="dialogVisible"> - <img w-full :src="dialogImageUrl" alt="Preview Image" /> - </el-dialog> - </div> -</template> - -<script lang="ts"> -import {toRefs, reactive, defineComponent, ref, defineAsyncComponent} from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage, ElMessageBox } from 'element-plus' - import type { FormInstance, FormRules, UploadProps, UploadUserFile } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - import axios from 'axios'; - - interface stateType { - form: Object, - csDepList: Array<any>, - fileList: Array<file>, - uploadUrl: string, - dialogVisible: Boolean, - dialogImageUrl: string | null, - imgLimit: number, - casProps: {}, - casProps2: {}, - isOverSize: boolean, - } - interface file { - url: string; - } - export default defineComponent({ - name: 'brokenForm', - components: { - materialDialog: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/materialDialog.vue')), - }, - props:['workerList','departList','deviceList'], - setup(props: any, context: any) { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - const state = reactive<stateType>({ - form: { - operatorUids: [], - workType: 5, - workLevel: 0, - workContent: '', - workLocation: '', - hazardIdentification: '', - cameraIds: [], - maBaseId: null, - workDetail:{ - operationDepId: null, - bcReason: '', - bcExplain: '', - bcPath: [], - involvedDepIds: [] - }, - receiveUids: [], - workTimeLine: [], - expStartTime: '', - expEndTime: '' - }, - isOverSize: false, - fileList: [], - imgLimit: 3, - uploadUrl: '', - dialogVisible: false, - dialogImageUrl: null, - csDepList: [ - { - label: "单位一", - value: 1 - }, - { - label: "单位二", - value: 2 - }, - { - label: "单位三", - value: 3 - }, - { - label: "单位四", - value: 4 - }, - { - label: "单位五", - value: 5 - }, - { - label: "单位六", - value: 6 - } - ], - casProps: { - emitPath: false, - value: 'depId', - label: 'depName', - multiple: true, - expandTrigger: 'hover' - }, - casProps2: { - emitPath: false, - value: 'depId', - label: 'depName', - multiple: false, - expandTrigger: 'hover', - checkStrictly: true - } - }); - const material = ref() - const ruleFormRef = ref<FormInstance>() - const applyRules = reactive<FormRules>({ - operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workType: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - hazardIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - cameraIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workTimeLine: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.operationDepId": [{ 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.involvedDepIds": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] - }); - - // const toZero = (value: string | number,index: number,name: string,x:number) =>{ - // if(!value){ - // state.materialList[index][name][x].value = 0 - // } - // } - - const openMaList = ()=>{ - if(state.form.operatorUids == []){ - ElMessage({ - type: 'warning', - message: '请先选择作业人再获取相应物资配置' - }); - }else{ - if(material.value.receiveUids.length==0){ - material.value.receiveUids = state.form.operatorUids - } - material.value.getMaList(state.form.workType,state.form.workLevel) - material.value.workerList = props.workerList - } - } - const conFirmMaterials = (receiveUids: Array<number>,chosenId: number) =>{ - state.form.maBaseId = null - state.form.receiveUids = [] - state.form.receiveUids = receiveUids - state.form.maBaseId = chosenId - } - - const submitForm = async (formEl: FormInstance | undefined) => { - if (!formEl) return - await formEl.validate(async (valid, fields) => { - if (valid) { - // if (state.form.wmAddReqDTOList == null || state.form.wmAddReqDTOList.length == 0){ - // ElMessage({ - // type: 'warning', - // message: '请确认关联物资的配置' - // }); - // return - // } - state.form.expStartTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[0] - state.form.expEndTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[1] - let { workTimeLine, ...data } = JSON.parse(JSON.stringify(state.form)) - data.workDetail.involvedDepIds = data.workDetail.involvedDepIds.join(',') - data.workDetail.bcPath = data.workDetail.bcPath.join(',') - const res = await workApplyApi().postBrokenApply(data) - if (res.data.code === '200') { - ElMessage({ - type: 'success', - message: '提交成功!' - }); - formEl.resetFields() - state.form.workDetail.bcPath = [] - state.fileList = [] - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - material.value.maBaseId = null - material.value.receiveUids = [] - } else { - console.log('error submit!', fields) - } - }) - } - - 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 < 500 ? '1' : '0' - if(fileSize === '0'){ - ElMessage({ - type: 'warning', - message: '文件大小不能超过500k。' - }); - state.isOverSize = true - return false - }else{ - const res = await workApplyApi().getUploadUrl(rawFile.name); - state.form.workDetail.bcPath.push(res.data.data.fileName) - state.uploadUrl = res.data.data.uploadUrl; - console.log(res.data.data.fileName,'name') - } - }; - - const upload = async (params: any) => { - // const formData = new FormData(); - // formData.append('file', state.fileList[0].raw); - 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.form.workDetail.bcPath,'bcPath') - }); - }; - }; - - const beforeRemove = (file: {}, fileList: []) => { - const result = new Promise((resolve, reject) => { - if(!state.isOverSize){ - 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]) - } - }) - // 请求删除接口 - }) - .catch(() => { - reject(false); - }); - }else{ - 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(true,list[index]) - } - }) - state.isOverSize = false - } - }); - return result; - }; - - - // 删除图片接口 - const deletePic = async(isOverSize:boolean,fileName:string)=>{ - console.log(fileName,'fileName') - const res = await workApplyApi().deleteFile({fileName: fileName}) - if (res.data.code === '200') { - ElMessage({ - type: isOverSize ? 'error' : 'success', - message: isOverSize ? '上传失败':'删除成功!' - }); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - } - - const showTip =()=>{ - ElMessage({ - type: 'warning', - message: '超出文件上传数量' - }); - } - - // 折线图 - const renderMenu = async (value: string) => { - Session.set('projectId',value) - userInfos.value.projectId = value - await initBackEndControlRoutes(); - }; - return { - renderMenu, - Search, - ruleFormRef, - applyRules, - material, - conFirmMaterials, - openMaList, - handlePreview, - getUploadUrl, - beforeRemove, - upload, - showTip, - submitForm, - handlePictureCardPreview, - ...toRefs(state), - }; - }, - }); -</script> - -<style scoped lang="scss"> - .home-container { - height: 100%; - overflow: hidden; - position: relative; - .homeCard{ - width: 100%; - padding: 20px; - box-sizing: border-box; - background: #fff; - border-radius: 4px; - margin-bottom: 20px; - } - .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%; - } - :deep(.el-cascader){ - width: 100% !important; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/zysq/components/fire.vue b/src/views/specialWorkSystem/workTicket/zysq/components/fire.vue deleted file mode 100644 index bc19fc9..0000000 --- a/src/views/specialWorkSystem/workTicket/zysq/components/fire.vue +++ /dev/null @@ -1,382 +0,0 @@ -<template> - <div class="home-container"> - <div style="height: 100%"> - <el-form :model="form" label-width="150px" :rules="applyRules" ref="ruleFormRef"> - <div class="homeCard"> - <el-row> - <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" multiple> - <el-option - v-for="item in workerList" - :key="item.uid" - :label="item.username" - :value="item.uid" - /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业时间" prop="workTimeLine"> - <el-date-picker - v-model="form.workTimeLine" - format="YYYY-MM-DD HH:mm" - value-format="YYYY-MM-DD HH:mm:00" - type="datetimerange" - range-separator="至" - start-placeholder="开始时间" - end-placeholder="结束时间" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业等级" prop="workLevel"> - <el-select v-model="form.workLevel"> - <el-option - v-for="item in workLevelList" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业内容" prop="workContent"> - <el-input - v-model="form.workContent" - autosize - type="textarea" - placeholder="请输入作业内容" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业地址" prop="workLocation"> - <el-input - v-model="form.workLocation" - autosize - type="textarea" - placeholder="请输入作业地址" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="危害辨识" prop="hazardIdentification"> - <el-input - v-model="form.hazardIdentification" - placeholder="请输入危害辨识" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="关联视频设备" prop="cameraIds"> - <el-select v-model="form.cameraIds" multiple> - <el-option - v-for="item in deviceList" - :key="item.id" - :label="item.name" - :value="item.id" - /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <el-divider border-style="dashed"/> - <el-row> - <el-col :span="12"> - <el-form-item label="动火方式" prop="workDetail.hotMethod"> - <el-input - v-model="form.workDetail.hotMethod" - autosize - type="textarea" - placeholder="请输入动火方式" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="关联作业" prop="workDetail.otherSpecialWork"> - <el-select v-model="form.workDetail.otherSpecialWork" multiple> - <el-option - v-for="item in otherWorkList" - :key="item.value" - :label="item.label" - :value="item.label" - /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="选择关联物资"> - <el-button type="primary" @click="openMaList">选择物资标准</el-button> - </el-form-item> - </el-col> - </el-row> - </div> - </el-form> - <material-dialog ref="material" @conFirmMaterials="conFirmMaterials"></material-dialog> - <div class="applyBtn"> - <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">发起申请</el-button> - </div> - </div> - </div> -</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 } from '@element-plus/icons-vue' - import { ElMessage, ElMessageBox } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - interface stateType { - form: Object, - workLevelList: Array<any>, - otherWorkList: Array<any>, - equipmentDialog: boolean - } - export default defineComponent({ - name: 'fireForm', - components: { - materialDialog: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/materialDialog.vue')), - }, - props:['workerList','deviceList'], - setup(props: any, context: any) { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - const state = reactive<stateType>({ - equipmentDialog: false, - form: { - operatorUids: [], - workType: 1, - workLevel: null, - workContent: '', - workLocation: '', - maBaseId: null, - hazardIdentification: '', - cameraIds: [], - workDetail:{ - hotMethod: '', - otherSpecialWork: [] - }, - receiveUids: [], - workTimeLine: [], - expStartTime: '', - expEndTime: '' - }, - workLevelList: [ - { - label: "一级动火作业", - value: 1 - }, - { - label: "二级动火作业", - value: 2 - }, - { - 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 - } - ] - }); - const material = ref() - const ruleFormRef = ref<FormInstance>() - const applyRules = reactive<FormRules>({ - operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workType: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workLevel: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - hazardIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - cameraIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workTimeLine: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.hotMethod": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] - }); - - // 页面载入时执行方法 - onMounted(() => { - - }); - // const toZero = (value: string | number,index: number,name: string,x:number) =>{ - // if(!value){ - // state.materialList[index][name][x].value = 0 - // } - // } - const openMaList = ()=>{ - if(state.form.workLevel == null || state.form.operatorUids == []){ - ElMessage({ - type: 'warning', - message: '请先选择作业人和作业等级再获取相应物资配置' - }); - }else{ - if(material.value.receiveUids.length==0){ - material.value.receiveUids = state.form.operatorUids - } - material.value.getMaList(state.form.workType,state.form.workLevel) - material.value.workerList = props.workerList - } - } - const conFirmMaterials = (receiveUids: Array<number>,chosenId: number) =>{ - state.form.maBaseId = null - state.form.receiveUids = [] - state.form.receiveUids = receiveUids - state.form.maBaseId = chosenId - } - const submitForm = async (formEl: FormInstance | undefined) => { - if (!formEl) return - await formEl.validate(async (valid, fields) => { - if (valid) { - // if (state.form.wmAddReqDTOList == null || state.form.wmAddReqDTOList.length == 0){ - // ElMessage({ - // type: 'warning', - // message: '请确认关联物资的配置' - // }); - // return - // } - state.form.expStartTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[0] - state.form.expEndTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[1] - let { workTimeLine, ...data } = JSON.parse(JSON.stringify(state.form)) - data.workDetail.otherSpecialWork = data.workDetail.otherSpecialWork.join(',') - const res = await workApplyApi().postFireApply(data) - if (res.data.code === '200') { - ElMessage({ - type: 'success', - message: '提交成功!' - }); - formEl.resetFields() - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - material.value.maBaseId = null - material.value.receiveUids = [] - } else { - console.log('error submit!', fields) - } - }) - } - - // 折线图 - const renderMenu = async (value: string) => { - Session.set('projectId',value) - userInfos.value.projectId = value - await initBackEndControlRoutes(); - }; - return { - renderMenu, - Search, - material, - ruleFormRef, - applyRules, - openMaList, - conFirmMaterials, - submitForm, - ...toRefs(state), - }; - }, - }); -</script> - -<style scoped lang="scss"> - .home-container { - height: 100%; - overflow: hidden; - position: relative; - .homeCard{ - width: 100%; - padding: 20px; - box-sizing: border-box; - background: #fff; - border-radius: 4px; - margin-bottom: 20px; - } - .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; - } - } - - .tab-i{ - margin-bottom: 15px; - - &:last-of-type{ - margin-bottom: 0; - } - ::v-deep(.el-form-item){ - .el-form-item__label{ - margin-bottom: 4px; - } - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/zysq/components/ground.vue b/src/views/specialWorkSystem/workTicket/zysq/components/ground.vue deleted file mode 100644 index 6838d8e..0000000 --- a/src/views/specialWorkSystem/workTicket/zysq/components/ground.vue +++ /dev/null @@ -1,577 +0,0 @@ - <template> - <div class="home-container"> - <div style="height: 100%"> - <el-form :model="form" label-width="150px" :rules="applyRules" ref="ruleFormRef"> - <div class="homeCard"> - <el-row> - <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" multiple> - <el-option - v-for="item in workerList" - :key="item.uid" - :label="item.username" - :value="item.uid" - /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业时间" prop="workTimeLine"> - <el-date-picker - v-model="form.workTimeLine" - format="YYYY-MM-DD HH:mm" - value-format="YYYY-MM-DD HH:mm:00" - type="datetimerange" - range-separator="至" - start-placeholder="开始时间" - end-placeholder="结束时间" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业内容" prop="workContent"> - <el-input - v-model="form.workContent" - autosize - type="textarea" - placeholder="请输入作业内容" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业地址" prop="workLocation"> - <el-input - v-model="form.workLocation" - autosize - type="textarea" - placeholder="请输入作业地址" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="危害辨识" prop="hazardIdentification"> - <el-input - v-model="form.hazardIdentification" - placeholder="请输入危害辨识" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="关联视频设备" prop="cameraIds"> - <el-select v-model="form.cameraIds" multiple> - <el-option - v-for="item in deviceList" - :key="item.id" - :label="item.name" - :value="item.id" - /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <el-divider border-style="dashed"/> - <el-row> - <el-col :span="12"> - <el-form-item label="作业单位" prop="workDetail.operationDepId"> -<!-- <el-select v-model="form.workDetail.operationDepId">--> -<!-- <el-option--> -<!-- v-for="item in csDepList"--> -<!-- :key="item.value"--> -<!-- :label="item.label"--> -<!-- :value="item.value"--> -<!-- />--> -<!-- </el-select>--> - <el-cascader v-model="form.workDetail.operationDepId" :options="departList" :props="casProps" :show-all-levels="false" @change="handleChange" /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="范围" prop="workDetail.gbScope"> - <el-input - v-model="form.workDetail.gbScope" - autosize - type="textarea" - placeholder="请输入" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="动土方式" prop="workDetail.gbMethod"> - <el-input - v-model="form.workDetail.gbMethod" - autosize - type="textarea" - placeholder="请输入" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="关联作业" prop="workDetail.otherSpecialWork"> - <el-select v-model="form.workDetail.otherSpecialWork" multiple> - <el-option v-for="item in otherWorkList" :key="item.value" :label="item.label" :value="item.label" /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <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" :before-remove="beforeRemove" :before-upload="getUploadUrl"> - <el-icon><Plus /></el-icon> - <template #tip> - <div class="el-upload__tip">上传jpg/png图片尺寸小于500KB,最多可上传3张</div> - </template> - </el-upload> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="选择关联物资"> - <el-button type="primary" @click="openMaList">选择物资标准</el-button> - </el-form-item> - </el-col> - </el-row> - </div> - </el-form> - <material-dialog ref="material" @conFirmMaterials="conFirmMaterials"></material-dialog> - <div class="applyBtn"> - <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">发起申请</el-button> - </div> - </div> - <el-dialog v-model="dialogVisible"> - <img w-full :src="dialogImageUrl" alt="Preview Image" /> - </el-dialog> - </div> -</template> - -<script lang="ts"> - import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search,Plus } from '@element-plus/icons-vue' - import { ElMessage, ElMessageBox } from 'element-plus' - import type { FormInstance, FormRules, UploadProps, UploadUserFile } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - import axios from 'axios'; - - interface stateType { - equipmentDialog: boolean, - form: Object, - csDepList: Array<any>, - otherWorkList: Array<any>, - fileList: Array<file>, - uploadUrl: string, - dialogVisible: Boolean, - dialogImageUrl: string | null, - imgLimit: number, - casProps: {}, - isOverSize: Boolean - } - interface file { - url: string; - } - export default { - name: 'groundForm', - components: { - materialDialog: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/materialDialog.vue')), - }, - props:['workerList','departList', 'deviceList'], - setup(props: any, context: any) { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - const state = reactive<stateType>({ - equipmentDialog: false, - form: { - operatorUids: [], - workType: 4, - workLevel: 0, - workContent: '', - workLocation: '', - hazardIdentification: '', - cameraIds: [], - maBaseId: null, - workDetail:{ - operationDepId: null, - gbScope: '', - gbMethod: '', - gbPath: [], - otherSpecialWork: [] - }, - receiveUids: [], - workTimeLine: [], - expStartTime: '', - expEndTime: '' - }, - isOverSize: false, - fileList: [], - imgLimit: 3, - uploadUrl: '', - dialogVisible: false, - dialogImageUrl: null, - csDepList: [ - { - label: "单位一", - value: 1 - }, - { - label: "单位二", - value: 2 - }, - { - label: "单位三", - value: 3 - }, - { - label: "单位四", - value: 4 - }, - { - label: "单位五", - value: 5 - }, - { - label: "单位六", - value: 6 - } - ], - 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 - } - ], - casProps: { - emitPath: false, - value: 'depId', - label: 'depName', - multiple: false, - expandTrigger: 'hover', - checkStrictly: true - } - }); - const material = ref() - const ruleFormRef = ref<FormInstance>() - const applyRules = reactive<FormRules>({ - operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workType: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - hazardIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - cameraIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workTimeLine: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.operationDepId": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.gbScope": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.gbMethod": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.gbPath": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] - }); - // const toZero = (value: string | number,index: number,name: string,x:number) =>{ - // if(!value){ - // state.materialList[index][name][x].value = 0 - // } - // } - - const openMaList = ()=>{ - if(state.form.operatorUids == []){ - ElMessage({ - type: 'warning', - message: '请先选择作业人再获取相应物资配置' - }); - }else{ - if(material.value.receiveUids.length==0){ - material.value.receiveUids = state.form.operatorUids - } - material.value.getMaList(state.form.workType,state.form.workLevel) - material.value.workerList = props.workerList - } - } - const conFirmMaterials = (receiveUids: Array<number>,chosenId: number) =>{ - state.form.maBaseId = null - state.form.receiveUids = [] - state.form.receiveUids = receiveUids - state.form.maBaseId = chosenId - } - - const submitForm = async (formEl: FormInstance | undefined) => { - if (!formEl) return - await formEl.validate(async (valid, fields) => { - if (valid) { - // if (state.form.wmAddReqDTOList == null || state.form.wmAddReqDTOList.length == 0){ - // ElMessage({ - // type: 'warning', - // message: '请确认关联物资的配置' - // }); - // return - // } - state.form.expStartTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[0] - state.form.expEndTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[1] - let { workTimeLine, ...data } = JSON.parse(JSON.stringify(state.form)) - data.workDetail.otherSpecialWork = data.workDetail.otherSpecialWork.join(',') - data.workDetail.gbPath = data.workDetail.gbPath.join(',') - const res = await workApplyApi().postGroundApply(data) - if (res.data.code === '200') { - ElMessage({ - type: 'success', - message: '提交成功!' - }); - formEl.resetFields() - state.form.workDetail.gbPath = [] - state.fileList = [] - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - material.value.maBaseId = null - material.value.receiveUids = [] - } else { - console.log('error submit!', fields) - } - }) - } - - 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 < 500 ? '1' : '0' - if(fileSize === '0'){ - ElMessage({ - type: 'warning', - message: '文件大小不能超过500k。' - }); - state.isOverSize = true - return false - }else{ - const res = await workApplyApi().getUploadUrl(rawFile.name); - state.form.workDetail.gbPath.push(res.data.data.fileName) - state.uploadUrl = res.data.data.uploadUrl; - } - }; - - const upload = async (params: any) => { - // const formData = new FormData(); - // formData.append('file', state.fileList[0].raw); - 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.form.workDetail.gbPath,'gbpath') - }); - }; - }; - - const beforeRemove = (file: {}, fileList: []) => { - const result = new Promise((resolve, reject) => { - if(!state.isOverSize){ - ElMessageBox.confirm('此操作将删除该图片, 是否继续?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }) - .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) - // 请求删除接口 - deletePic(false,list[index]) - } - }) - }) - .catch(() => { - reject(false); - }); - }else{ - 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) - deletePic(true,list[index]) - } - }) - state.isOverSize = false - } - }); - return result; - }; - - - // 删除图片接口 - const deletePic = async(isOverSize:boolean,fileName:string)=>{ - const res = await workApplyApi().deleteFile({fileName: fileName}) - if (res.data.code === '200') { - ElMessage({ - type: isOverSize ? 'error' : 'success', - message: isOverSize ? '上传失败':'删除成功!' - }); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - } - - const showTip =()=>{ - ElMessage({ - type: 'warning', - message: '超出文件上传数量' - }); - } - - // const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => { - // console.log('2111111111111') - // }; - - // 折线图 - const renderMenu = async (value: string) => { - Session.set('projectId',value) - userInfos.value.projectId = value - await initBackEndControlRoutes(); - }; - return { - renderMenu, - Search, - Plus, - ruleFormRef, - applyRules, - material, - openMaList, - conFirmMaterials, - handlePreview, - getUploadUrl, - beforeRemove, - upload, - showTip, - submitForm, - handlePictureCardPreview, - ...toRefs(state), - }; - }, - }; -</script> - -<style scoped lang="scss"> - .avatar-uploader .avatar { - width: 178px; - height: 178px; - display: block; - } - .home-container { - height: 100%; - overflow: hidden; - position: relative; - .homeCard{ - width: 100%; - padding: 20px; - box-sizing: border-box; - background: #fff; - border-radius: 4px; - margin-bottom: 20px; - } - .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%; - } - :deep(.el-cascader){ - width: 100% !important; - } - } -</style> -<style> - .avatar-uploader .el-upload { - border: 1px dashed var(--el-border-color); - border-radius: 6px; - cursor: pointer; - position: relative; - overflow: hidden; - transition: var(--el-transition-duration-fast); - } - - .avatar-uploader .el-upload:hover { - border-color: var(--el-color-primary); - } - - .el-icon.avatar-uploader-icon { - font-size: 28px; - color: #8c939d; - width: 178px; - height: 178px; - text-align: center; - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/zysq/components/height.vue b/src/views/specialWorkSystem/workTicket/zysq/components/height.vue deleted file mode 100644 index af25685..0000000 --- a/src/views/specialWorkSystem/workTicket/zysq/components/height.vue +++ /dev/null @@ -1,443 +0,0 @@ -<template> - <div class="home-container"> - <div style="height: 100%"> - <el-form :model="form" label-width="150px" :rules="applyRules" ref="ruleFormRef"> - <div class="homeCard"> - <el-row> - <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" multiple> - <el-option - v-for="item in workerList" - :key="item.uid" - :label="item.username" - :value="item.uid" - /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业时间" prop="workTimeLine"> - <el-date-picker - v-model="form.workTimeLine" - format="YYYY-MM-DD HH:mm" - value-format="YYYY-MM-DD HH:mm:00" - type="datetimerange" - range-separator="至" - start-placeholder="开始时间" - end-placeholder="结束时间" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业等级" prop="workLevel"> - <el-select v-model="form.workLevel"> - <el-option - v-for="item in workLevelList" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业内容" prop="workContent"> - <el-input - v-model="form.workContent" - autosize - type="textarea" - placeholder="请输入作业内容" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业地址" prop="workLocation"> - <el-input - v-model="form.workLocation" - autosize - type="textarea" - placeholder="请输入作业地址" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="危害辨识" prop="hazardIdentification"> - <el-input - v-model="form.hazardIdentification" - placeholder="请输入危害辨识" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="关联视频设备" prop="cameraIds"> - <el-select v-model="form.cameraIds" multiple> - <el-option - v-for="item in deviceList" - :key="item.id" - :label="item.name" - :value="item.id" - /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="关联设备" prop="cameraIds"> - <el-select v-model="form.cameraIds" multiple> - <el-option - v-for="item in deviceList" - :key="item.id" - :label="item.name" - :value="item.id" - /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <el-divider border-style="dashed"/> - <el-row> - <el-col :span="12"> - <el-form-item label="作业单位" prop="workDetail.operationDepId"> - <!-- <el-select v-model="form.workDetail.operationDepId">--> - <!-- <el-option--> - <!-- v-for="item in heDepList"--> - <!-- :key="item.value"--> - <!-- :label="item.label"--> - <!-- :value="item.value"--> - <!-- />--> - <!-- </el-select>--> - <el-cascader v-model="form.workDetail.operationDepId" :options="departList" :props="casProps" :show-all-levels="false" @change="handleChange" /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业高度" prop="workDetail.operationHeight"> - <el-input - v-model="form.workDetail.operationHeight" - type="number" - placeholder="请输入作业高度(大于等于0)" - > - <template #append>米(m)</template> - </el-input> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="关联作业" prop="workDetail.otherSpecialWork"> - <el-select v-model="form.workDetail.otherSpecialWork" multiple> - <el-option - v-for="item in otherWorkList" - :key="item.value" - :label="item.label" - :value="item.label" - /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="选择关联物资"> - <el-button type="primary" @click="openMaList">选择物资标准</el-button> - </el-form-item> - </el-col> - </el-row> - </div> - </el-form> - <material-dialog ref="material" @conFirmMaterials="conFirmMaterials"></material-dialog> - <div class="applyBtn"> - <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">发起申请</el-button> - </div> - </div> - </div> -</template> - -<script lang="ts"> -import {toRefs, reactive, defineComponent, ref, defineAsyncComponent} from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage, ElMessageBox } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - - interface stateType { - equipmentDialog: boolean, - form: Object, - workTypeList: Array<any>, - workLevelList: Array<any>, - heDepList: Array<any>, - otherWorkList: Array<any>, - casProps:{} - } - export default defineComponent({ - name: 'heightForm', - components: { - materialDialog: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/materialDialog.vue')), - }, - props:['workerList','departList','deviceList'], - setup(props: any, context: any) { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - const state = reactive<stateType>({ - equipmentDialog: false, - form: { - operatorUids: [], - workType: 6, - workLevel: null, - workContent: '', - workLocation: '', - hazardIdentification: '', - cameraIds: [], - maBaseId: null, - workDetail:{ - operationDepId: '', - operationHeight: null, - otherSpecialWork: [] - }, - receiveUids: [], - workTimeLine: [], - expStartTime: '', - expEndTime: '' - }, - heDepList: [ - { - label: "单位一", - value: 1 - }, - { - label: "单位二", - value: 2 - }, - { - label: "单位三", - value: 3 - }, - { - label: "单位四", - value: 4 - }, - { - label: "单位五", - value: 5 - }, - { - label: "单位六", - value: 6 - } - ], - casProps: { - emitPath: false, - value: 'depId', - label: 'depName', - multiple: false, - expandTrigger: 'hover', - checkStrictly: true - }, - workTypeList: [ - { - label: "类型一", - value: 1 - }, - { - label: "类型二", - value: 2 - } - ], - workLevelList: [ - { - label: "一级高处作业", - value: 4 - }, - { - label: "二级高处作业", - value: 5 - }, - { - label: "三级高处作业", - value: 6 - }, - { - label: "特级高处作业", - 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 - } - ] - }); - const material = ref() - const ruleFormRef = ref<FormInstance>() - const applyRules = reactive<FormRules>({ - operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workType: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workLevel: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - hazardIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - cameraIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workTimeLine: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.operationDepId": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.operationHeight": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] - }); - - // const toZero = (value: string | number,index: number,name: string,x:number) =>{ - // if(!value){ - // state.materialList[index][name][x].value = 0 - // } - // } - const openMaList = ()=>{ - if(state.form.workLevel == null || state.form.operatorUids == []){ - ElMessage({ - type: 'warning', - message: '请先选择作业人和作业等级再获取相应物资配置' - }); - }else{ - if(material.value.receiveUids.length==0){ - material.value.receiveUids = state.form.operatorUids - } - material.value.getMaList(state.form.workType,state.form.workLevel) - material.value.workerList = props.workerList - } - } - const conFirmMaterials = (receiveUids: Array<number>,chosenId: number) =>{ - state.form.maBaseId = null - state.form.receiveUids = [] - state.form.receiveUids = receiveUids - state.form.maBaseId = chosenId - } - - const submitForm = async (formEl: FormInstance | undefined) => { - if (!formEl) return - await formEl.validate(async (valid, fields) => { - if (valid) { - state.form.expStartTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[0] - state.form.expEndTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[1] - let { workTimeLine, ...data } = JSON.parse(JSON.stringify(state.form)) - data.workDetail.otherSpecialWork = data.workDetail.otherSpecialWork.join(',') - const res = await workApplyApi().postHeightApply(data) - if (res.data.code === '200') { - ElMessage({ - type: 'success', - message: '提交成功!' - }); - formEl.resetFields() - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - material.value.maBaseId = null - material.value.receiveUids = [] - } else { - console.log('error submit!', fields) - } - }) - } - - - // 折线图 - const renderMenu = async (value: string) => { - Session.set('projectId',value) - userInfos.value.projectId = value - await initBackEndControlRoutes(); - }; - return { - renderMenu, - Search, - ruleFormRef, - applyRules, - material, - openMaList, - conFirmMaterials, - submitForm, - ...toRefs(state), - }; - }, - }); -</script> - -<style scoped lang="scss"> - .home-container { - height: 100%; - overflow: hidden; - position: relative; - .homeCard{ - width: 100%; - padding: 20px; - box-sizing: border-box; - background: #fff; - border-radius: 4px; - margin-bottom: 20px; - } - .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%; - } - :deep(.el-cascader){ - width: 100% !important; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/zysq/components/hoist.vue b/src/views/specialWorkSystem/workTicket/zysq/components/hoist.vue deleted file mode 100644 index e1ee0c5..0000000 --- a/src/views/specialWorkSystem/workTicket/zysq/components/hoist.vue +++ /dev/null @@ -1,324 +0,0 @@ -<template> - <div class="home-container"> - <div style="height: 100%"> - <el-form :model="form" label-width="150px" :rules="applyRules" ref="ruleFormRef"> - <div class="homeCard"> - <el-row> - <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" multiple> - <el-option - v-for="item in workerList" - :key="item.uid" - :label="item.username" - :value="item.uid" - /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业时间" prop="workTimeLine"> - <el-date-picker - v-model="form.workTimeLine" - format="YYYY-MM-DD HH:mm" - value-format="YYYY-MM-DD HH:mm:00" - type="datetimerange" - range-separator="至" - start-placeholder="开始时间" - end-placeholder="结束时间" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业等级" prop="workLevel"> - <el-select v-model="form.workLevel"> - <el-option - v-for="item in workLevelList" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业内容" prop="workContent"> - <el-input - v-model="form.workContent" - autosize - type="textarea" - placeholder="请输入作业内容" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业地址" prop="workLocation"> - <el-input - v-model="form.workLocation" - autosize - type="textarea" - placeholder="请输入作业地址" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="危害辨识" prop="hazardIdentification"> - <el-input - v-model="form.hazardIdentification" - placeholder="请输入危害辨识" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="关联视频设备" prop="cameraIds"> - <el-select v-model="form.cameraIds" multiple> - <el-option - v-for="item in deviceList" - :key="item.id" - :label="item.name" - :value="item.id" - /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <el-divider border-style="dashed"/> - <el-row> - <el-col :span="12"> - <el-form-item label="吊装工具名称" prop="workDetail.hoistingToolName"> - <el-input - v-model="form.workDetail.hoistingToolName" - autosize - type="textarea" - placeholder="请输入" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="起吊物体质量" prop="workDetail.weightMass"> - <el-input - v-model="form.workDetail.weightMass" - type="number" - placeholder="请输入起吊物体质量(大于等于0)" - > - <template #append>吨(t)</template> - </el-input> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="选择关联物资"> - <el-button type="primary" @click="openMaList">选择物资标准</el-button> - </el-form-item> - </el-col> - </el-row> - </div> - </el-form> - <material-dialog ref="material" @conFirmMaterials="conFirmMaterials"></material-dialog> - <div class="applyBtn"> - <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">发起申请</el-button> - </div> - </div> - </div> -</template> - -<script lang="ts"> -import {toRefs, reactive, defineComponent, ref, defineAsyncComponent} from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage, ElMessageBox } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - interface stateType { - equipmentDialog: boolean, - form: Object, - workLevelList: Array<any> - } - export default defineComponent({ - name: 'hoistForm', - components: { - materialDialog: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/materialDialog.vue')), - }, - props:['workerList','deviceList'], - setup(props: any, context: any) { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - const state = reactive<stateType>({ - equipmentDialog: false, - form: { - operatorUids: [], - workType: 3, - workLevel: null, - workContent: '', - workLocation: '', - maBaseId: null, - hazardIdentification: '', - cameraIds: [], - workDetail:{ - hoistingToolName: '', - weightMass: null - }, - receiveUids: [], - workTimeLine: [], - expStartTime: '', - expEndTime: '' - }, - workLevelList: [ - { - label: "一级吊装作业", - value: 8 - }, - { - label: "二级吊装作业", - value: 9 - }, - { - label: "三级吊装作业", - value: 10 - } - ] - }); - const material = ref() - const ruleFormRef = ref<FormInstance>() - const applyRules = reactive<FormRules>({ - operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workType: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workLevel: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - hazardIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - cameraIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workTimeLine: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.hoistingToolName": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.weightMass": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] - }); - - // const toZero = (value: string | number,index: number,name: string,x:number) =>{ - // if(!value){ - // state.materialList[index][name][x].value = 0 - // } - // } - const openMaList = ()=>{ - if(state.form.workLevel == null || state.form.operatorUids == []){ - ElMessage({ - type: 'warning', - message: '请先选择作业人和作业等级再获取相应物资配置' - }); - }else{ - if(material.value.receiveUids.length==0){ - material.value.receiveUids = state.form.operatorUids - } - material.value.getMaList(state.form.workType,state.form.workLevel) - material.value.workerList = props.workerList - } - } - const conFirmMaterials = (receiveUids: Array<number>,chosenId: number) =>{ - state.form.maBaseId = null - state.form.receiveUids = [] - state.form.receiveUids = receiveUids - state.form.maBaseId = chosenId - } - const submitForm = async (formEl: FormInstance | undefined) => { - if (!formEl) return - await formEl.validate(async (valid, fields) => { - if (valid) { - state.form.expStartTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[0] - state.form.expEndTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[1] - let { workTimeLine, ...data } = JSON.parse(JSON.stringify(state.form)) - data.workDetail.weightMass = Number(data.workDetail.weightMass) - const res = await workApplyApi().postHoistApply(data) - if (res.data.code === '200') { - ElMessage({ - type: 'success', - message: '提交成功!' - }); - formEl.resetFields() - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - material.value.maBaseId = null - material.value.receiveUids = [] - } else { - console.log('error submit!', fields) - } - }) - } - - // 折线图 - const renderMenu = async (value: string) => { - Session.set('projectId',value) - userInfos.value.projectId = value - await initBackEndControlRoutes(); - }; - return { - renderMenu, - Search, - ruleFormRef, - applyRules, - material, - openMaList, - conFirmMaterials, - submitForm, - ...toRefs(state), - }; - }, - }); -</script> - -<style scoped lang="scss"> - .home-container { - height: 100%; - overflow: hidden; - position: relative; - .homeCard{ - width: 100%; - padding: 20px; - box-sizing: border-box; - background: #fff; - border-radius: 4px; - margin-bottom: 20px; - } - .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/specialWorkSystem/workTicket/zysq/components/materialDialog.vue b/src/views/specialWorkSystem/workTicket/zysq/components/materialDialog.vue deleted file mode 100644 index 384515a..0000000 --- a/src/views/specialWorkSystem/workTicket/zysq/components/materialDialog.vue +++ /dev/null @@ -1,293 +0,0 @@ -<template> - <el-dialog v-model="equipmentDialog" title="关联物资标准" width="40%" center @close="closeMaterial"> - <div class="standard" v-for="item in materialList"> - <div>{{ item.name }}</div> - <el-button @click="openList(item)" type="success">选用</el-button> - </div> - - <el-dialog v-model="equipDetailDialog" title="物资标准详情" width="75%" center @open="openDetail"> - <div class="choose-receiver"> - <span>选择其他作业关联人员</span> - <el-select v-model="receiveUids" multiple @change="changeReceiver"> - <el-option - v-for="item in workerList" - :key="item.uid" - :label="item.username" - :value="item.uid" - /> - </el-select> - </div> - <table class="table"> - <tr> - <th class="w-25">物资名称</th> - <th class="w-15">标准值</th> - <th class="w-15">级别</th> - <th class="w-30">关联人员与个数</th> - <th class="w-15">实际使用</th> - </tr> - <tr v-for="(item,index) in materialDetail"> - <td class="w-25">{{item.materialName}}</td> -<!-- <td class="w-1">--> -<!-- <el-select v-model="addList[index].depId" @change="changeDep($event,index)">--> -<!-- <el-option--> -<!-- v-for="i in item.msList"--> -<!-- :key="i.depId"--> -<!-- :label="i.depName"--> -<!-- :value="i.depId"--> -<!-- />--> -<!-- </el-select>--> -<!-- </td>--> -<!-- <td class="w-15">--> -<!-- {{stockCount[index]}}--> -<!-- </td>--> - <td class="w-15">{{item.standVal}}</td> - <td class="w-15">{{item.configurationLevelName}}</td> - <td class="w-30"> - {{item.receiveUnames}} - </td> -<!-- <td class="w-15">--> -<!-- <el-input type="number" v-model.number="addList[index].useCount"/>--> -<!-- </td>--> - <td class="w-15"> - {{item.receiveCount}} - </td> - </tr> - </table> - <template #footer> - <span class="dialog-footer"> - <el-button @click="closeChoose()" size="default">取消</el-button> - <el-button type="primary" @click="submitMaterials" size="default">确认</el-button> - </span> - </template> - </el-dialog> - </el-dialog> -</template> - -<script lang="ts"> -import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; - -interface stateType { - equipmentDialog:boolean - materialList: Array<any> - equipDetailDialog: boolean - materialDetail: Array<any> - stockCount: Array<number> - chosenId: number | null, - receiveUids: Array<number> -} - - -import { reactive, toRefs, ref } from 'vue'; -import { approveBasicApi } from '/@/api/specialWorkSystem/approveBasic'; -import {ElMessage, ElMessageBox} from 'element-plus'; -import {useUserInfo} from "/@/stores/userInfo"; -import {storeToRefs} from "pinia"; - -export default { - name: 'materialDialog', - setup(props: any, context: any) { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - const approveBasicFormRef = ref(); - const state = reactive<stateType>({ - chosenId: null, - equipmentDialog: false, - materialList: [], - equipDetailDialog: false, - materialDetail: [], - stockCount: [], - receiveUids: [] - }); - - // 确认物资标准 - const getMaList = async(type:number,level:number) =>{ - const data = {workType: type,workLevel: level} - const res = await workApplyApi().getMaterial(data) - if (res.data.code === '200') { - if(res.data.data && res.data.data.length>0){ - state.materialList = JSON.parse(JSON.stringify(res.data.data)) - state.equipmentDialog = true - }else{ - ElMessage({ - type: 'warning', - message: '暂时查询不到物资标准信息' - }); - } - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - } - const openList = async(item:object)=>{ - state.chosenId = item.id - const data = {maBaseId: state.chosenId,receiveUids:state.receiveUids} - const res = await workApplyApi().getMaterialDetail(data) - if (res.data.code === '200') { - if(res.data.data && res.data.data.length>0){ - state.materialDetail = res.data.data - state.equipDetailDialog = true - }else{ - ElMessage({ - type: 'warning', - message: '暂时查询不到物资标准信息' - }); - } - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - // state.stockCount = [] - // if(item.mcList && item.mcList.length>0){ - // for(let j in item.mcList){ - // if(item.mcList[j].msList == null || item.mcList[j].msList.length==0){ - // item.mcList.splice(j,1) - // } - // } - // state.materialDetail = item.mcList - // for(let i in state.materialDetail){ - // state.addList.push( - // { - // materialId: state.materialDetail[i].materialId, - // depId: null, - // depName: '', - // useCount: null - // } - // ) - // for(let x in state.materialDetail[i].msList){ - // if(state.materialDetail[i].msList[x].depId == userInfos.value.depId){ - // state.addList[i].depId = userInfos.value.depId - // state.addList[i].depName = state.materialDetail[i].msList[x].depName - // state.stockCount[i] = state.materialDetail[i].msList.find((e) => e.depId == state.addList[i].depId).stockCount - // } - // } - // } - // } - } - const changeReceiver = async ()=>{ - const data = {maBaseId: state.chosenId,receiveUids:state.receiveUids} - const res = await workApplyApi().getMaterialDetail(data) - if (res.data.code === '200') { - if(res.data.data && res.data.data.length>0){ - state.materialDetail = res.data.data - }else{ - ElMessage({ - type: 'warning', - message: '暂时查询不到物资标准信息' - }); - } - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - } - const openDetail = ()=>{ - } - const submitMaterials = ()=>{ - // if(state.addList.length > 0 && (state.addList.some((e) => e.depId == null && e.useCount != null ) || state.addList.some((e) => e.useCount == null && e.depId != null))){ - // ElMessage({ - // type: 'warning', - // message: '出库部门或实际使用值不可为空' - // }); - // return - // } - // for(let i in state.materialDetail){ - // if(state.materialDetail[i].configurationLevelName == '必选' && state.addList[i].depId != null && state.addList[i].useCount <= 0){ - // ElMessage({ - // type: 'warning', - // message: '必选物资数量不能小于等于0' - // }); - // return - // } - // if((state.stockCount[i] !=null && state.addList[i].useCount !=null) && (state.stockCount[i] < state.addList[i].useCount)){ - // ElMessage({ - // type: 'warning', - // message: '物资配置数量超出库存量,请重新配置' - // }); - // return - // } - // } - // if(state.addList.length > 0){ - // for(let n in state.addList){ - // if(state.addList[n].depId == null && state.addList[n].useCount == null){ - // state.addList.splice(n,1) - // } - // } - // } - console.log(state.receiveUids,state.chosenId,'666666666') - context.emit('conFirmMaterials',state.receiveUids,state.chosenId) - state.equipDetailDialog = false - state.equipmentDialog = false - } - - const closeMaterial = ()=>{ - - } - const closeChoose = () =>{ - state.equipDetailDialog = false - } - return { - ...toRefs(state), - getMaList, - openList, - changeReceiver, - openDetail, - closeChoose, - closeMaterial, - submitMaterials - }; - } -}; -</script> - -<style lang="scss" scoped> - .standard{ - width: 100%; - display: flex; - margin-bottom: 20px; - align-items: center; - justify-content: space-between; - } - - .table{ - width: 100%; - border-collapse: collapse; - margin-top: 20px; - tr{ - width: 100%; - border: 1px solid #ccc; - th,td{ - padding: 6px 0; - border-left: 1px solid #ccc; - &:first-of-type{ - border-left: none; - } - } - td{ - font-weight: bolder; - } - - .w-15{ - width: 15%; - text-align: center; - } - .w-20{ - width: 20%; - text-align: center; - } - .w-25{ - width: 25%; - text-align: center; - } - .w-30{ - width: 30%; - text-align: center; - } - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/zysq/components/plate.vue b/src/views/specialWorkSystem/workTicket/zysq/components/plate.vue deleted file mode 100644 index 5b57061..0000000 --- a/src/views/specialWorkSystem/workTicket/zysq/components/plate.vue +++ /dev/null @@ -1,635 +0,0 @@ -<template> - <div class="home-container"> - <div style="height: 100%"> - <el-form :model="form" label-width="150px" :rules="applyRules" ref="ruleFormRef"> - <div class="homeCard"> - <el-row> - <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" multiple> - <el-option - v-for="item in workerList" - :key="item.uid" - :label="item.username" - :value="item.uid" - /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业时间" prop="workTimeLine"> - <el-date-picker - v-model="form.workTimeLine" - format="YYYY-MM-DD HH:mm" - value-format="YYYY-MM-DD HH:mm:00" - type="datetimerange" - range-separator="至" - start-placeholder="开始时间" - end-placeholder="结束时间" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业等级" prop="workLevel"> - <el-select v-model="form.workLevel"> - <el-option - v-for="item in workLevelList" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业内容" prop="workContent"> - <el-input - v-model="form.workContent" - autosize - type="textarea" - placeholder="请输入作业内容" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业地址" prop="workLocation"> - <el-input - v-model="form.workLocation" - autosize - type="textarea" - placeholder="请输入作业地址" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="危害辨识" prop="hazardIdentification"> - <el-input - v-model="form.hazardIdentification" - placeholder="请输入危害辨识" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="关联视频设备" prop="cameraIds"> - <el-select v-model="form.cameraIds" multiple> - <el-option - v-for="item in deviceList" - :key="item.id" - :label="item.name" - :value="item.id" - /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <el-divider border-style="dashed"/> - <el-row> - <el-col :span="12"> - <el-form-item label="盲板编号" prop="workDetail.bpCode"> - <el-input - v-model="form.workDetail.bpCode" - autosize - type="textarea" - placeholder="请输入" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="主要介质" prop="workDetail.mainMedia"> - <el-input - v-model="form.workDetail.mainMedia" - autosize - type="textarea" - placeholder="请输入" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="温度" prop="workDetail.temperature"> - <el-input - v-model="form.workDetail.temperature" - type="number" - placeholder="请输入温度(大于等于0)" - > - <template #append>摄氏度(℃)</template> - </el-input> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="压力" prop="workDetail.pressure"> - <el-input - v-model="form.workDetail.pressure" - type="number" - placeholder="请输入压力(大于等于0)" - > - <template #append>千帕(kPa)</template> - </el-input> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="盲板材质" prop="workDetail.bpMaterialQuality"> - <el-input - v-model="form.workDetail.bpMaterialQuality" - autosize - type="textarea" - placeholder="请输入" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="盲板规格" prop="workDetail.bpSpecification"> - <el-input - v-model="form.workDetail.bpSpecification" - autosize - type="textarea" - placeholder="请输入" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="盲板时间" prop="workDetail.installLine"> - <el-date-picker - v-model="form.workDetail.installLine" - format="YYYY-MM-DD HH:mm" - value-format="YYYY-MM-DD HH:mm:00" - type="datetimerange" - range-separator="--" - start-placeholder="装盲板时间" - end-placeholder="拆盲板时间" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="盲板位置" prop="workDetail.bpLocation"> - <el-input - v-model="form.workDetail.bpLocation" - autosize - type="textarea" - placeholder="请输入" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="关联作业" prop="workDetail.otherSpecialWork"> - <el-select v-model="form.workDetail.otherSpecialWork" multiple> - <el-option - v-for="item in otherWorkList" - :key="item.value" - :label="item.label" - :value="item.label" - /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <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" :before-remove="beforeRemove" :before-upload="getUploadUrl"> - <el-icon><Plus /></el-icon> - <template #tip> - <div class="el-upload__tip">上传jpg/png图片尺寸小于500KB,最多可上传3张</div> - </template> - </el-upload> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="选择关联物资"> - <el-button type="primary" @click="openMaList">选择物资标准</el-button> - </el-form-item> - </el-col> - </el-row> - </div> - </el-form> - <material-dialog ref="material" @conFirmMaterials="conFirmMaterials"></material-dialog> - <div class="applyBtn"> - <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">发起申请</el-button> - </div> - </div> - <el-dialog v-model="dialogVisible"> - <img w-full :src="dialogImageUrl" alt="Preview Image" /> - </el-dialog> - </div> -</template> - -<script lang="ts"> -import {toRefs, reactive, defineComponent, ref, defineAsyncComponent} from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage, ElMessageBox } from 'element-plus' - import type { FormInstance, FormRules, UploadProps, UploadUserFile } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - import axios from 'axios'; - - interface stateType { - form: Object, - csDepList: Array<any>, - otherWorkList: Array<any>, - workLevelList: Array<any>, - fileList: Array<file>, - uploadUrl: string, - dialogVisible: Boolean, - dialogImageUrl: string | null, - imgLimit: number, - isOverSize: boolean, - equipmentDialog: boolean - } - interface file { - url: string; - } - export default defineComponent({ - name: 'plateForm', - components: { - materialDialog: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/materialDialog.vue')), - }, - props:['workerList','deviceList'], - setup(props: any, context: any) { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - const state = reactive<stateType>({ - equipmentDialog: false, - form: { - operatorUids: [], - workType: 8, - workLevel: null, - workContent: '', - workLocation: '', - maBaseId: null, - hazardIdentification: '', - cameraIds: [], - workDetail:{ - bpCode: '', - mainMedia: '', - temperature: null, - pressure: null, - bpMaterialQuality: '', - bpSpecification: '', - bpLocation: '', - bpLocationMapPath: [], - installLine: [], - installBpTime: '', - uninstallBpTime: '', - otherSpecialWork: [] - }, - receiveUids: [], - workTimeLine: [], - expStartTime: '', - expEndTime: '' - }, - isOverSize: false, - fileList: [], - imgLimit: 3, - uploadUrl: '', - dialogVisible: false, - dialogImageUrl: null, - workLevelList: [ - { - label: "抽盲板作业", - value: 11 - }, - { - label: "堵盲板作业", - value: 12 - } - ], - csDepList: [ - { - label: "单位一", - value: 1 - }, - { - label: "单位二", - value: 2 - }, - { - label: "单位三", - value: 3 - }, - { - label: "单位四", - value: 4 - }, - { - label: "单位五", - value: 5 - }, - { - label: "单位六", - value: 6 - } - ], - 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 - } - ] - }); - const material = ref() - const ruleFormRef = ref<FormInstance>() - const applyRules = reactive<FormRules>({ - operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workType: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workLevel: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - hazardIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - cameraIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workTimeLine: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.bpCode": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.mainMedia": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.temperature": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.pressure": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.bpMaterialQuality": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.bpSpecification": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.installLine": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.bpLocation": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.bpLocationMapPath": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] - }); - - // const toZero = (value: string | number,index: number,name: string,x:number) =>{ - // if(!value){ - // state.materialList[index][name][x].value = 0 - // } - // } - const openMaList = ()=>{ - if(state.form.workLevel == null || state.form.operatorUids == []){ - ElMessage({ - type: 'warning', - message: '请先选择作业人和作业等级再获取相应物资配置' - }); - }else{ - if(material.value.receiveUids.length==0){ - material.value.receiveUids = state.form.operatorUids - } - material.value.getMaList(state.form.workType,state.form.workLevel) - material.value.workerList = props.workerList - } - } - const conFirmMaterials = (receiveUids: Array<number>,chosenId: number) =>{ - state.form.maBaseId = null - state.form.receiveUids = [] - state.form.receiveUids = receiveUids - state.form.maBaseId = chosenId - } - const submitForm = async (formEl: FormInstance | undefined) => { - if (!formEl) return - await formEl.validate(async (valid, fields) => { - if (valid) { - state.form.expStartTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[0] - state.form.expEndTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[1] - state.form.workDetail.installBpTime = JSON.parse(JSON.stringify(state.form.workDetail.installLine))[0] - state.form.workDetail.uninstallBpTime = JSON.parse(JSON.stringify(state.form.workDetail.installLine))[1] - let { workTimeLine, ...data } = JSON.parse(JSON.stringify(state.form)) - let { installLine, ...data2 } = JSON.parse(JSON.stringify(state.form.workDetail)) - data.workDetail = data2 - data.workDetail.otherSpecialWork = data.workDetail.otherSpecialWork.join(',') - data.workDetail.bpLocationMapPath = data.workDetail.bpLocationMapPath.join(',') - data.workDetail.temperature = Number(data.workDetail.temperature) - data.workDetail.pressure = Number(data.workDetail.pressure) - const res = await workApplyApi().postPlateApply(data) - if (res.data.code === '200') { - ElMessage({ - type: 'success', - message: '提交成功!' - }); - formEl.resetFields() - state.form.workDetail.bpLocationMapPath = [] - state.fileList = [] - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - material.value.maBaseId = null - material.value.receiveUids = [] - } else { - console.log('error submit!', fields) - } - }) - } - 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 < 500 ? '1' : '0' - if(fileSize === '0'){ - ElMessage({ - type: 'warning', - message: '文件大小不能超过500k。' - }); - state.isOverSize = true - return false - }else{ - const res = await workApplyApi().getUploadUrl(rawFile.name); - state.form.workDetail.bpLocationMapPath.push(res.data.data.fileName) - state.uploadUrl = res.data.data.uploadUrl; - console.log(res.data.data.fileName,'name') - } - }; - - const upload = async (params: any) => { - // const formData = new FormData(); - // formData.append('file', state.fileList[0].raw); - 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.form.workDetail.bpLocationMapPath,'bpLocationMapPath') - }); - }; - }; - - const beforeRemove = (file: {}, fileList: []) => { - const result = new Promise((resolve, reject) => { - if(!state.isOverSize){ - 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]) - } - }) - // 请求删除接口 - }) - .catch(() => { - reject(false); - }); - }else{ - 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(true,list[index]) - } - }) - state.isOverSize = false - } - }); - return result; - }; - - - // 删除图片接口 - const deletePic = async(isOverSize:boolean,fileName:string)=>{ - console.log(fileName,'fileName') - const res = await workApplyApi().deleteFile({fileName: fileName}) - if (res.data.code === '200') { - ElMessage({ - type: isOverSize ? 'error' : 'success', - message: isOverSize ? '上传失败':'删除成功!' - }); - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - } - const showTip =()=>{ - ElMessage({ - type: 'warning', - message: '超出文件上传数量' - }); - } - - // 折线图 - const renderMenu = async (value: string) => { - Session.set('projectId',value) - userInfos.value.projectId = value - await initBackEndControlRoutes(); - }; - return { - renderMenu, - Search, - ruleFormRef, - applyRules, - material, - openMaList, - conFirmMaterials, - handlePreview, - getUploadUrl, - beforeRemove, - upload, - showTip, - submitForm, - handlePictureCardPreview, - ...toRefs(state), - }; - }, - }); -</script> - -<style scoped lang="scss"> - .home-container { - height: 100%; - overflow: hidden; - position: relative; - .homeCard{ - width: 100%; - padding: 20px; - box-sizing: border-box; - background: #fff; - border-radius: 4px; - margin-bottom: 20px; - } - .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/specialWorkSystem/workTicket/zysq/components/power.vue b/src/views/specialWorkSystem/workTicket/zysq/components/power.vue deleted file mode 100644 index 5c2c575..0000000 --- a/src/views/specialWorkSystem/workTicket/zysq/components/power.vue +++ /dev/null @@ -1,308 +0,0 @@ -<template> - <div class="home-container"> - <div style="height: 100%"> - <el-form :model="form" label-width="150px" :rules="applyRules" ref="ruleFormRef"> - <div class="homeCard"> - <el-row> - <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" multiple> - <el-option - v-for="item in workerList" - :key="item.uid" - :label="item.username" - :value="item.uid" - /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业时间" prop="workTimeLine"> - <el-date-picker - v-model="form.workTimeLine" - format="YYYY-MM-DD HH:mm" - value-format="YYYY-MM-DD HH:mm:00" - type="datetimerange" - range-separator="至" - start-placeholder="开始时间" - end-placeholder="结束时间" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业内容" prop="workContent"> - <el-input - v-model="form.workContent" - autosize - type="textarea" - placeholder="请输入作业内容" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业地址" prop="workLocation"> - <el-input - v-model="form.workLocation" - autosize - type="textarea" - placeholder="请输入作业地址" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="危害辨识" prop="hazardIdentification"> - <el-input - v-model="form.hazardIdentification" - placeholder="请输入危害辨识" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="关联视频设备" prop="cameraIds"> - <el-select v-model="form.cameraIds" multiple> - <el-option - v-for="item in deviceList" - :key="item.id" - :label="item.name" - :value="item.id" - /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <el-divider border-style="dashed"/> - <el-row> - <el-col :span="12"> - <el-form-item label="电源接入点" prop="workDetail.powerAccessPoint"> - <el-input - v-model="form.workDetail.powerAccessPoint" - autosize - type="textarea" - placeholder="请输入" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="工作电压" prop="workDetail.workingVoltage"> - <el-input - v-model="form.workDetail.workingVoltage" - type="number" - placeholder="请输入工作电压(大于等于0)" - > - <template #append>伏特(v)</template> - </el-input> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="用电设备及功率" prop="workDetail.equipmentAndPower"> - <el-input - v-model="form.workDetail.equipmentAndPower" - autosize - type="textarea" - placeholder="请输入" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="选择关联物资"> - <el-button type="primary" @click="openMaList">选择物资标准</el-button> - </el-form-item> - </el-col> - </el-row> - </div> - </el-form> - <material-dialog ref="material" @conFirmMaterials="conFirmMaterials"></material-dialog> - <div class="applyBtn"> - <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">发起申请</el-button> - </div> - </div> - </div> -</template> - -<script lang="ts"> -import {toRefs, reactive, defineComponent, ref, defineAsyncComponent} from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage, ElMessageBox } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - interface stateType { - form: Object, - equipmentDialog: boolean - } - export default defineComponent({ - name: 'powerForm', - components: { - materialDialog: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/materialDialog.vue')), - }, - props:['workerList','deviceList'], - setup(props: any, context: any) { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - const state = reactive<stateType>({ - equipmentDialog: false, - form: { - operatorUids: [], - workType: 7, - workLevel: 0, - workContent: '', - workLocation: '', - maBaseId: null, - hazardIdentification: '', - cameraIds: [], - workDetail:{ - powerAccessPoint: '', - workingVoltage: null, - equipmentAndPower: '' - }, - receiveUids: [], - workTimeLine: [], - expStartTime: '', - expEndTime: '' - } - }); - const material = ref() - const ruleFormRef = ref<FormInstance>() - const applyRules = reactive<FormRules>({ - operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workType: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - hazardIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - cameraIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workTimeLine: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.powerAccessPoint": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.workingVoltage": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.equipmentAndPower": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] - }); - - // const toZero = (value: string | number,index: number,name: string,x:number) =>{ - // if(!value){ - // state.materialList[index][name][x].value = 0 - // } - // } - - const openMaList = ()=>{ - if(state.form.operatorUids == []){ - ElMessage({ - type: 'warning', - message: '请先选择作业人再获取相应物资配置' - }); - }else{ - if(material.value.receiveUids.length==0){ - material.value.receiveUids = state.form.operatorUids - } - material.value.getMaList(state.form.workType,state.form.workLevel) - material.value.workerList = props.workerList - } - } - const conFirmMaterials = (receiveUids: Array<number>,chosenId: number) =>{ - state.form.maBaseId = null - state.form.receiveUids = [] - state.form.receiveUids = receiveUids - state.form.maBaseId = chosenId - } - - const submitForm = async (formEl: FormInstance | undefined) => { - if (!formEl) return - await formEl.validate(async (valid, fields) => { - if (valid) { - state.form.expStartTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[0] - state.form.expEndTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[1] - let { workTimeLine, ...data } = JSON.parse(JSON.stringify(state.form)) - // data.workDetail.weightMass = Number(data.workDetail.weightMass) - const res = await workApplyApi().postPowerApply(data) - if (res.data.code === '200') { - ElMessage({ - type: 'success', - message: '提交成功!' - }); - formEl.resetFields() - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - material.value.maBaseId = null - material.value.receiveUids = [] - } else { - console.log('error submit!', fields) - } - }) - } - - // 折线图 - const renderMenu = async (value: string) => { - Session.set('projectId',value) - userInfos.value.projectId = value - await initBackEndControlRoutes(); - }; - return { - renderMenu, - Search, - ruleFormRef, - applyRules, - material, - openMaList, - conFirmMaterials, - submitForm, - ...toRefs(state), - }; - }, - }); -</script> - -<style scoped lang="scss"> - .home-container { - height: 100%; - overflow: hidden; - position: relative; - .homeCard{ - width: 100%; - padding: 20px; - box-sizing: border-box; - background: #fff; - border-radius: 4px; - margin-bottom: 20px; - } - .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/specialWorkSystem/workTicket/zysq/components/space.vue b/src/views/specialWorkSystem/workTicket/zysq/components/space.vue deleted file mode 100644 index ed158e2..0000000 --- a/src/views/specialWorkSystem/workTicket/zysq/components/space.vue +++ /dev/null @@ -1,393 +0,0 @@ -<template> - <div class="home-container"> - <div style="height: 100%"> - <el-form :model="form" label-width="150px" :rules="applyRules" ref="ruleFormRef"> - <div class="homeCard"> - <el-row> - <el-col :span="12"> - <el-form-item label="作业人" prop="operatorUids"> - <el-select v-model="form.operatorUids" multiple> - <el-option - v-for="item in workerList" - :key="item.uid" - :label="item.username" - :value="item.uid" - /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业时间" prop="workTimeLine"> - <el-date-picker - v-model="form.workTimeLine" - format="YYYY-MM-DD HH:mm" - value-format="YYYY-MM-DD HH:mm:00" - type="datetimerange" - range-separator="至" - start-placeholder="开始时间" - end-placeholder="结束时间" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="作业内容" prop="workContent"> - <el-input - v-model="form.workContent" - autosize - type="textarea" - placeholder="请输入作业内容" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="作业地址" prop="workLocation"> - <el-input - v-model="form.workLocation" - autosize - type="textarea" - placeholder="请输入作业地址" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="危害辨识" prop="hazardIdentification"> - <el-input - v-model="form.hazardIdentification" - placeholder="请输入危害辨识" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="关联视频设备" prop="cameraIds"> - <el-select v-model="form.cameraIds" multiple> - <el-option - v-for="item in deviceList" - :key="item.id" - :label="item.name" - :value="item.id" - /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <el-divider border-style="dashed" /> - <el-row> - <el-col :span="12"> - <el-form-item label="受限空间所属单位" prop="workDetail.csDepId"> -<!-- <el-select v-model="form.workDetail.csDepId">--> -<!-- <el-option--> -<!-- v-for="item in csDepList"--> -<!-- :key="item.value"--> -<!-- :label="item.label"--> -<!-- :value="item.value"--> -<!-- />--> -<!-- </el-select>--> - <el-cascader v-model="form.workDetail.csDepId" :options="departList" :props="casProps" :show-all-levels="false" @change="handleChange" /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="受限空间名称" prop="workDetail.csName"> - <el-input - v-model="form.workDetail.csName" - autosize - type="textarea" - placeholder="请输入" - /> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="空间内原有介质" prop="workDetail.csOriginalName"> - <el-input - v-model="form.workDetail.csOriginalName" - autosize - type="textarea" - placeholder="请输入" - /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="关联作业" prop="workDetail.otherSpecialWork"> - <el-select v-model="form.workDetail.otherSpecialWork" multiple> - <el-option v-for="item in otherWorkList" :key="item.value" :label="item.label" :value="item.label" /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <el-row> - <el-col :span="12"> - <el-form-item label="选择关联物资"> - <el-button type="primary" @click="openMaList">选择物资标准</el-button> - </el-form-item> - </el-col> - </el-row> - </div> - </el-form> - <material-dialog ref="material" @conFirmMaterials="conFirmMaterials"></material-dialog> - <div class="applyBtn"> - <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">发起申请</el-button> - </div> - </div> - </div> -</template> - -<script lang="ts"> -import {toRefs, reactive, defineComponent, ref, defineAsyncComponent} from 'vue'; - import { storeToRefs } from 'pinia'; - import { initBackEndControlRoutes } from '/@/router/backEnd'; - import {useUserInfo} from "/@/stores/userInfo"; - import { Session } from '/@/utils/storage'; - import { Search } from '@element-plus/icons-vue' - import { ElMessage, ElMessageBox } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - - interface stateType { - form: Object, - csDepList: Array<any>, - otherWorkList: Array<any>, - casProps: {}, - equipmentDialog: boolean - } - export default defineComponent({ - name: 'spaceForm', - components: { - materialDialog: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/materialDialog.vue')), - }, - props:['workerList','departList','deviceList'], - setup(props: any, context: any) { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - const state = reactive<stateType>({ - equipmentDialog: false, - form: { - operatorUids: [], - workType: 2, - workLevel: 0, - workContent: '', - workLocation: '', - maBaseId: null, - hazardIdentification: '', - cameraIds: [], - workDetail:{ - csDepId: null, - csName: '', - csOriginalName: '', - otherSpecialWork: [] - }, - receiveUids: [], - workTimeLine: [], - expStartTime: '', - expEndTime: '' - }, - csDepList: [ - { - label: "单位一", - value: 1 - }, - { - label: "单位二", - value: 2 - }, - { - label: "单位三", - value: 3 - }, - { - label: "单位四", - value: 4 - }, - { - label: "单位五", - value: 5 - }, - { - label: "单位六", - value: 6 - } - ], - casProps: { - emitPath: false, - value: 'depId', - label: 'depName', - multiple: false, - expandTrigger: 'hover', - checkStrictly: true - }, - 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 - } - ] - }); - const material = ref() - const ruleFormRef = ref<FormInstance>() - const applyRules = reactive<FormRules>({ - operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workType: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - hazardIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - cameraIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workTimeLine: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.csDepId": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.csName": [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.csOriginalName": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] - }); - - // const toZero = (value: string | number,index: number,name: string,x:number) =>{ - // if(!value){ - // state.materialList[index][name][x].value = 0 - // } - // } - - const openMaList = ()=>{ - if(state.form.operatorUids == []){ - ElMessage({ - type: 'warning', - message: '请先选择作业人再获取相应物资配置' - }); - }else{ - if(material.value.receiveUids.length==0){ - material.value.receiveUids = state.form.operatorUids - } - material.value.getMaList(state.form.workType,state.form.workLevel) - material.value.workerList = props.workerList - } - } - const conFirmMaterials = (receiveUids: Array<number>,chosenId: number) =>{ - state.form.maBaseId = null - state.form.receiveUids = [] - state.form.receiveUids = receiveUids - state.form.maBaseId = chosenId - } - - const submitForm = async (formEl: FormInstance | undefined) => { - if (!formEl) return - await formEl.validate(async (valid, fields) => { - if (valid) { - state.form.expStartTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[0] - state.form.expEndTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[1] - let { workTimeLine, ...data } = JSON.parse(JSON.stringify(state.form)) - data.workDetail.otherSpecialWork = data.workDetail.otherSpecialWork.join(',') - console.log(data,'data') - const res = await workApplyApi().postSpaceApply(data) - if (res.data.code === '200') { - ElMessage({ - type: 'success', - message: '提交成功!' - }); - formEl.resetFields() - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - material.value.maBaseId = null - material.value.receiveUids = [] - } else { - console.log('error submit!', fields) - } - }) - } - - - // 折线图 - const renderMenu = async (value: string) => { - Session.set('projectId',value) - userInfos.value.projectId = value - await initBackEndControlRoutes(); - }; - return { - renderMenu, - Search, - ruleFormRef, - applyRules, - material, - openMaList, - conFirmMaterials, - submitForm, - ...toRefs(state), - }; - }, - }); -</script> - -<style scoped lang="scss"> - .home-container { - height: 100%; - overflow: hidden; - position: relative; - .homeCard{ - width: 100%; - padding: 20px; - box-sizing: border-box; - background: #fff; - border-radius: 4px; - margin-bottom: 20px; - } - .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%; - } - :deep(.el-cascader){ - width: 100% !important; - } - } -</style> diff --git a/src/views/specialWorkSystem/workTicket/zysq/index.vue b/src/views/specialWorkSystem/workTicket/zysq/index.vue deleted file mode 100644 index 3584dfc..0000000 --- a/src/views/specialWorkSystem/workTicket/zysq/index.vue +++ /dev/null @@ -1,193 +0,0 @@ -<template> - <div class="home-container"> - <el-tabs type="border-card" @tab-change="switchTab"> - <el-tab-pane label="动火作业"> - <fire-form ref="fire" :workerList = allWorkers :deviceList = allDevices></fire-form> - </el-tab-pane> - <el-tab-pane label="受限空间作业"> - <space-form ref="space" :workerList = allWorkers :departList = departmentList :deviceList = allDevices></space-form> - </el-tab-pane> - <el-tab-pane label="吊装作业"> - <hoist-form ref="hoist" :workerList = allWorkers :deviceList = allDevices></hoist-form> - </el-tab-pane> - <el-tab-pane label="动土作业"> - <ground-form ref="ground" :workerList = allWorkers :departList = departmentList :deviceList = allDevices></ground-form> - </el-tab-pane> - <el-tab-pane label="断路作业"> - <broken-form ref="broken" :workerList = allWorkers :departList = departmentList :deviceList = allDevices></broken-form> - </el-tab-pane> - <el-tab-pane label="高处作业"> - <height-form ref="height" :workerList = allWorkers :departList = departmentList :deviceList = allDevices></height-form> - </el-tab-pane> - <el-tab-pane label="临时用电作业"> - <power-form ref="power" :workerList = allWorkers :deviceList = allDevices></power-form> - </el-tab-pane> - <el-tab-pane label="盲板抽堵作业"> - <plate-form ref="plate" :workerList = allWorkers :deviceList = allDevices></plate-form> - </el-tab-pane> - </el-tabs> - <material-dialog ref="material"></material-dialog> - </div> -</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 } from '@element-plus/icons-vue' - import { ElMessage } from 'element-plus' - import type { FormInstance, FormRules } from 'element-plus' - import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; - import {teamManageApi} from "/@/api/systemManage/basicDateManage/personShiftManage/teamManage"; - - interface stateType { - allWorkers: Array<any> - departmentList: Array<any> - allDevices: Array<any> - } - export default defineComponent({ - name: 'apply', - components: { - fireForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/fire.vue')), - spaceForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/space.vue')), - hoistForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/hoist.vue')), - groundForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/ground.vue')), - brokenForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/broken.vue')), - heightForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/height.vue')), - powerForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/power.vue')), - plateForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/plate.vue')), - materialDialog: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/materialDialog.vue')) - }, - setup() { - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); - const state = reactive<stateType>({ - allWorkers: [], - departmentList: [], - allDevices: [] - }); - const fire = ref() - const space = ref() - const hoist = ref() - const ground = ref() - const broken = ref() - const height = ref() - const power = ref() - const plate = ref() - const material = ref() - // 获取用户列表 - const getAll = async ()=>{ - const res = await workApplyApi().getAllUsers() - if (res.data.code === '200') { - state.allWorkers = JSON.parse(JSON.stringify(res.data.data)) - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - // 获取部门列表 - const getAllDepartment = async () => { - let res = await teamManageApi().getAllDepartment(); - if (res.data.code === '200') { - state.departmentList = JSON.parse(JSON.stringify(res.data.data)) - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - // 获取设备列表 - const getAllDevice = async ()=>{ - const res = await workApplyApi().getAllDevices() - if (res.data.code === '200') { - state.allDevices = JSON.parse(JSON.stringify(res.data.data)) - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; - - const switchTab = (name)=>{ - console.log(name,'name') - fire.value.form.resetFields() - material.value.maBaseId = null - material.value.receiveUids = [] - } - - - // 页面载入时执行方法 - onMounted(() => { - getAll(); - getAllDepartment(); - getAllDevice() - }); - - return { - ...toRefs(state), - fire, - space, - broken, - ground, - height, - hoist, - plate, - power, - material, - switchTab - }; - }, - }); -</script> - -<style scoped lang="scss"> - .home-container { - height: 100%; - overflow: hidden; - position: relative; - .homeCard{ - width: 100%; - padding: 20px; - box-sizing: border-box; - background: #fff; - border-radius: 4px; - margin-bottom: 20px; - } - .applyBtn{ - width: 100%; - background: #fff; - height: 80px; - 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/menu/index.vue b/src/views/system/menu/index.vue index c4a0e9b..1beb8fb 100644 --- a/src/views/system/menu/index.vue +++ b/src/views/system/menu/index.vue @@ -97,6 +97,7 @@ { id: '4', name: '智能安全巡检系统', key: 3 }, { id: '5', name: '智能安全风险综合预警预报平台', key: 4 }, { id: '6', name: '应急管理系统', key: 5 }, + { id: '12', name: '监管数据融合互通系统', key: 11 }, { id: '7', name: '安全目标责任管理系统', key: 6 }, { id: '8', name: '安全事故管理系统', key: 7 }, { id: '9', name: '设备综合管控系统', key: 8 }, diff --git a/src/views/system/personShiftManage/scheduleManage/schedule/index.vue b/src/views/system/personShiftManage/scheduleManage/schedule/index.vue index 1c49a53..5a1dec0 100644 --- a/src/views/system/personShiftManage/scheduleManage/schedule/index.vue +++ b/src/views/system/personShiftManage/scheduleManage/schedule/index.vue @@ -160,7 +160,6 @@ departmentList: [], workerList: [], casProps: { - expandTrigger: 'hover', emitPath: false, value: 'depId', label: 'depName' diff --git a/src/views/system/role/component/roleDialog.vue b/src/views/system/role/component/roleDialog.vue index 9bdaac2..253814a 100644 --- a/src/views/system/role/component/roleDialog.vue +++ b/src/views/system/role/component/roleDialog.vue @@ -46,9 +46,11 @@ buttonName: string; isShowRoleDialog: boolean; roleForm: { + defaultFlag: number | null roleName: string; roleCode: string; roleInfo: string; + specialWorkFlag: number | null }; menuData: Array<MenuDataTree>; menuProps: { @@ -65,9 +67,11 @@ title: '', buttonName: '', roleForm: { + defaultFlag: 0, roleName: '', // 角色名称 roleCode: '', // 角色标识 - roleInfo: '' // 排序 + roleInfo: '', // 排序 + specialWorkFlag: 0 }, menuData: [], menuProps: { @@ -82,14 +86,22 @@ state.title = '新增角色'; state.buttonName = '新增'; state.roleForm = { + defaultFlag: 0, roleName: '', roleCode: '', - roleInfo: '' + roleInfo: '', + specialWorkFlag: 0 }; } else { state.title = '修改角色'; state.buttonName = '修改'; state.roleForm = JSON.parse(JSON.stringify(value)); + if(!state.roleForm.defaultFlag){ + state.roleForm.defaultFlag = 0 + } + if(!state.roleForm.specialWorkFlag){ + state.roleForm.specialWorkFlag = 0 + } } }; // 新增 diff --git a/src/views/system/user/component/userDialog.vue b/src/views/system/user/component/userDialog.vue index 3808e30..1570fce 100644 --- a/src/views/system/user/component/userDialog.vue +++ b/src/views/system/user/component/userDialog.vue @@ -93,7 +93,7 @@ import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue'; import { ElMessageBox, ElMessage } from 'element-plus'; import { userApi } from '/@/api/systemManage/user'; -import {verifyPwd} from "/@/utils/toolsValidate"; +import {verifyPhone, verifyPwd} from "/@/utils/toolsValidate"; // 定义接口来定义对象的类型 interface DeptData {} @@ -134,6 +134,16 @@ name: 'user', setup(props, context) { const userRef = ref() + const checkPhone = (rule: any, value: any, callback: any) => { + if (value == '') { + return callback(new Error('该内容不能为空')) + } + setTimeout(() => { + if (!verifyPhone(value)) { + callback(new Error('手机号格式不正确')) + }else callback(); + }, 400) + } let validatePwd = (rule: any, value: any, callback: any)=>{ if(value === ''){ callback(new Error('请输入密码')) @@ -170,7 +180,7 @@ roleIds: [{ required: true, message: '请选择用户角色', trigger: 'change' }], depId: [{ required: true, message: '请选择部门', trigger: 'change' }], positionIds: [{ required: true, message: '请选择职务', trigger: 'change' }], - phone: [{ required: true, message: '请填写手机号', trigger: 'blur' }], + phone: [{ required: true, validator: checkPhone, trigger: 'blur' }], type: [{ required: true, message: '请填写用户类型', trigger: 'blur' }], gender: [{ required: true, message: '请选择性别', trigger: 'change' }], password: [{ required: true, validator: validatePwd, trigger: 'blur' }], diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue index 9f0672f..5aca7e7 100644 --- a/src/views/system/user/index.vue +++ b/src/views/system/user/index.vue @@ -60,6 +60,7 @@ <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="onPwdDialog(scope.row.uid)">修改密码</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> @@ -72,6 +73,26 @@ </el-card> <userDialog ref="userRef" @getUserList="initUserTableData" /> <dialog-certificate ref="ctfRef" @getUserList="initUserTableData"></dialog-certificate> + <el-dialog title="修改密码" v-model="showPwdDialog" width="500px"> + <el-form :model="pwdForm" size="default" ref="pwdRef" :rules="pwdFormRules" label-width="110px"> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="新密码" prop="newPassword"> + <el-input v-model.trim="pwdForm.newPassword" placeholder="请输入" type="password" show-password> + </el-input> + </el-form-item> + <el-form-item label="确认新密码" prop="rePassword"> + <el-input v-model.trim="pwdForm.rePassword" placeholder="请输入" type="password" show-password> + </el-input> + </el-form-item> + </el-col> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="showPwdDialog = !showPwdDialog" size="default">取 消</el-button> + <el-button type="primary" v-throttle @click="onPwdSubmit" size="default">确 定</el-button> + </span> + </template> + </el-dialog> </div> </template> @@ -84,6 +105,10 @@ import { dutyApi } from '/@/api/systemManage/duty'; import { departmentApi } from '/@/api/systemManage/department'; import { useRoleApi } from '/@/api/systemManage/role'; +import {verifyPwd} from "/@/utils/toolsValidate"; +import {useLoginApi} from "/@/api/login"; +import {Session} from "/@/utils/storage"; +import Cookies from "js-cookie"; // 定义接口来定义对象的类型 interface TableDataRow { @@ -121,6 +146,13 @@ dutyList: []; userTypeList: Array<{id:number,name:string}>; props:{} + showPwdDialog: boolean + pwdForm: { + uid: number|string| null + newPassword: string + rePassword: string + } + pwdFormRules: {} } export default defineComponent({ @@ -128,7 +160,28 @@ components: { userDialog,dialogCertificate }, setup() { const userRef = ref(); + const pwdRef = ref(); const ctfRef = ref() + let validatePwd = (rule: any, value: any, callback: any)=>{ + if(value === ''){ + callback(new Error('请输入密码')) + }else{ + if(!verifyPwd(value)){ + callback(new Error('密码须包含字母、数字、特殊字符,长度在6-16之间')) + }else{ + callback() + } + } + } + const equalToPassword = (rule: any, value: any, callback: any) => { + if(value == ''){ + callback(new Error("请再次确认密码")) + }else if (state.pwdForm.newPassword !== value) { + callback(new Error("两次输入的密码不一致")) + } else { + callback(); + } + }; const state = reactive<TableDataState>({ userTableData: { data: [], @@ -157,7 +210,17 @@ { id: 1, name: '超级管理员' }, { id: 2, name: '管理员' }, { id: 3, name: '普通员工' } - ] + ], + showPwdDialog: false, + pwdForm: { + uid: null, + newPassword: '', + rePassword: '' + }, + pwdFormRules: { + newPassword: [{ required: true, validator: validatePwd, trigger: 'blur' }], + rePassword: [{ required: true, validator: equalToPassword, trigger: "blur" }] + } }); // 初始化表格数据 const initUserTableData = async () => { @@ -218,6 +281,57 @@ userRef.value.openDialog(type, value, state.departmentList, state.roleList, state.dutyList); }; + const onPwdDialog = (uid: string)=>{ + state.pwdForm = { + uid: uid, + newPassword: '', + rePassword: '' + } + state.showPwdDialog = true + } + + const onPwdSubmit = async () => { + pwdRef.value.validate(async (valid:Boolean) => { + if(valid){ + const {rePassword,...data} = state.pwdForm + let res = await userApi().pwdMod(data); + if (res.data.code === '200') { + state.showPwdDialog = false; + if(state.pwdForm.uid == Cookies.get('uid')){ + ElMessage({ + type: 'success', + message: '密码修改成功,请重新登录', + duration: 2000 + }) + setTimeout(()=>{ + useLoginApi() + .signOut() + .then(() => { + Session.clear() + window.location.href = '/' + }) + },2000) + }else{ + ElMessage({ + type: 'success', + message: '修改密码成功', + duration: 2000 + }) + } + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }else{ + ElMessage({ + type:'warning', + message:'请完善信息' + }) + } + }) + } const onCertificate = (value: any)=>{ ctfRef.value.openDialog(value); } @@ -267,6 +381,9 @@ return { userRef, ctfRef, + pwdRef, + onPwdDialog, + onPwdSubmit, onOpenUserDialog, onCertificate, onRowDel, -- Gitblit v1.9.2