From bb7db62b1663c3b30830e1604731c2197f46af75 Mon Sep 17 00:00:00 2001 From: Your Name <123456> Date: 星期三, 30 十一月 2022 09:18:23 +0800 Subject: [PATCH] 物资 --- src/views/facilityManagement/safetyGoodsAndEquipment/index.vue | 326 +++++++ src/api/facilityManagement/safetyGoodsAndEquipment/index.ts | 82 + src/utils/toolsValidate.ts | 20 src/views/facilityManagement/safetyGoodsAndEquipment/components/safetyGoodsAndEquipmentDialog.vue | 221 ++++ src/views/facilityManagement/safetyGoodsAndEquipment/components/addGoodsDialog.vue | 267 +++++ src/views/facilityManagement/safetyGoodsAndEquipment/index.ts | 126 ++ src/views/facilityManagement/goodsDetailManage/index.vue | 444 +++++++++ src/views/facilityManagement/goodsDetailManage/index.ts | 101 ++ static/loginPage.js/login.js | 48 .env.development | 3 /dev/null | 4 src/stores/userInfo.ts | 2 src/views/facilityManagement/goodsDetailManage/components/checkOut.vue | 133 ++ src/views/facilityManagement/safetyGoodsAndEquipment/components/batchInStorage.vue | 144 +++ src/api/facilityManagement/goodsDetailManage/index.ts | 89 + src/stores/interface/index.ts | 1 src/views/facilityManagement/goodsDetailManage/components/goodsDetailAdd.vue | 273 ++++++ src/views/facilityManagement/goodsDetailManage/components/goodsDetailEdit.vue | 224 ++++ src/views/facilityManagement/safetyGoodsAndEquipment/components/batchOutStorage.vue | 154 +++ 19 files changed, 2,634 insertions(+), 28 deletions(-) diff --git a/.env.development b/.env.development index fc8df0c..2ef70b0 100644 --- a/.env.development +++ b/.env.development @@ -29,6 +29,9 @@ #本地外包预发接口地址 +VITE_API_URL_OUT = 'http://192.168.0.50:8009' +#张凤外包接口地址 + #VITE_API_URL_OUT = 'http://192.168.0.52:7021/safeplatform-out' diff --git "a/.idea/shelf/Uncommitted_changes_before_Update_at_2022_10_13_14_41_\133Default_Changelist\135/shelved.patch" "b/.idea/shelf/Uncommitted_changes_before_Update_at_2022_10_13_14_41_\133Default_Changelist\135/shelved.patch" deleted file mode 100644 index 57c319d..0000000 --- "a/.idea/shelf/Uncommitted_changes_before_Update_at_2022_10_13_14_41_\133Default_Changelist\135/shelved.patch" +++ /dev/null @@ -1,6817 +0,0 @@ -Index: src/views/specialWorkSystem/workTicket/approve/components/brokenLog.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/approve/components/brokenLog.vue b/src/views/specialWorkSystem/workTicket/approve/components/brokenLog.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/approve/components/brokenLog.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -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> -Index: src/views/specialWorkSystem/workTicket/apply/components/ground.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/apply/components/ground.vue b/src/views/specialWorkSystem/workTicket/apply/components/ground.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/apply/components/ground.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -1,689 +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-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.value" /> -- </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" :on-remove="handleRemove" :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="getMaList">选择物资标准</el-button> -- </el-form-item> -- </el-col> -- </el-row> -- </div> -- </el-form> -- <el-dialog v-model="equipmentDialog" title="关联物资标准" width="40%" center @close="closeMaterial"> -- <el-tabs tab-position="left" class="demo-tabs" type="border-card"> -- <el-tab-pane v-for="(item,index) in materialList" :label="item.materialTypeName" :key="index"> -- <div style="margin-bottom: 20px"> -- <el-form label-width="150px" label-position="top"> -- <div v-if="item.mustList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">必选</div> -- <el-form-item v-if="item.mustList.length>0" class="tab-i" v-for="(i,x) in item.mustList" :key="x" :label="item.mustList[x].materialName + ':'" prop="defaultVal" :rules="[{ type: 'defaultVal', required: true, message: '该内容不能为空', trigger: 'blur'}]"> -- <el-input size="default" type="number" v-model="item.mustList[x].value" @change="(val)=>toZero(val,index,'mustList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.mustList[x].stock}}</template> -- </el-input> -- </el-form-item> -- <div v-if="item.unList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">其他</div> -- <el-form-item v-if="item.unList.length>0" class="tab-i" v-for="(i,x) in item.unList" :key="x" :label="item.unList[x].materialName + ':'"> -- <el-input size="default" type="number" v-model="item.unList[x].value" @change="(val)=>toZero(val,index,'unList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.unList[x].stock}}</template> -- </el-input> -- </el-form-item> -- </el-form> -- </div> -- </el-tab-pane> -- </el-tabs> -- <template #footer> -- <span class="dialog-footer"> -- <el-button @click="equipmentDialog = false" size="default">取消</el-button> -- <el-button type="primary" @click="conFirmDevices" size="default">确认</el-button> -- </span> -- </template> -- </el-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, -- materialList: Array<any> -- } -- interface file { -- url: string; -- } -- export default { -- name: 'groundForm', -- components: {}, -- props:['workerList','departList'], -- 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: '', -- workDetail:{ -- operationDepId: null, -- gbScope: '', -- gbMethod: '', -- gbPath: [], -- otherSpecialWork: [] -- }, -- wmAddReqDTOList: [], -- workTimeLine: [], -- expStartTime: '', -- expEndTime: '' -- }, -- isOverSize: false, -- fileList: [], -- materialList: [], -- 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 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' }], -- 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 submitForm = async (formEl: FormInstance | undefined) => { -- if (!formEl) return -- await formEl.validate(async (valid, fields) => { -- if (valid) { -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].postList = [...state.materialList[i].mustList,...state.materialList[i].unList] -- state.form.wmAddReqDTOList = [...state.form.wmAddReqDTOList,...state.materialList[i].postList] -- } -- 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 -- }); -- } -- state.materialList = [] -- } 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 getMaList = async() =>{ -- if(state.materialList.length == 0){ -- const data = {workType: 4,workLevel: null} -- const res = await workApplyApi().getMaterial(data) -- if (res.data.code === '200') { -- if(res.data.data.materialTypeList && res.data.data.materialTypeList!=null&&res.data.data.materialTypeList.length>0){ -- state.materialList = JSON.parse(JSON.stringify(res.data.data.materialTypeList)) -- for(let i in state.materialList){ -- state.materialList[i].mustList = [] -- state.materialList[i].unList = [] -- state.materialList[i].mdList = state.materialList[i].mdList?.map((item:any) => { -- if(item.configurationLevel == 0){ -- state.materialList[i].mustList.push(item) -- return -- }else{ -- state.materialList[i].unList.push(item) -- return -- } -- }) -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- } -- state.equipmentDialog = true -- }else{ -- ElMessage({ -- type: 'warning', -- message: '暂时查询不到物资标准信息' -- }); -- } -- } else { -- ElMessage({ -- type: 'warning', -- message: res.data.msg -- }); -- } -- }else{ -- state.materialList = state.materialList -- state.equipmentDialog = true -- } -- } -- const conFirmDevices = ()=>{ -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- -- } -- ElMessageBox.confirm('是否确认物资及数量配置?') -- .then(() => { -- state.equipmentDialog = false -- }) -- .catch(() => { -- // catch error -- }) -- } -- -- const closeMaterial = ()=>{ -- -- } -- // 折线图 -- const renderMenu = async (value: string) => { -- Session.set('projectId',value) -- userInfos.value.projectId = value -- await initBackEndControlRoutes(); -- }; -- return { -- renderMenu, -- Search, -- Plus, -- ruleFormRef, -- applyRules, -- toZero, -- getMaList, -- conFirmDevices, -- closeMaterial, -- 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> -Index: src/views/specialWorkSystem/workTicket/apply/index.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/apply/index.vue b/src/views/specialWorkSystem/workTicket/apply/index.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/apply/index.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -1,149 +0,0 @@ --<template> -- <div class="home-container"> -- <el-tabs type="border-card"> -- <el-tab-pane label="动火作业"> -- <fire-form :workerList = allWorkers></fire-form> -- </el-tab-pane> -- <el-tab-pane label="受限空间作业"> -- <space-form :workerList = allWorkers :departList = departmentList></space-form> -- </el-tab-pane> -- <el-tab-pane label="吊装作业"> -- <hoist-form :workerList = allWorkers></hoist-form> -- </el-tab-pane> -- <el-tab-pane label="动土作业"> -- <ground-form :workerList = allWorkers :departList = departmentList></ground-form> -- </el-tab-pane> -- <el-tab-pane label="断路作业"> -- <broken-form :workerList = allWorkers :departList = departmentList></broken-form> -- </el-tab-pane> -- <el-tab-pane label="高处作业"> -- <height-form :workerList = allWorkers :departList = departmentList></height-form> -- </el-tab-pane> -- <el-tab-pane label="临时用电作业"> -- <power-form :workerList = allWorkers></power-form> -- </el-tab-pane> -- <el-tab-pane label="盲板抽堵作业"> -- <plate-form :workerList = allWorkers></plate-form> -- </el-tab-pane> -- </el-tabs> -- </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> -- } -- export default defineComponent({ -- name: 'apply', -- components: { -- fireForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/apply/components/fire.vue')), -- spaceForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/apply/components/space.vue')), -- hoistForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/apply/components/hoist.vue')), -- groundForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/apply/components/ground.vue')), -- brokenForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/apply/components/broken.vue')), -- heightForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/apply/components/height.vue')), -- powerForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/apply/components/power.vue')), -- plateForm: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/apply/components/plate.vue')) -- }, -- setup() { -- const userInfo = useUserInfo() -- const { userInfos } = storeToRefs(userInfo); -- const state = reactive<stateType>({ -- allWorkers: [], -- departmentList: [] -- }); -- -- // 获取用户列表 -- 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 -- }); -- } -- }; -- -- // 页面载入时执行方法 -- onMounted(() => { -- getAll(); -- getAllDepartment(); -- }); -- -- return { -- ...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; -- 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> -Index: src/views/specialWorkSystem/workTicket/apply/components/height.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/apply/components/height.vue b/src/views/specialWorkSystem/workTicket/apply/components/height.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/apply/components/height.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -1,547 +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-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="请输入" -- > -- <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.value" -- /> -- </el-select> -- </el-form-item> -- </el-col> -- <el-col :span="12"> -- <el-form-item label="选择关联物资"> -- <el-button type="primary" @click="getMaList">选择物资标准</el-button> -- </el-form-item> -- </el-col> -- </el-row> -- </div> -- </el-form> -- <el-dialog v-model="equipmentDialog" title="关联物资标准" width="40%" center @close="closeMaterial"> -- <el-tabs tab-position="left" class="demo-tabs" type="border-card"> -- <el-tab-pane v-for="(item,index) in materialList" :label="item.materialTypeName" :key="index"> -- <div style="margin-bottom: 20px"> -- <el-form label-width="150px" label-position="top"> -- <div v-if="item.mustList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">必选</div> -- <el-form-item v-if="item.mustList.length>0" class="tab-i" v-for="(i,x) in item.mustList" :key="x" :label="item.mustList[x].materialName + ':'" prop="defaultVal" :rules="[{ type: 'defaultVal', required: true, message: '该内容不能为空', trigger: 'blur'}]"> -- <el-input size="default" type="number" v-model="item.mustList[x].value" @change="(val)=>toZero(val,index,'mustList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.mustList[x].stock}}</template> -- </el-input> -- </el-form-item> -- <div v-if="item.unList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">其他</div> -- <el-form-item v-if="item.unList.length>0" class="tab-i" v-for="(i,x) in item.unList" :key="x" :label="item.unList[x].materialName + ':'"> -- <el-input size="default" type="number" v-model="item.unList[x].value" @change="(val)=>toZero(val,index,'unList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.unList[x].stock}}</template> -- </el-input> -- </el-form-item> -- </el-form> -- </div> -- </el-tab-pane> -- </el-tabs> -- <template #footer> -- <span class="dialog-footer"> -- <el-button @click="equipmentDialog = false" size="default">取消</el-button> -- <el-button type="primary" @click="conFirmDevices" size="default">确认</el-button> -- </span> -- </template> -- </el-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:{}, -- materialList: Array<any> -- } -- export default defineComponent({ -- name: 'heightForm', -- components: {}, -- props:['workerList','departList'], -- setup() { -- const userInfo = useUserInfo() -- const { userInfos } = storeToRefs(userInfo); -- const state = reactive<stateType>({ -- equipmentDialog: false, -- form: { -- operatorUids: [], -- workType: 6, -- workLevel: null, -- workContent: '', -- workLocation: '', -- hazardIdentification: '', -- workDetail:{ -- operationDepId: '', -- operationHeight: null, -- otherSpecialWork: [] -- }, -- wmAddReqDTOList: [], -- workTimeLine: [], -- expStartTime: '', -- expEndTime: '' -- }, -- heDepList: [ -- { -- label: "单位一", -- value: 1 -- }, -- { -- label: "单位二", -- value: 2 -- }, -- { -- label: "单位三", -- value: 3 -- }, -- { -- label: "单位四", -- value: 4 -- }, -- { -- label: "单位五", -- value: 5 -- }, -- { -- label: "单位六", -- value: 6 -- } -- ], -- materialList: [], -- 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 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' }], -- 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 submitForm = async (formEl: FormInstance | undefined) => { -- if (!formEl) return -- await formEl.validate(async (valid, fields) => { -- if (valid) { -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].postList = [...state.materialList[i].mustList,...state.materialList[i].unList] -- state.form.wmAddReqDTOList = [...state.form.wmAddReqDTOList,...state.materialList[i].postList] -- } -- 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 -- }); -- } -- state.materialList = [] -- } else { -- console.log('error submit!', fields) -- } -- }) -- } -- -- // 确认物资标准 -- const getMaList = async() =>{ -- if(state.materialList.length == 0){ -- const data = {workType: 6,workLevel: state.form.workLevel} -- const res = await workApplyApi().getMaterial(data) -- if (res.data.code === '200') { -- if(res.data.data.materialTypeList && res.data.data.materialTypeList!=null&&res.data.data.materialTypeList.length>0){ -- state.materialList = JSON.parse(JSON.stringify(res.data.data.materialTypeList)) -- for(let i in state.materialList){ -- state.materialList[i].mustList = [] -- state.materialList[i].unList = [] -- state.materialList[i].mdList = state.materialList[i].mdList?.map((item:any) => { -- if(item.configurationLevel == 0){ -- state.materialList[i].mustList.push(item) -- return -- }else{ -- state.materialList[i].unList.push(item) -- return -- } -- }) -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- } -- state.equipmentDialog = true -- }else{ -- ElMessage({ -- type: 'warning', -- message: '暂时查询不到物资标准信息' -- }); -- } -- } else { -- ElMessage({ -- type: 'warning', -- message: res.data.msg -- }); -- } -- }else{ -- state.materialList = state.materialList -- state.equipmentDialog = true -- } -- } -- const conFirmDevices = ()=>{ -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- -- } -- ElMessageBox.confirm('是否确认物资及数量配置?') -- .then(() => { -- state.equipmentDialog = false -- }) -- .catch(() => { -- // catch error -- }) -- } -- -- const closeMaterial = ()=>{ -- -- } -- -- // 折线图 -- const renderMenu = async (value: string) => { -- Session.set('projectId',value) -- userInfos.value.projectId = value -- await initBackEndControlRoutes(); -- }; -- return { -- renderMenu, -- Search, -- ruleFormRef, -- applyRules, -- toZero, -- getMaList, -- conFirmDevices, -- closeMaterial, -- 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> -Index: src/views/specialWorkSystem/workTicket/apply/components/space.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/apply/components/space.vue b/src/views/specialWorkSystem/workTicket/apply/components/space.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/apply/components/space.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -1,513 +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-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.value" /> -- </el-select> -- </el-form-item> -- </el-col> -- </el-row> -- <el-row> -- <el-col :span="12"> -- <el-form-item label="选择关联物资"> -- <el-button type="primary" @click="getMaList">选择物资标准</el-button> -- </el-form-item> -- </el-col> -- </el-row> -- </div> -- </el-form> -- <el-dialog v-model="equipmentDialog" title="关联物资标准" width="40%" center @close="closeMaterial"> -- <el-tabs tab-position="left" class="demo-tabs" type="border-card"> -- <el-tab-pane v-for="(item,index) in materialList" :label="item.materialTypeName" :key="index"> -- <div style="margin-bottom: 20px"> -- <el-form label-width="150px" label-position="top"> -- <div v-if="item.mustList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">必选</div> -- <el-form-item v-if="item.mustList.length>0" class="tab-i" v-for="(i,x) in item.mustList" :key="x" :label="item.mustList[x].materialName + ':'" prop="defaultVal" :rules="[{ type: 'defaultVal', required: true, message: '该内容不能为空', trigger: 'blur'}]"> -- <el-input size="default" type="number" v-model="item.mustList[x].value" @change="(val)=>toZero(val,index,'mustList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.mustList[x].stock}}</template> -- </el-input> -- </el-form-item> -- <div v-if="item.unList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">其他</div> -- <el-form-item v-if="item.unList.length>0" class="tab-i" v-for="(i,x) in item.unList" :key="x" :label="item.unList[x].materialName + ':'"> -- <el-input size="default" type="number" v-model="item.unList[x].value" @change="(val)=>toZero(val,index,'unList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.unList[x].stock}}</template> -- </el-input> -- </el-form-item> -- </el-form> -- </div> -- </el-tab-pane> -- </el-tabs> -- <template #footer> -- <span class="dialog-footer"> -- <el-button @click="equipmentDialog = false" size="default">取消</el-button> -- <el-button type="primary" @click="conFirmDevices" size="default">确认</el-button> -- </span> -- </template> -- </el-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, -- materialList: Array<any> -- } -- export default defineComponent({ -- name: 'spaceForm', -- components: {}, -- props:['workerList','departList'], -- setup() { -- const userInfo = useUserInfo() -- const { userInfos } = storeToRefs(userInfo); -- const state = reactive<stateType>({ -- equipmentDialog: false, -- materialList: [], -- form: { -- operatorUids: [], -- workType: 2, -- workLevel: 0, -- workContent: '', -- workLocation: '', -- hazardIdentification: '', -- workDetail:{ -- csDepId: null, -- csName: '', -- csOriginalName: '', -- otherSpecialWork: [] -- }, -- wmAddReqDTOList: [], -- 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 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' }], -- 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 submitForm = async (formEl: FormInstance | undefined) => { -- if (!formEl) return -- await formEl.validate(async (valid, fields) => { -- if (valid) { -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].postList = [...state.materialList[i].mustList,...state.materialList[i].unList] -- state.form.wmAddReqDTOList = [...state.form.wmAddReqDTOList,...state.materialList[i].postList] -- } -- 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 -- }); -- } -- state.materialList = [] -- } else { -- console.log('error submit!', fields) -- } -- }) -- } -- -- // 确认物资标准 -- const getMaList = async() =>{ -- if(state.materialList.length == 0){ -- const data = {workType: 2,workLevel: null} -- const res = await workApplyApi().getMaterial(data) -- if (res.data.code === '200') { -- if(res.data.data.materialTypeList && res.data.data.materialTypeList!=null&&res.data.data.materialTypeList.length>0){ -- state.materialList = JSON.parse(JSON.stringify(res.data.data.materialTypeList)) -- for(let i in state.materialList){ -- state.materialList[i].mustList = [] -- state.materialList[i].unList = [] -- state.materialList[i].mdList = state.materialList[i].mdList?.map((item:any) => { -- if(item.configurationLevel == 0){ -- state.materialList[i].mustList.push(item) -- return -- }else{ -- state.materialList[i].unList.push(item) -- return -- } -- }) -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- } -- state.equipmentDialog = true -- }else{ -- ElMessage({ -- type: 'warning', -- message: '暂时查询不到物资标准信息' -- }); -- } -- } else { -- ElMessage({ -- type: 'warning', -- message: res.data.msg -- }); -- } -- }else{ -- state.materialList = state.materialList -- state.equipmentDialog = true -- } -- } -- const conFirmDevices = ()=>{ -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- -- } -- ElMessageBox.confirm('是否确认物资及数量配置?') -- .then(() => { -- state.equipmentDialog = false -- }) -- .catch(() => { -- // catch error -- }) -- } -- -- const closeMaterial = ()=>{ -- -- } -- -- // 折线图 -- const renderMenu = async (value: string) => { -- Session.set('projectId',value) -- userInfos.value.projectId = value -- await initBackEndControlRoutes(); -- }; -- return { -- renderMenu, -- Search, -- ruleFormRef, -- applyRules, -- toZero, -- getMaList, -- conFirmDevices, -- closeMaterial, -- 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> -Index: src/views/specialWorkSystem/workTicket/apply/components/plate.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/apply/components/plate.vue b/src/views/specialWorkSystem/workTicket/apply/components/plate.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/apply/components/plate.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -1,755 +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-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="请输入" -- > -- <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="请输入" -- > -- <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.value" -- /> -- </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" :on-remove="handleRemove" :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="getMaList">选择物资标准</el-button> -- </el-form-item> -- </el-col> -- </el-row> -- </div> -- </el-form> -- <el-dialog v-model="equipmentDialog" title="关联物资标准" width="40%" center @close="closeMaterial"> -- <el-tabs tab-position="left" class="demo-tabs" type="border-card"> -- <el-tab-pane v-for="(item,index) in materialList" :label="item.materialTypeName" :key="index"> -- <div style="margin-bottom: 20px"> -- <el-form label-width="150px" label-position="top"> -- <div v-if="item.mustList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">必选</div> -- <el-form-item v-if="item.mustList.length>0" class="tab-i" v-for="(i,x) in item.mustList" :key="x" :label="item.mustList[x].materialName + ':'" prop="defaultVal" :rules="[{ type: 'defaultVal', required: true, message: '该内容不能为空', trigger: 'blur'}]"> -- <el-input size="default" type="number" v-model="item.mustList[x].value" @change="(val)=>toZero(val,index,'mustList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.mustList[x].stock}}</template> -- </el-input> -- </el-form-item> -- <div v-if="item.unList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">其他</div> -- <el-form-item v-if="item.unList.length>0" class="tab-i" v-for="(i,x) in item.unList" :key="x" :label="item.unList[x].materialName + ':'"> -- <el-input size="default" type="number" v-model="item.unList[x].value" @change="(val)=>toZero(val,index,'unList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.unList[x].stock}}</template> -- </el-input> -- </el-form-item> -- </el-form> -- </div> -- </el-tab-pane> -- </el-tabs> -- <template #footer> -- <span class="dialog-footer"> -- <el-button @click="equipmentDialog = false" size="default">取消</el-button> -- <el-button type="primary" @click="conFirmDevices" size="default">确认</el-button> -- </span> -- </template> -- </el-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, -- materialList: Array<any> -- } -- interface file { -- url: string; -- } -- export default defineComponent({ -- name: 'plateForm', -- components: {}, -- props:['workerList'], -- setup() { -- const userInfo = useUserInfo() -- const { userInfos } = storeToRefs(userInfo); -- const state = reactive<stateType>({ -- equipmentDialog: false, -- materialList: [], -- form: { -- operatorUids: [], -- workType: 8, -- workLevel: null, -- workContent: '', -- workLocation: '', -- hazardIdentification: '', -- workDetail:{ -- bpCode: '', -- mainMedia: '', -- temperature: null, -- pressure: null, -- bpMaterialQuality: '', -- bpSpecification: '', -- bpLocation: '', -- bpLocationMapPath: [], -- installLine: [], -- installBpTime: '', -- uninstallBpTime: '', -- otherSpecialWork: [] -- }, -- wmAddReqDTOList: [], -- 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 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' }], -- 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 submitForm = async (formEl: FormInstance | undefined) => { -- if (!formEl) return -- await formEl.validate(async (valid, fields) => { -- if (valid) { -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].postList = [...state.materialList[i].mustList,...state.materialList[i].unList] -- state.form.wmAddReqDTOList = [...state.form.wmAddReqDTOList,...state.materialList[i].postList] -- } -- 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 -- }); -- } -- state.materialList = [] -- } 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 getMaList = async() =>{ -- if(state.materialList.length == 0){ -- const data = {workType: 8,workLevel: state.form.workLevel} -- const res = await workApplyApi().getMaterial(data) -- if (res.data.code === '200') { -- if(res.data.data.materialTypeList && res.data.data.materialTypeList!=null&&res.data.data.materialTypeList.length>0){ -- state.materialList = JSON.parse(JSON.stringify(res.data.data.materialTypeList)) -- for(let i in state.materialList){ -- state.materialList[i].mustList = [] -- state.materialList[i].unList = [] -- state.materialList[i].mdList = state.materialList[i].mdList?.map((item:any) => { -- if(item.configurationLevel == 0){ -- state.materialList[i].mustList.push(item) -- return -- }else{ -- state.materialList[i].unList.push(item) -- return -- } -- }) -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- } -- state.equipmentDialog = true -- }else{ -- ElMessage({ -- type: 'warning', -- message: '暂时查询不到物资标准信息' -- }); -- } -- } else { -- ElMessage({ -- type: 'warning', -- message: res.data.msg -- }); -- } -- }else{ -- state.materialList = state.materialList -- state.equipmentDialog = true -- } -- } -- const conFirmDevices = ()=>{ -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- -- } -- ElMessageBox.confirm('是否确认物资及数量配置?') -- .then(() => { -- state.equipmentDialog = false -- }) -- .catch(() => { -- // catch error -- }) -- } -- -- const closeMaterial = ()=>{ -- -- } -- -- // 折线图 -- const renderMenu = async (value: string) => { -- Session.set('projectId',value) -- userInfos.value.projectId = value -- await initBackEndControlRoutes(); -- }; -- return { -- renderMenu, -- Search, -- ruleFormRef, -- applyRules, -- toZero, -- getMaList, -- conFirmDevices, -- closeMaterial, -- 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> -Index: src/views/specialWorkSystem/workTicket/apply/components/fire.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/apply/components/fire.vue b/src/views/specialWorkSystem/workTicket/apply/components/fire.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/apply/components/fire.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -1,502 +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-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.value" -- /> -- </el-select> -- </el-form-item> -- </el-col> -- </el-row> -- <el-row> -- <el-col :span="12"> -- <el-form-item label="选择关联物资"> -- <el-button type="primary" @click="getMaList">选择物资标准</el-button> -- </el-form-item> -- </el-col> -- </el-row> -- </div> -- </el-form> -- <el-dialog v-model="equipmentDialog" title="关联物资标准" width="40%" center @close="closeMaterial"> -- <el-tabs tab-position="left" class="demo-tabs" type="border-card"> -- <el-tab-pane v-for="(item,index) in materialList" :label="item.materialTypeName" :key="index"> -- <div style="margin-bottom: 20px"> -- <el-form label-width="150px" label-position="top"> -- <div v-if="item.mustList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">必选</div> -- <el-form-item v-if="item.mustList.length>0" class="tab-i" v-for="(i,x) in item.mustList" :key="x" :label="item.mustList[x].materialName + ':'" prop="defaultVal" :rules="[{ type: 'defaultVal', required: true, message: '该内容不能为空', trigger: 'blur'}]"> -- <el-input size="default" type="number" v-model="item.mustList[x].value" @change="(val)=>toZero(val,index,'mustList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.mustList[x].stock}}</template> -- </el-input> -- </el-form-item> -- <div v-if="item.unList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">其他</div> -- <el-form-item v-if="item.unList.length>0" class="tab-i" v-for="(i,x) in item.unList" :key="x" :label="item.unList[x].materialName + ':'"> -- <el-input size="default" type="number" v-model="item.unList[x].value" @change="(val)=>toZero(val,index,'unList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.unList[x].stock}}</template> -- </el-input> -- </el-form-item> -- </el-form> -- </div> -- </el-tab-pane> -- </el-tabs> -- <template #footer> -- <span class="dialog-footer"> -- <el-button @click="equipmentDialog = false" size="default">取消</el-button> -- <el-button type="primary" @click="conFirmDevices" size="default">确认</el-button> -- </span> -- </template> -- </el-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, -- materialList: Array<any> -- } -- export default defineComponent({ -- name: 'fireForm', -- components: {}, -- props:['workerList'], -- setup() { -- const userInfo = useUserInfo() -- const { userInfos } = storeToRefs(userInfo); -- const state = reactive<stateType>({ -- equipmentDialog: false, -- materialList: [], -- form: { -- operatorUids: [], -- workType: 1, -- workLevel: null, -- workContent: '', -- workLocation: '', -- hazardIdentification: '', -- workDetail:{ -- hotMethod: '', -- otherSpecialWork: [] -- }, -- wmAddReqDTOList: [], -- 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 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' }], -- 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 submitForm = async (formEl: FormInstance | undefined) => { -- if (!formEl) return -- await formEl.validate(async (valid, fields) => { -- if (valid) { -- if (state.materialList.length == 0){ -- ElMessage({ -- type: 'warning', -- message: '请确认关联物资的配置' -- }); -- return -- } -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].postList = [...state.materialList[i].mustList,...state.materialList[i].unList] -- state.form.wmAddReqDTOList = [...state.form.wmAddReqDTOList,...state.materialList[i].postList] -- } -- 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 -- }); -- } -- state.materialList = [] -- } else { -- console.log('error submit!', fields) -- } -- }) -- } -- -- // 确认物资标准 -- const getMaList = async() =>{ -- if(state.materialList.length == 0){ -- const data = {workType: 1,workLevel: state.form.workLevel} -- const res = await workApplyApi().getMaterial(data) -- if (res.data.code === '200') { -- if(res.data.data.materialTypeList && res.data.data.materialTypeList!=null&&res.data.data.materialTypeList.length>0){ -- state.materialList = JSON.parse(JSON.stringify(res.data.data.materialTypeList)) -- for(let i in state.materialList){ -- state.materialList[i].mustList = [] -- state.materialList[i].unList = [] -- state.materialList[i].mdList = state.materialList[i].mdList?.map((item:any) => { -- if(item.configurationLevel == 0){ -- state.materialList[i].mustList.push(item) -- return -- }else{ -- state.materialList[i].unList.push(item) -- return -- } -- }) -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- } -- state.equipmentDialog = true -- }else{ -- ElMessage({ -- type: 'warning', -- message: '暂时查询不到物资标准信息' -- }); -- } -- } else { -- ElMessage({ -- type: 'warning', -- message: res.data.msg -- }); -- } -- }else{ -- state.materialList = state.materialList -- state.equipmentDialog = true -- } -- } -- -- const conFirmDevices = ()=>{ -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- } -- ElMessageBox.confirm('是否确认物资及数量配置?') -- .then(() => { -- state.equipmentDialog = false -- }) -- .catch(() => { -- // catch error -- }) -- } -- -- const closeMaterial = ()=>{ -- -- } -- // 折线图 -- const renderMenu = async (value: string) => { -- Session.set('projectId',value) -- userInfos.value.projectId = value -- await initBackEndControlRoutes(); -- }; -- return { -- renderMenu, -- Search, -- ruleFormRef, -- applyRules, -- toZero, -- getMaList, -- conFirmDevices, -- closeMaterial, -- 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> -Index: src/views/specialWorkSystem/workTicket/apply/components/hoist.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/apply/components/hoist.vue b/src/views/specialWorkSystem/workTicket/apply/components/hoist.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/apply/components/hoist.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -1,445 +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-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="请输入" -- > -- <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="getMaList">选择物资标准</el-button> -- </el-form-item> -- </el-col> -- </el-row> -- </div> -- </el-form> -- <el-dialog v-model="equipmentDialog" title="关联物资标准" width="40%" center @close="closeMaterial"> -- <el-tabs tab-position="left" class="demo-tabs" type="border-card"> -- <el-tab-pane v-for="(item,index) in materialList" :label="item.materialTypeName" :key="index"> -- <div style="margin-bottom: 20px"> -- <el-form label-width="150px" label-position="top"> -- <div v-if="item.mustList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">必选</div> -- <el-form-item v-if="item.mustList.length>0" class="tab-i" v-for="(i,x) in item.mustList" :key="x" :label="item.mustList[x].materialName + ':'" prop="defaultVal" :rules="[{ type: 'defaultVal', required: true, message: '该内容不能为空', trigger: 'blur'}]"> -- <el-input size="default" type="number" v-model="item.mustList[x].value" @change="(val)=>toZero(val,index,'mustList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.mustList[x].stock}}</template> -- </el-input> -- </el-form-item> -- <div v-if="item.unList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">其他</div> -- <el-form-item v-if="item.unList.length>0" class="tab-i" v-for="(i,x) in item.unList" :key="x" :label="item.unList[x].materialName + ':'"> -- <el-input size="default" type="number" v-model="item.unList[x].value" @change="(val)=>toZero(val,index,'unList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.unList[x].stock}}</template> -- </el-input> -- </el-form-item> -- </el-form> -- </div> -- </el-tab-pane> -- </el-tabs> -- <template #footer> -- <span class="dialog-footer"> -- <el-button @click="equipmentDialog = false" size="default">取消</el-button> -- <el-button type="primary" @click="conFirmDevices" size="default">确认</el-button> -- </span> -- </template> -- </el-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>, -- materialList: Array<any> -- } -- export default defineComponent({ -- name: 'hoistForm', -- components: {}, -- props:['workerList'], -- setup() { -- const userInfo = useUserInfo() -- const { userInfos } = storeToRefs(userInfo); -- const state = reactive<stateType>({ -- equipmentDialog: false, -- form: { -- operatorUids: [], -- workType: 3, -- workLevel: null, -- workContent: '', -- workLocation: '', -- hazardIdentification: '', -- workDetail:{ -- hoistingToolName: '', -- weightMass: null -- }, -- wmAddReqDTOList: [], -- workTimeLine: [], -- expStartTime: '', -- expEndTime: '' -- }, -- materialList: [], -- workLevelList: [ -- { -- label: "一级吊装作业", -- value: 8 -- }, -- { -- label: "二级吊装作业", -- value: 9 -- }, -- { -- label: "三级吊装作业", -- value: 10 -- } -- ] -- }); -- 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' }], -- 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 submitForm = async (formEl: FormInstance | undefined) => { -- if (!formEl) return -- await formEl.validate(async (valid, fields) => { -- if (valid) { -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].postList = [...state.materialList[i].mustList,...state.materialList[i].unList] -- state.form.wmAddReqDTOList = [...state.form.wmAddReqDTOList,...state.materialList[i].postList] -- } -- 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 -- }); -- } -- state.materialList = [] -- } else { -- console.log('error submit!', fields) -- } -- }) -- } -- -- // 确认物资标准 -- const getMaList = async() =>{ -- if(state.materialList.length == 0){ -- const data = {workType: 3,workLevel: state.form.workLevel} -- const res = await workApplyApi().getMaterial(data) -- if (res.data.code === '200') { -- if(res.data.data.materialTypeList && res.data.data.materialTypeList!=null&&res.data.data.materialTypeList.length>0){ -- state.materialList = JSON.parse(JSON.stringify(res.data.data.materialTypeList)) -- for(let i in state.materialList){ -- state.materialList[i].mustList = [] -- state.materialList[i].unList = [] -- state.materialList[i].mdList = state.materialList[i].mdList?.map((item:any) => { -- if(item.configurationLevel == 0){ -- state.materialList[i].mustList.push(item) -- return -- }else{ -- state.materialList[i].unList.push(item) -- return -- } -- }) -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- } -- state.equipmentDialog = true -- }else{ -- ElMessage({ -- type: 'warning', -- message: '暂时查询不到物资标准信息' -- }); -- } -- } else { -- ElMessage({ -- type: 'warning', -- message: res.data.msg -- }); -- } -- }else{ -- state.materialList = state.materialList -- state.equipmentDialog = true -- } -- } -- const conFirmDevices = ()=>{ -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- -- } -- ElMessageBox.confirm('是否确认物资及数量配置?') -- .then(() => { -- state.equipmentDialog = false -- }) -- .catch(() => { -- // catch error -- }) -- } -- -- const closeMaterial = ()=>{ -- -- } -- -- // 折线图 -- const renderMenu = async (value: string) => { -- Session.set('projectId',value) -- userInfos.value.projectId = value -- await initBackEndControlRoutes(); -- }; -- return { -- renderMenu, -- Search, -- ruleFormRef, -- applyRules, -- toZero, -- getMaList, -- conFirmDevices, -- closeMaterial, -- 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> -Index: src/views/specialWorkSystem/workTicket/approve/components/fireLog.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/approve/components/fireLog.vue b/src/views/specialWorkSystem/workTicket/approve/components/fireLog.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/approve/components/fireLog.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -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> -Index: src/views/specialWorkSystem/workTicket/approve/components/hoistLog.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/approve/components/hoistLog.vue b/src/views/specialWorkSystem/workTicket/approve/components/hoistLog.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/approve/components/hoistLog.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -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> -Index: src/views/specialWorkSystem/workTicket/apply/components/power.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/apply/components/power.vue b/src/views/specialWorkSystem/workTicket/apply/components/power.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/apply/components/power.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -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="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-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="请输入" -- > -- <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="getMaList">选择物资标准</el-button> -- </el-form-item> -- </el-col> -- </el-row> -- </div> -- </el-form> -- <el-dialog v-model="equipmentDialog" title="关联物资标准" width="40%" center @close="closeMaterial"> -- <el-tabs tab-position="left" class="demo-tabs" type="border-card"> -- <el-tab-pane v-for="(item,index) in materialList" :label="item.materialTypeName" :key="index"> -- <div style="margin-bottom: 20px"> -- <el-form label-width="150px" label-position="top"> -- <div v-if="item.mustList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">必选</div> -- <el-form-item v-if="item.mustList.length>0" class="tab-i" v-for="(i,x) in item.mustList" :key="x" :label="item.mustList[x].materialName + ':'" prop="defaultVal" :rules="[{ type: 'defaultVal', required: true, message: '该内容不能为空', trigger: 'blur'}]"> -- <el-input size="default" type="number" v-model="item.mustList[x].value" @change="(val)=>toZero(val,index,'mustList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.mustList[x].stock}}</template> -- </el-input> -- </el-form-item> -- <div v-if="item.unList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">其他</div> -- <el-form-item v-if="item.unList.length>0" class="tab-i" v-for="(i,x) in item.unList" :key="x" :label="item.unList[x].materialName + ':'"> -- <el-input size="default" type="number" v-model="item.unList[x].value" @change="(val)=>toZero(val,index,'unList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.unList[x].stock}}</template> -- </el-input> -- </el-form-item> -- </el-form> -- </div> -- </el-tab-pane> -- </el-tabs> -- <template #footer> -- <span class="dialog-footer"> -- <el-button @click="equipmentDialog = false" size="default">取消</el-button> -- <el-button type="primary" @click="conFirmDevices" size="default">确认</el-button> -- </span> -- </template> -- </el-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, -- workLevelList: Array<any>, -- equipmentDialog: boolean, -- materialList: Array<any> -- } -- export default defineComponent({ -- name: 'powerForm', -- components: {}, -- props:['workerList'], -- setup() { -- const userInfo = useUserInfo() -- const { userInfos } = storeToRefs(userInfo); -- const state = reactive<stateType>({ -- equipmentDialog: false, -- materialList: [], -- form: { -- operatorUids: [], -- workType: 7, -- workLevel: 0, -- workContent: '', -- workLocation: '', -- hazardIdentification: '', -- workDetail:{ -- powerAccessPoint: '', -- workingVoltage: null, -- equipmentAndPower: '' -- }, -- wmAddReqDTOList: [], -- workTimeLine: [], -- expStartTime: '', -- expEndTime: '' -- }, -- workLevelList: [ -- { -- label: "一级吊装作业", -- value: 8 -- }, -- { -- label: "二级吊装作业", -- value: 9 -- }, -- { -- label: "三级吊装作业", -- value: 10 -- } -- ] -- }); -- 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' }], -- 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 submitForm = async (formEl: FormInstance | undefined) => { -- if (!formEl) return -- await formEl.validate(async (valid, fields) => { -- if (valid) { -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].postList = [...state.materialList[i].mustList,...state.materialList[i].unList] -- state.form.wmAddReqDTOList = [...state.form.wmAddReqDTOList,...state.materialList[i].postList] -- } -- 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 -- }); -- } -- state.materialList = [] -- } else { -- console.log('error submit!', fields) -- } -- }) -- } -- // 确认物资标准 -- const getMaList = async() =>{ -- if(state.materialList.length == 0){ -- const data = {workType: 7,workLevel: null} -- const res = await workApplyApi().getMaterial(data) -- if (res.data.code === '200') { -- if(res.data.data.materialTypeList && res.data.data.materialTypeList!=null&&res.data.data.materialTypeList.length>0){ -- state.materialList = JSON.parse(JSON.stringify(res.data.data.materialTypeList)) -- for(let i in state.materialList){ -- state.materialList[i].mustList = [] -- state.materialList[i].unList = [] -- state.materialList[i].mdList = state.materialList[i].mdList?.map((item:any) => { -- if(item.configurationLevel == 0){ -- state.materialList[i].mustList.push(item) -- return -- }else{ -- state.materialList[i].unList.push(item) -- return -- } -- }) -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- } -- state.equipmentDialog = true -- }else{ -- ElMessage({ -- type: 'warning', -- message: '暂时查询不到物资标准信息' -- }); -- } -- } else { -- ElMessage({ -- type: 'warning', -- message: res.data.msg -- }); -- } -- }else{ -- state.materialList = state.materialList -- state.equipmentDialog = true -- } -- } -- const conFirmDevices = ()=>{ -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- -- } -- ElMessageBox.confirm('是否确认物资及数量配置?') -- .then(() => { -- state.equipmentDialog = false -- }) -- .catch(() => { -- // catch error -- }) -- } -- -- const closeMaterial = ()=>{ -- -- } -- // 折线图 -- const renderMenu = async (value: string) => { -- Session.set('projectId',value) -- userInfos.value.projectId = value -- await initBackEndControlRoutes(); -- }; -- return { -- renderMenu, -- Search, -- ruleFormRef, -- applyRules, -- toZero, -- getMaList, -- conFirmDevices, -- closeMaterial, -- 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> -Index: src/views/specialWorkSystem/workTicket/approve/components/heightLog.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/approve/components/heightLog.vue b/src/views/specialWorkSystem/workTicket/approve/components/heightLog.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/approve/components/heightLog.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -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> -Index: src/views/specialWorkSystem/workTicket/approve/components/plateLog.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/approve/components/plateLog.vue b/src/views/specialWorkSystem/workTicket/approve/components/plateLog.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/approve/components/plateLog.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -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> -Index: src/views/specialWorkSystem/workTicket/approve/components/groundLog.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/approve/components/groundLog.vue b/src/views/specialWorkSystem/workTicket/approve/components/groundLog.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/approve/components/groundLog.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -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> -Index: src/views/specialWorkSystem/workTicket/approve/index.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/approve/index.vue b/src/views/specialWorkSystem/workTicket/approve/index.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/approve/index.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -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/myApproval/components/fireLog.vue')), -- space: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/myApproval/components/spaceLog.vue')), -- hoist: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/myApproval/components/hoistLog.vue')), -- ground: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/myApproval/components/groundLog.vue')), -- broken: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/myApproval/components/brokenLog.vue')), -- height: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/myApproval/components/heightLog.vue')), -- power: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/myApproval/components/powerLog.vue')), -- plate: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/myApproval/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: 'apply' -- }); -- }; -- -- 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> -Index: src/views/specialWorkSystem/workTicket/approve/components/spaceLog.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/approve/components/spaceLog.vue b/src/views/specialWorkSystem/workTicket/approve/components/spaceLog.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/approve/components/spaceLog.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -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> -Index: src/views/specialWorkSystem/workTicket/apply/components/broken.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/apply/components/broken.vue b/src/views/specialWorkSystem/workTicket/apply/components/broken.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/apply/components/broken.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -1,632 +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-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" :on-remove="handleRemove" :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="getMaList">选择物资标准</el-button> -- </el-form-item> -- </el-col> -- </el-row> -- </div> -- </el-form> -- <el-dialog v-model="equipmentDialog" title="关联物资标准" width="40%" center @close="closeMaterial"> -- <el-tabs tab-position="left" class="demo-tabs" type="border-card"> -- <el-tab-pane v-for="(item,index) in materialList" :label="item.materialTypeName" :key="index"> -- <div style="margin-bottom: 20px"> -- <el-form label-width="150px" label-position="top"> -- <div v-if="item.mustList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">必选</div> -- <el-form-item v-if="item.mustList.length>0" class="tab-i" v-for="(i,x) in item.mustList" :key="x" :label="item.mustList[x].materialName + ':'" prop="defaultVal" :rules="[{ type: 'defaultVal', required: true, message: '该内容不能为空', trigger: 'blur'}]"> -- <el-input size="default" type="number" v-model="item.mustList[x].value" @change="(val)=>toZero(val,index,'mustList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.mustList[x].stock}}</template> -- </el-input> -- </el-form-item> -- <div v-if="item.unList.length>0" style="width: 100%;border-bottom: 1px solid #ccc;padding-bottom: 6px;margin-bottom: 10px;font-weight: bolder">其他</div> -- <el-form-item v-if="item.unList.length>0" class="tab-i" v-for="(i,x) in item.unList" :key="x" :label="item.unList[x].materialName + ':'"> -- <el-input size="default" type="number" v-model="item.unList[x].value" @change="(val)=>toZero(val,index,'unList',x)" placeholder="请输入配置数量,空值默认为0"> -- <template #append>{{'库存:' + item.unList[x].stock}}</template> -- </el-input> -- </el-form-item> -- </el-form> -- </div> -- </el-tab-pane> -- </el-tabs> -- <template #footer> -- <span class="dialog-footer"> -- <el-button @click="equipmentDialog = false" size="default">取消</el-button> -- <el-button type="primary" @click="conFirmDevices" size="default">确认</el-button> -- </span> -- </template> -- </el-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 { -- equipmentDialog: boolean, -- form: Object, -- csDepList: Array<any>, -- fileList: Array<file>, -- uploadUrl: string, -- dialogVisible: Boolean, -- dialogImageUrl: string | null, -- imgLimit: number, -- casProps: {}, -- casProps2: {}, -- isOverSize: boolean, -- materialList: Array<any> -- } -- interface file { -- url: string; -- } -- export default defineComponent({ -- name: 'brokenForm', -- components: {}, -- props:['workerList','departList'], -- setup() { -- const userInfo = useUserInfo() -- const { userInfos } = storeToRefs(userInfo); -- const state = reactive<stateType>({ -- equipmentDialog: false, -- form: { -- operatorUids: [], -- workType: 5, -- workLevel: 0, -- workContent: '', -- workLocation: '', -- hazardIdentification: '', -- workDetail:{ -- operationDepId: null, -- bcReason: '', -- bcExplain: '', -- bcPath: [], -- involvedDepIds: [] -- }, -- wmAddReqDTOList: [], -- workTimeLine: [], -- expStartTime: '', -- expEndTime: '' -- }, -- materialList: [], -- 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 -- }, -- casProps2: { -- emitPath: false, -- value: 'depId', -- label: 'depName', -- multiple: false, -- expandTrigger: 'hover', -- checkStrictly: true -- } -- }); -- 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' }], -- 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 submitForm = async (formEl: FormInstance | undefined) => { -- if (!formEl) return -- await formEl.validate(async (valid, fields) => { -- if (valid) { -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- defaultVal: item.value, -- id: item.id -- } -- return {...obj} -- }) -- state.materialList[i].postList = [...state.materialList[i].mustList,...state.materialList[i].unList] -- state.form.wmAddReqDTOList = [...state.form.wmAddReqDTOList,...state.materialList[i].postList] -- } -- 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 -- }); -- } -- state.materialList = [] -- } 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 getMaList = async() =>{ -- if(state.materialList.length == 0){ -- const data = {workType: 5,workLevel: null} -- const res = await workApplyApi().getMaterial(data) -- if (res.data.code === '200') { -- if(res.data.data.materialTypeList && res.data.data.materialTypeList!=null&&res.data.data.materialTypeList.length>0){ -- state.materialList = JSON.parse(JSON.stringify(res.data.data.materialTypeList)) -- for(let i in state.materialList){ -- state.materialList[i].mustList = [] -- state.materialList[i].unList = [] -- state.materialList[i].mdList = state.materialList[i].mdList?.map((item:any) => { -- if(item.configurationLevel == 0){ -- state.materialList[i].mustList.push(item) -- return -- }else{ -- state.materialList[i].unList.push(item) -- return -- } -- }) -- state.materialList[i].mustList = state.materialList[i].mustList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- state.materialList[i].unList = state.materialList[i].unList.map((item:any)=>{ -- const obj = { -- value: item.defaultVal, -- materialName: item.materialName, -- configurationLevel: item.configurationLevel, -- id: item.id, -- stock: item.stock -- } -- return {...obj} -- }) -- } -- state.equipmentDialog = true -- }else{ -- ElMessage({ -- type: 'warning', -- message: '暂时查询不到物资标准信息' -- }); -- } -- } else { -- ElMessage({ -- type: 'warning', -- message: res.data.msg -- }); -- } -- }else{ -- state.materialList = state.materialList -- state.equipmentDialog = true -- } -- } -- const conFirmDevices = ()=>{ -- for(let i in state.materialList){ -- for(let j in state.materialList[i].mustList){ -- if(state.materialList[i].mustList[j].value>state.materialList[i].mustList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- for(let j in state.materialList[i].unList){ -- if(state.materialList[i].unList[j].value>state.materialList[i].unList[j].stock){ -- ElMessage({ -- type: 'warning', -- message: '部分物资库存不足,请重新配置数量。' -- }); -- return -- } -- } -- -- } -- ElMessageBox.confirm('是否确认物资及数量配置?') -- .then(() => { -- state.equipmentDialog = false -- }) -- .catch(() => { -- // catch error -- }) -- } -- -- const closeMaterial = ()=>{ -- -- } -- -- // 折线图 -- const renderMenu = async (value: string) => { -- Session.set('projectId',value) -- userInfos.value.projectId = value -- await initBackEndControlRoutes(); -- }; -- return { -- renderMenu, -- Search, -- ruleFormRef, -- applyRules, -- toZero, -- getMaList, -- conFirmDevices, -- closeMaterial, -- 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> -Index: src/views/specialWorkSystem/workTicket/approve/components/powerLog.vue -=================================================================== -diff --git a/src/views/specialWorkSystem/workTicket/approve/components/powerLog.vue b/src/views/specialWorkSystem/workTicket/approve/components/powerLog.vue -deleted file mode 100644 ---- a/src/views/specialWorkSystem/workTicket/approve/components/powerLog.vue (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -+++ /dev/null (revision 2bff5e788d4f7e505961270f0624aa3e78280e25) -@@ -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/.idea/shelf/Uncommitted_changes_before_Update_at_2022_10_13_14_41__Default_Changelist_.xml b/.idea/shelf/Uncommitted_changes_before_Update_at_2022_10_13_14_41__Default_Changelist_.xml deleted file mode 100644 index 946ad0f..0000000 --- a/.idea/shelf/Uncommitted_changes_before_Update_at_2022_10_13_14_41__Default_Changelist_.xml +++ /dev/null @@ -1,4 +0,0 @@ -<changelist name="Uncommitted_changes_before_Update_at_2022_10_13_14_41_[Default_Changelist]" date="1665643313431" recycled="true" deleted="true"> - <option name="PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Update_at_2022_10_13_14_41_[Default_Changelist]/shelved.patch" /> - <option name="DESCRIPTION" value="Uncommitted changes before Update at 2022/10/13 14:41 [Default Changelist]" /> -</changelist> \ No newline at end of file diff --git a/src/api/facilityManagement/goodsDetailManage/index.ts b/src/api/facilityManagement/goodsDetailManage/index.ts new file mode 100644 index 0000000..6ca4c36 --- /dev/null +++ b/src/api/facilityManagement/goodsDetailManage/index.ts @@ -0,0 +1,89 @@ +import request from '/@/utils/request'; +export function goodsDetailApi() { + return { + // 设备设施类型管理 查询单条数据 + getGoodsDetailList: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/smDetail/page/list`, + method: 'post', + data + }); + }, + addGoodsDetail: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/smDetail/save`, + method: 'post', + data + }); + }, + checkOutBySingle: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/smDetail/single/delivery`, + method: 'post', + data + }); + }, + checkOutByMore: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/smDetail/batch/delivery/ids`, + method: 'post', + data + }); + }, + updateGoodsDetail: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/smDetail/update`, + method: 'post', + data + }); + }, + getGoodsListByLevel: () => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/safeMaterial/list`, + method: 'post', + }); + }, + checkOutOne: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/smDetail/single/delivery`, + method: 'post', + data + }); + }, + checkOutMore: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/smDetail/batch/delivery/ids`, + method: 'post', + data + }); + }, + checkInOne: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/smDetail/single/receipt`, + method: 'post', + data + }); + }, + checkInMore: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/smDetail/batch/receipt`, + method: 'post', + data + }); + }, + deleteSingleGoods: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/smDetail/delete`, + method: 'post', + data + }); + }, + deleteBatchGoods: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/smDetail/deleteBatch`, + method: 'post', + data + }); + }, + } +} diff --git a/src/api/facilityManagement/safetyGoodsAndEquipment/index.ts b/src/api/facilityManagement/safetyGoodsAndEquipment/index.ts new file mode 100644 index 0000000..d8daf35 --- /dev/null +++ b/src/api/facilityManagement/safetyGoodsAndEquipment/index.ts @@ -0,0 +1,82 @@ +import request from '/@/utils/request'; +export function goodsAndEquipmentApi() { + return { + // 设备设施类型管理 查询单条数据 + getGoodsEquipmentData: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/safeMaterial/page/list`, + method: 'post', + data + }); + }, + getAllSafetyEquipment: () => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/classify/list`, + method: 'post', + }); + }, + getAllSafetyEquipmentByPage: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/classify/page/list`, + method: 'post', + data + }); + }, + addGoodsEquipment: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/safeMaterial/save`, + method: 'post', + data + }); + }, + updateGoodsEquipment: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/safeMaterial/update`, + method: 'post', + data + }); + }, + deleteGoodsEquipment: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/safeMaterial/delete`, + method: 'post', + data + }); + }, + addGoodsClassify: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/classify/save`, + method: 'post', + data + }); + }, + updateGoodsClassify: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/classify/update`, + method: 'post', + data + }); + }, + deleteGoodsClassify: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/classify/delete`, + method: 'post', + data + }); + }, + batchInStorageGoods: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/smDetail/saveBatch`, + method: 'post', + data + }); + }, + batchOutStorageGoods: (data: {}) => { + return request({ + url: import.meta.env.VITE_API_URL_OUT + `/equipment/smDetail/batch/delivery/random`, + method: 'post', + data + }); + }, + } +} diff --git a/src/stores/interface/index.ts b/src/stores/interface/index.ts index 73b93b5..a0999d6 100644 --- a/src/stores/interface/index.ts +++ b/src/stores/interface/index.ts @@ -11,6 +11,7 @@ time: number; userName: string; uid: string; + depId: string; projectId: string; dataList: []; } diff --git a/src/stores/userInfo.ts b/src/stores/userInfo.ts index 425b01d..973c82a 100644 --- a/src/stores/userInfo.ts +++ b/src/stores/userInfo.ts @@ -15,6 +15,7 @@ roles: [], authBtnList: [], uid: '', + depId: '', projectId: '', dataList: [] } @@ -25,6 +26,7 @@ this.userInfos.userName = value.realName; this.userInfos.uid = value.uid; this.userInfos.roles = value.role; + this.userInfos.depId = value.depId // const userName = Cookies.get('userName'); // // 模拟数据 // let defaultRoles: Array<string> = []; diff --git a/src/utils/toolsValidate.ts b/src/utils/toolsValidate.ts index 9845b35..434466e 100644 --- a/src/utils/toolsValidate.ts +++ b/src/utils/toolsValidate.ts @@ -60,6 +60,26 @@ } /** + * 0到9 + * @param val 当前值字符串 + * @returns 返回处理后的字符串 + */ +export function verifyString(val: string) { + let v = val.replace(/(^\s*)|(\s*$)/g, ''); + // 只能是数字和小数点,不能是其他输入 + v = v.replace(/[^\d.]/g, ''); + // 以0开始只能输入一个 + v = v.replace(/^\./g, ''); + // 小数只能出现1位 + v = v.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.'); + // 小数点后面保留2位 + v = v.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); + // 返回结果 + return v; +} + + +/** * 正整数验证 * @param val 当前值字符串 * @returns 返回处理后的字符串 diff --git a/src/views/facilityManagement/goodsDetailManage/components/checkOut.vue b/src/views/facilityManagement/goodsDetailManage/components/checkOut.vue new file mode 100644 index 0000000..9f76c17 --- /dev/null +++ b/src/views/facilityManagement/goodsDetailManage/components/checkOut.vue @@ -0,0 +1,133 @@ +<template> + <div> + <el-dialog :title="checkOutState.title" :close-on-click-modal="false" v-model="checkOutState.checkOutDialogVisible" width="30%"> + <el-form + :model="checkOutState.checkOutForm" + ref="checkOutFormRef" + size="default" + v-loading="checkOutState.loading" + element-loading-text="Loading..." + label-width="150px"> + <el-row> + <el-col :span="24" class="mb20"> + <el-form-item label="当前所选物资:"> + <el-input v-model="checkOutState.materialName" :readonly="true" class="input-add"> + </el-input> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20"> + <el-form-item label="认领人:" prop="claimantId"> + <el-select class="input-add" v-model="checkOutState.checkOutForm.claimantId" placeholder="选择认领人"> + <el-option + v-for="item in checkOutState.userList" + :key="item.uid" + :value="item.uid" + :label="item.realName" + ></el-option> + </el-select> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button :disabled="checkOutState.loading" @click="checkOutState.batchOutStorageDialogVisible = !checkOutState.batchOutStorageDialogVisible" size="default">取 消</el-button> + <el-button :disabled="checkOutState.loading" type="primary" @click="submitCheckOutForm" v-throttle size="default">确 定</el-button> + </span> + </template> + </el-dialog> + </div> +</template> + +<script setup lang="ts"> + +import {defineEmits, reactive} from "vue"; +import {checkOutStateType, GoodsDetailDataType} from "/@/views/facilityManagement/goodsDetailManage/index"; +import {teamManageApi} from "/@/api/systemManage/basicDateManage/personShiftManage/teamManage"; +import {ElMessage} from "element-plus/es"; +import {goodsDetailApi} from "/@/api/facilityManagement/goodsDetailManage"; + +const checkOutState = reactive<checkOutStateType>({ + title: '', + loading: false, + checkOutDialogVisible: false, + materialName: '', + checkOutForm: { + id: null, + claimantId: null, + ids: [], + }, + userList: [], +}) + +const openCheckOutDialog = (title: string, value: GoodsDetailDataType, ids:Array<number>, checkOutName: null | string) => { + checkOutState.title = title; + checkOutState.checkOutDialogVisible = true; + checkOutState.checkOutForm.claimantId = null; + getUserByDepartment(1 as number) + if(title === '单独出库'){ + checkOutState.materialName = value.name as string + checkOutState.checkOutForm.id = value.id; + }else{ + checkOutState.materialName = checkOutName as string + checkOutState.checkOutForm.ids = ids + } + + +} + +const submitCheckOutForm = async () => { + if(checkOutState.checkOutForm.claimantId === null){ + ElMessage({ + type: 'warning', + message: '请选择认领人' + }) + }else{ + checkOutState.loading = true + let res = await (checkOutState.title === '单独出库' ? goodsDetailApi().checkOutBySingle(checkOutState.checkOutForm) : goodsDetailApi().checkOutByMore(checkOutState.checkOutForm)) + if(res.data.code === '200'){ + checkOutState.checkOutDialogVisible = false + emit('refreshGoodsDetail') + ElMessage({ + type: 'success', + message:'认领成功' + }) + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }) + } + checkOutState.loading = false + } +} + +const getUserByDepartment = async (value: number) => { + let res = await teamManageApi().getAllMember(value); + if (res.data.code === '200') { + checkOutState.userList = JSON.parse(JSON.stringify(res.data.data)); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } +} + +const emit = defineEmits(['refreshGoodsDetail']) + +defineExpose({ + openCheckOutDialog +}) + +</script> + +<style scoped> +:deep(.el-dialog__header) { + padding: var(--el-dialog-padding-primary); + padding-bottom: 10px; + margin-right: 16px; + word-break: break-all; + text-align: center !important; +} +</style> diff --git a/src/views/facilityManagement/goodsDetailManage/components/goodsDetailAdd.vue b/src/views/facilityManagement/goodsDetailManage/components/goodsDetailAdd.vue new file mode 100644 index 0000000..8004175 --- /dev/null +++ b/src/views/facilityManagement/goodsDetailManage/components/goodsDetailAdd.vue @@ -0,0 +1,273 @@ +<template> + <div class="system-add-menu-container"> + <el-dialog :title="goodsDetailAddState.title" :close-on-click-modal="false" v-model="goodsDetailAddState.goodsDetailAddVisible" width="30%"> + <el-form + :model="goodsDetailAddState.goodsDetailForm" + :rules="goodsDetailAddState.goodsDetailRules" + ref="goodsDetailFormRef" + size="default" + v-loading="goodsDetailAddState.loading" + element-loading-text="Loading..." + label-width="120px"> + <el-row> + <el-col :span="24" class="mb20"> + <el-form-item label="选择物资" prop="smId"> + <el-row :gutter="6"> + <el-col :span="8"> + <el-select + filterable + placeholder="请选择部门" + clearable + @change="changeDepartment" + v-model="goodsDetailAddState.depId"> + <el-option + v-for="item in goodsDetailAddState.departmentList" + :key="item.depId" + :value="item.depId" + :label="item.depName" + ></el-option> + </el-select> + </el-col> + <el-col :span="8"> + <el-select v-model="goodsDetailAddState.classifyId" placeholder="选择分类" @change="changeClassify" filterable clearable> + <el-option + v-for="item in goodsDetailAddState.classifyList" + :key="item.materialClassifyId" + :value="item.materialClassifyId" + :label="item.materialClassifyName" + ></el-option> + </el-select> + </el-col> + <el-col :span="8"> + <el-select v-model="goodsDetailAddState.goodsDetailForm.smId" placeholder="选择物资" filterable clearable> + <el-option + v-for="item in goodsDetailAddState.goodsList" + :key="item.smId" + :value="item.smId" + :label="item.materialName" + ></el-option> + </el-select> + </el-col> + </el-row> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20"> + <el-row :gutter="6"> + <el-col :span="12"> + <el-form-item label="RFID起:" prop="startRfid"> + <el-input v-model="goodsDetailAddState.RFID" placeholder="选填"> + </el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-input v-model="goodsDetailAddState.startRfid" @blur="checkLength('start')" @input="onVerifiyNumberInteger($event, 'start')" placeholder="选填"> + </el-input> + </el-col> + </el-row> + </el-col> + <el-col :span="24" class="mb20"> + <el-row :gutter="6"> + <el-col :span="12"> + <el-form-item label="RFID止:" prop="endRfid"> + <el-input v-model="goodsDetailAddState.RFID" placeholder="选填"> + </el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-input @blur="checkLength('end')" @input="onVerifiyNumberInteger($event, 'end')" v-model="goodsDetailAddState.endRfid" placeholder="选填"> + </el-input> + </el-col> + </el-row> + </el-col> + <el-col :span="24" class="mb20"> + <el-form-item label="入库数量:" prop="wareHousingCount"> + <el-input @input="onVerifiyNumberInteger($event, 'wareHousingCount')" v-model="goodsDetailAddState.goodsDetailForm.wareHousingCount" placeholder="入库总数"> + </el-input> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20"> + <el-form-item label="有效期类型:" prop="validType"> + <el-radio-group v-model="goodsDetailAddState.goodsDetailForm.validType"> + <el-radio :label="0">长期</el-radio> + <el-radio :label="1">非长期</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20" v-if="goodsDetailAddState.goodsDetailForm.validType === 1"> + <el-form-item label="有效期至:" prop="validTime"> + <el-date-picker + v-model="goodsDetailAddState.goodsDetailForm.validTime" + type="datetime" + format="YYYY-MM-DD HH:mm:ss" + value-format="YYYY-MM-DD HH:mm:ss" + placeholder="选择日期时间" + style="width: 100%" /> + </el-form-item> + </el-col> + + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="goodsDetailAddState.goodsDetailAddVisible = !goodsDetailAddState.goodsDetailAddVisible" size="default">取 消</el-button> + <el-button type="primary" @click="submitGoodsDetail" v-throttle size="default">确 定</el-button> + </span> + </template> + </el-dialog> + </div> +</template> + +<script lang="ts" setup> +import {reactive, ref, watch} from 'vue' +import { + BaseMaterialListType, + ClassificationListType, + DepartmentType, + GoodsDetailDataType, + GoodsDetailAddType +} from "/@/views/facilityManagement/goodsDetailManage/index"; +import {isValidKey} from "/@/views/facilityManagement/safetyGoodsAndEquipment/index"; +import {ElMessage} from "element-plus/es"; +import {goodsDetailApi} from "/@/api/facilityManagement/goodsDetailManage"; +import {verifiyNumberInteger, verifyString} from "/@/utils/toolsValidate"; + +const goodsDetailFormRef = ref() + +const goodsDetailAddState = reactive<GoodsDetailAddType>({ + title: '新增入库', + RFID: 'RFIDXXX', + startRfid: '', + endRfid: '', + depId: null, + loading: false, + classifyId: null, + goodsDetailAddVisible: false, + goodsDetailForm: { + id: null, + smId: null, + validType: null, + validTime: null, + startRfid: null, + endRfid: null , + wareHousingCount: null, + }, + goodsDetailRules: { + smId: [{ required: true, message: '请选择物资名称', trigger: 'change' }], + validType: [{ required: true, message: '请选择时间类型', trigger: 'change' }], + validTime: [{ required: true, message: '请选择有效时间', trigger: 'change' }], + wareHousingCount: [{ required: true, message: '请填写入库数量', trigger: 'blur' }], + }, + departmentList: [], + classifyList: [], + goodsList: [], +}) + +watch(() => [goodsDetailAddState.startRfid,goodsDetailAddState.endRfid],(newVal, oldVal) => { + if(goodsDetailAddState.startRfid.length === 8 && goodsDetailAddState.endRfid.length === 8){ + goodsDetailAddState.goodsDetailForm.wareHousingCount = Number(goodsDetailAddState.endRfid) - Number(goodsDetailAddState.startRfid) + 1 + } +},{immediate :false}); + +const openGoodsDetailAddDialog = async (title: string, value: GoodsDetailDataType, departmentList: DepartmentType []) => { + goodsDetailAddState.goodsDetailAddVisible = true; + goodsDetailAddState.departmentList = departmentList; + setTimeout(() => { + goodsDetailFormRef.value.clearValidate(); + }); + goodsDetailAddState.startRfid = '' + goodsDetailAddState.endRfid = '' + goodsDetailAddState.goodsDetailForm = { + id: null, + smId: null, + validType: null, + validTime: null, + startRfid: null, + endRfid: null , + wareHousingCount: null, + } +} + +const changeDepartment = (value: number | null) => { + goodsDetailAddState.classifyId = null + goodsDetailAddState.goodsDetailForm.smId = null + goodsDetailAddState.classifyList = goodsDetailAddState.departmentList.find(item => item.depId === value)?.classificationList as Array<ClassificationListType> +} + +const changeClassify = (value: number | null) => { + goodsDetailAddState.goodsDetailForm.smId = null + goodsDetailAddState.goodsList = goodsDetailAddState.classifyList.find(item => item.materialClassifyId === value)?.baseMaterialList as Array<BaseMaterialListType> +} + +const submitGoodsDetail = () => { + goodsDetailFormRef.value.validate(async (valid: boolean) => { + if(valid){ + goodsDetailAddState.goodsDetailForm.startRfid = `RFID${goodsDetailAddState.startRfid}` + goodsDetailAddState.goodsDetailForm.endRfid = `RFID${goodsDetailAddState.endRfid}` + goodsDetailAddState.loading = true + let res = await goodsDetailApi().addGoodsDetail(goodsDetailAddState.goodsDetailForm) + if(res.data.code === '200'){ + goodsDetailAddState.goodsDetailAddVisible = false + emit('refreshData') + ElMessage({ + type: 'success', + message: '物资新增成功', + duration: 2000 + }); + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + goodsDetailAddState.loading = false + }else{ + ElMessage({ + type: 'warning', + message: '请完善基本信息' + }) + } + }) +} + +const checkLength = (value: string) => { + if(value === 'start' && goodsDetailAddState.startRfid.length !== 8){ + ElMessage({ + type:'warning', + message: 'RFID起不符合规范,请重新填入' + }) + goodsDetailAddState.startRfid = '' + goodsDetailAddState.goodsDetailForm.wareHousingCount = null + }else if(value === 'end' && goodsDetailAddState.endRfid.length !== 8){ + ElMessage({ + type:'warning', + message: 'RFID止不符合规范,请重新填入' + }) + goodsDetailAddState.endRfid = '' + goodsDetailAddState.goodsDetailForm.wareHousingCount = null + }else{ + return + } +} + +const onVerifiyNumberInteger = (val: number, title: string) => { + if(title === 'wareHousingCount'){ + goodsDetailAddState.goodsDetailForm.wareHousingCount = Number(verifiyNumberInteger(val.toString())) === 0 ? null : Number(verifiyNumberInteger(val.toString())); + }else if(title === 'start'){ + goodsDetailAddState.startRfid = verifyString(val.toString()); + }else{ + goodsDetailAddState.endRfid = verifyString(val.toString()); + } + +}; + +const emit = defineEmits(['refreshData',]) + +defineExpose({ + openGoodsDetailAddDialog +}) + +</script> + +<style scoped> + +</style> diff --git a/src/views/facilityManagement/goodsDetailManage/components/goodsDetailEdit.vue b/src/views/facilityManagement/goodsDetailManage/components/goodsDetailEdit.vue new file mode 100644 index 0000000..3fe4fd8 --- /dev/null +++ b/src/views/facilityManagement/goodsDetailManage/components/goodsDetailEdit.vue @@ -0,0 +1,224 @@ +<template> + <div class="system-add-menu-container"> + <el-dialog :title="goodsDetailEditState.title" :close-on-click-modal="false" v-model="goodsDetailEditState.goodsDetailEditVisible" width="30%"> + <el-form + :model="goodsDetailEditState.goodsDetailForm" + :rules="goodsDetailEditState.goodsDetailRules" + ref="goodsDetailFormRef" + size="default" + v-loading="goodsDetailEditState.loading" + element-loading-text="Loading..." + label-width="120px"> + <el-row> + <el-col :span="24" class="mb20"> + <el-form-item label="选择物资" prop="smId"> + <el-row :gutter="6"> + <el-col :span="8"> + <el-select + filterable + placeholder="请选择部门" + clearable + @change="changeDepartment" + v-model="goodsDetailEditState.depId"> + <el-option + v-for="item in goodsDetailEditState.departmentList" + :key="item.depId" + :value="item.depId" + :label="item.depName" + ></el-option> + </el-select> + </el-col> + <el-col :span="8"> + <el-select v-model="goodsDetailEditState.classifyId" placeholder="选择分类" @change="changeClassify" filterable clearable> + <el-option + v-for="item in goodsDetailEditState.classifyList" + :key="item.materialClassifyId" + :value="item.materialClassifyId" + :label="item.materialClassifyName" + ></el-option> + </el-select> + </el-col> + <el-col :span="8"> + <el-select v-model="goodsDetailEditState.goodsDetailForm.smId" placeholder="选择物资" filterable clearable> + <el-option + v-for="item in goodsDetailEditState.goodsList" + :key="item.smId" + :value="item.smId" + :label="item.materialName" + ></el-option> + </el-select> + </el-col> + </el-row> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20"> + <el-form-item label="按RFID标记:" prop="rfid"> + <el-input v-model="goodsDetailEditState.goodsDetailForm.rfid" placeholder="选填"> + </el-input> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20"> + <el-form-item label="有效期类型:" prop="validType"> + <el-radio-group v-model="goodsDetailEditState.goodsDetailForm.validType"> + <el-radio :label="0">长期</el-radio> + <el-radio :label="1">非长期</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20" v-if="goodsDetailEditState.goodsDetailForm.validType === 1"> + <el-form-item label="有效期至:" prop="validTime"> + <el-date-picker + v-model="goodsDetailEditState.goodsDetailForm.validTime" + type="datetime" + format="YYYY-MM-DD HH:mm:ss" + value-format="YYYY-MM-DD HH:mm:ss" + placeholder="选择日期时间" + style="width: 100%" /> + </el-form-item> + </el-col> + + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="goodsDetailEditState.goodsDetailEditVisible = !goodsDetailEditState.goodsDetailEditVisible" size="default">取 消</el-button> + <el-button type="primary" @click="submitGoodsDetail" v-throttle size="default">确 定</el-button> + </span> + </template> + </el-dialog> + </div> +</template> + +<script lang="ts" setup> +import {reactive, ref, watch} from 'vue' +import { + BaseMaterialListType, + ClassificationListType, + DepartmentType, + GoodsDetailDataType, + GoodsDetailEditType +} from "/@/views/facilityManagement/goodsDetailManage/index"; +import {isValidKey} from "/@/views/facilityManagement/safetyGoodsAndEquipment/index"; +import {ElMessage} from "element-plus/es"; +import {goodsDetailApi} from "/@/api/facilityManagement/goodsDetailManage"; + +const goodsDetailFormRef = ref() + +const goodsDetailEditState = reactive<GoodsDetailEditType>({ + title: '编辑', + depId: null, + loading: false, + classifyId: null, + goodsDetailEditVisible: false, + goodsDetailForm: { + id: null, + smId: null, + rfid: null, + validType: null, + validTime: null, + }, + goodsDetailRules: { + smId: [{ required: true, message: '请选择物资名称', trigger: 'change' }], + validType: [{ required: true, message: '请选择时间类型', trigger: 'change' }], + validTime: [{ required: true, message: '请选择有效时间', trigger: 'change' }], + }, + departmentList: [], + classifyList: [], + goodsList: [], +}) + +// watch(() => goodsDetailEditState.depId ,(newVal, oldVal) => { +// debugger +// goodsDetailEditState.classify = null +// goodsDetailEditState.goodsDetailForm.smId = null +// goodsDetailEditState.classifyList = goodsDetailEditState.departmentList.find(item => item.depId === newVal)?.classificationList as Array<ClassificationListType> +// },{immediate :false}); + +const openGoodsDetailEditDialog = async (title: string, value: GoodsDetailDataType, departmentList: DepartmentType []) => { + goodsDetailEditState.goodsDetailEditVisible = true; + goodsDetailEditState.departmentList = departmentList; + setTimeout(() => { + goodsDetailFormRef.value.clearValidate(); + }); + await changeDepartment(value.depId) + await changeClassify(value.bigClassifyId) + goodsDetailEditState.depId = value.depId + goodsDetailEditState.classifyId = value.bigClassifyId + for(let i in goodsDetailEditState.goodsDetailForm){ + if(isValidKey(i, goodsDetailEditState.goodsDetailForm)) { + goodsDetailEditState.goodsDetailForm[i] = value[i]; + } + } + + +} + +const changeDepartment = (value: number | null) => { + goodsDetailEditState.classifyId = null + goodsDetailEditState.goodsDetailForm.smId = null + goodsDetailEditState.classifyList = goodsDetailEditState.departmentList.find(item => item.depId === value)?.classificationList as Array<ClassificationListType> +} + +const changeClassify = (value: number | null) => { + goodsDetailEditState.goodsDetailForm.smId = null + goodsDetailEditState.goodsList = goodsDetailEditState.classifyList.find(item => item.materialClassifyId === value)?.baseMaterialList as Array<BaseMaterialListType> +} + +const submitGoodsDetail = () => { + goodsDetailFormRef.value.validate(async (valid: boolean) => { + if(valid){ + goodsDetailEditState.loading = true + if(goodsDetailEditState.title === '新增入库') { + let res = await goodsDetailApi().addGoodsDetail(goodsDetailEditState.goodsDetailForm) + if(res.data.code === '200'){ + goodsDetailEditState.goodsDetailEditVisible = false + emit('refreshData') + ElMessage({ + type: 'success', + message: '物资新增成功', + duration: 2000 + }); + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + }else{ + let res = await goodsDetailApi().updateGoodsDetail(goodsDetailEditState.goodsDetailForm) + if(res.data.code === '200'){ + goodsDetailEditState.goodsDetailEditVisible = false + emit('refreshData') + ElMessage({ + type: 'success', + message: '物资编辑成功', + duration: 2000 + }); + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + } + goodsDetailEditState.loading = false + }else{ + ElMessage({ + type: 'warning', + message: '请完善基本信息' + }) + } + }) +} + +const emit = defineEmits(['refreshData',]) + +defineExpose({ + openGoodsDetailEditDialog +}) + +</script> + +<style scoped> + +</style> diff --git a/src/views/facilityManagement/goodsDetailManage/index.ts b/src/views/facilityManagement/goodsDetailManage/index.ts new file mode 100644 index 0000000..12aedfd --- /dev/null +++ b/src/views/facilityManagement/goodsDetailManage/index.ts @@ -0,0 +1,101 @@ +export interface GoodsDetailStateType { + goodsDetailData: GoodsDetailDataType []; + departmentList: DepartmentType []; + irStatusList: Type []; + listQuery:{ + pageSize: number; + pageIndex: number; + searchParams: { + irStatus: number | null; + rfid: string | null; + smId: number | null; + } + }, + checkOutQuery: { + id: null | number; + claimantId: null | boolean; + }; + checkInQuery: { + id?: null | number; + ids?: Array<number>; + }; + checkOutNames: string; + total: number; +} + +export interface GoodsDetailEditType { + title: string; + depId: null | number; + loading: boolean; + classifyId: null | number; + goodsDetailEditVisible?: boolean; + goodsDetailForm: GoodsDetailEditFormType; + goodsDetailRules: {}; + departmentList: DepartmentType []; + classifyList: Array<ClassificationListType>; + goodsList: Array<BaseMaterialListType>; +} + +export interface GoodsDetailAddType extends GoodsDetailEditType{ + goodsDetailAddVisible: boolean; + RFID: string; + startRfid: string; + endRfid: string; +} + +export interface GoodsDetailEditFormType { + id: null | number; + rfid?: null | string; + startRfid?: null | string; + endRfid?: null | string; + wareHousingCount?: null | number; + smId: null | number; + validType: null | number; + validTime: null | string; +} + +export interface GoodsDetailDataType extends GoodsDetailEditFormType{ + name: string | null; + depId: null | number; + bigClassifyId: null | number; +} + +export interface Type { + id: number; + name: string; +} + +export interface DepartmentType { + depId: number; + depName: string; + classificationList: Array<ClassificationListType>; +} + +export interface ClassificationListType { + baseMaterialList: Array<BaseMaterialListType>; + materialClassifyId: number; + materialClassifyName: string; +} + +export interface BaseMaterialListType { + materialName: string; + smId: number; +} + + +export interface checkOutStateType { + title: string; + loading: boolean; + checkOutDialogVisible: boolean; + materialName: string; + checkOutForm: { + id?: null | number; + claimantId: null | number; + ids?: Array<number>; + }; + // checkOutMoreForm: { + // ids: Array<number>; + // claimantId: null | boolean; + // } + userList: [] +} diff --git a/src/views/facilityManagement/goodsDetailManage/index.vue b/src/views/facilityManagement/goodsDetailManage/index.vue new file mode 100644 index 0000000..7f20b7d --- /dev/null +++ b/src/views/facilityManagement/goodsDetailManage/index.vue @@ -0,0 +1,444 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <el-row class="homeCard"> + <div class="basic-line"> + <span>在库状态:</span> + <el-select class="input-box" v-model="goodsDetailState.listQuery.searchParams.irStatus" placeholder="请选择在库状态" clearable filterable> + <el-option + v-for="item in goodsDetailState.irStatusList" + :key="item.id" + :value="item.id" + :label="item.name" + > + </el-option> + </el-select> + </div> + <div class="basic-line"> + <span>rfid:</span> + <el-input class="input-box" v-model="goodsDetailState.listQuery.searchParams.rfid" placeholder="rfid" clearable> </el-input> + </div> + + <div style="padding-bottom: 10px"> + <el-button size="large" type="primary" class="ml10" v-throttle @click="refreshGoodsDetailData"> + <el-icon> + <ele-Search /> + </el-icon> + 查询 + </el-button> + </div> + </el-row> + <div class="homeCard"> + <el-row class="cardTop"> + <el-col :span="12" class="mainCardBtn"> + <el-button type="primary" size="default" @click="openGoodsDetailAdd('新增入库','')">新增入库</el-button> + <el-button type="danger" size="default" @click="deleteBatchGoodsDetail('批量删除','')">批量删除</el-button> + <el-button type="warning" size="default" @click="checkInAndOut('批量出库','')">批量出库</el-button> + <el-button type="success" size="default" @click="checkInAndOut('批量重新入库','')">批量重新入库</el-button> + </el-col> + </el-row> + <div class="main-card"> + <el-table + :data="goodsDetailState.goodsDetailData" + 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 prop="materialNo" label="物资编号" show-overflow-tooltip></el-table-column> + <el-table-column prop="bigClassifyName" label="分类" show-overflow-tooltip></el-table-column> + <el-table-column prop="depName" label="仓库/部门" show-overflow-tooltip></el-table-column> + <el-table-column prop="name" label="物资名称" show-overflow-tooltip></el-table-column> + <el-table-column prop="rfid" label="绑定RFID" show-overflow-tooltip></el-table-column> + <el-table-column prop="consumableName" label="是否是耗材" show-overflow-tooltip></el-table-column> + <el-table-column prop="validTypeName" label="保质期" show-overflow-tooltip></el-table-column> + <el-table-column prop="irStatusName" label="当前状态" show-overflow-tooltip></el-table-column> + <el-table-column prop="wareHousingTime" label="入库时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="deliveryTime" label="出库时间" show-overflow-tooltip></el-table-column> + <el-table-column prop="validStatusName" label="有效" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="250" align="center"> + <template #default="scope"> + <el-button size="small" text type="primary" :icon="Edit" @click="openGoodsDetailEdit('编辑', scope.row)">编辑</el-button> + <el-button v-if="scope.row.irStatus === 1" size="small" text type="success" :icon="Edit" @click="checkInAndOut('重新入库', scope.row)">重新入库</el-button> + <el-button v-if="scope.row.irStatus === 0" size="small" text type="warning" :icon="Edit" @click="checkInAndOut('单独出库', scope.row)">单独出库</el-button> + <el-button size="small" text type="danger" :icon="Delete" @click="deleteSingleGoodsDetail(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + <br /> + <el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" :pager-count="5" :page-sizes="[10, 20, 30]" v-model:current-page="goodsDetailState.listQuery.pageIndex" background v-model:page-size="goodsDetailState.listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="goodsDetailState.total" class="page-position"> </el-pagination> + </div> + </div> + </div> + <goods-detail-edit ref="goodsDetailEditRef" @refreshData="initGoodsDetailData"></goods-detail-edit> + <goods-detail-add ref="goodsDetailAddRef" @refreshData="initGoodsDetailData"></goods-detail-add> + <check-out ref="checkOutRef" @refreshGoodsDetail="initGoodsDetailData"></check-out> + </div> +</template> + +<script setup lang="ts"> +import {onMounted, reactive, ref} from 'vue' +import { Edit, Delete, } from '@element-plus/icons-vue'; +import {ElMessage, ElMessageBox} from "element-plus"; +import { + GoodsDetailDataType, + GoodsDetailStateType +} from "/@/views/facilityManagement/goodsDetailManage/index"; +import {goodsDetailApi} from "/@/api/facilityManagement/goodsDetailManage"; +import { useRoute } from "vue-router"; +import GoodsDetailEdit from './components/goodsDetailEdit.vue' +import CheckOut from "/@/views/facilityManagement/goodsDetailManage/components/checkOut.vue"; +import GoodsDetailAdd from "/@/views/facilityManagement/goodsDetailManage/components/goodsDetailAdd.vue"; + +const route = useRoute() +const goodsDetailEditRef = ref() +const goodsDetailAddRef = ref() +const checkOutRef = ref() + +const goodsDetailState = reactive<GoodsDetailStateType>({ + goodsDetailData:[], + departmentList:[], + irStatusList:[{id: 0, name:'在库'}, {id: 1, name:'已出库'}], + listQuery:{ + pageSize: 10, + pageIndex: 1, + searchParams: { + irStatus: null, + rfid: null, + smId: null + } + }, + checkOutQuery: { + id: null, + claimantId: null, + }, + checkInQuery: { + ids: [], + }, + checkOutNames: '', + total:0, +}) + +const initGoodsDetailData = async () => { + let res = await goodsDetailApi().getGoodsDetailList(goodsDetailState.listQuery) + if(res.data.code === '200'){ + goodsDetailState.goodsDetailData = res.data.data; + goodsDetailState.total = res.data.total; + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } +}; + +const openGoodsDetailEdit = (title: string, value: GoodsDetailDataType) => { + goodsDetailEditRef.value.openGoodsDetailEditDialog(title, value, goodsDetailState.departmentList) +}; + +const openGoodsDetailAdd = (title: string, value: GoodsDetailDataType) => { + goodsDetailAddRef.value.openGoodsDetailAddDialog(title, value, goodsDetailState.departmentList) +}; + +const checkInAndOut = (title: string, value:GoodsDetailDataType) => { + if(title === '重新入库'){ + goodsDetailState.checkInQuery = {} + goodsDetailState.checkInQuery.id = value.id + ElMessageBox.confirm(`此操作将重新入库:“${value.name}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await goodsDetailApi().checkInOne(goodsDetailState.checkInQuery); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + duration: 2000, + message: '重新入库成功' + }); + await initGoodsDetailData(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch(() => {}); + }else if(title === '批量重新入库'){ + if(goodsDetailState.checkInQuery.ids?.length){ + ElMessageBox.confirm(`此操作将把所选中全部重新入库,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await goodsDetailApi().checkInMore(goodsDetailState.checkInQuery); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + duration: 2000, + message: '批量重新入库成功' + }); + await initGoodsDetailData(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch(() => {}); + }else{ + ElMessage({ + type:'warning', + message: '请选择要批量重新入库的物资' + }) + } + }else if(title ==='单独出库'){ + checkOutRef.value.openCheckOutDialog(title, value, [], null); + }else{ + if(goodsDetailState.checkInQuery.ids?.length){ + checkOutRef.value.openCheckOutDialog(title, null, goodsDetailState.checkInQuery.ids, goodsDetailState.checkOutNames); + }else{ + ElMessage({ + type:'warning', + message: '请选择要出库的物资' + }) + } + } +} + +const handleSelectionChange = (val: Array<GoodsDetailDataType>) => { + goodsDetailState.checkInQuery.ids = val.map((item) => { + return item.id; + }) as Array<number>; + goodsDetailState.checkOutNames = val.map((item) => { + return item.name + }).join(',') +}; + +const getGoodsByLevel = async () => { + let res = await goodsDetailApi().getGoodsListByLevel(); + if (res.data.code === '200') { + goodsDetailState.departmentList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } +}; + +const deleteSingleGoodsDetail = (row: any) => { + ElMessageBox.confirm(`此操作将永久删除该物资:“${row.name}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await goodsDetailApi().deleteSingleGoods({ id: row.id }); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + duration: 2000, + message: '删除成功' + }); + await initGoodsDetailData(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch(() => {}); +}; + +const deleteBatchGoodsDetail = (row: any) => { + ElMessageBox.confirm(`此操作将永久删除这些物资,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await goodsDetailApi().deleteBatchGoods({ ids: goodsDetailState.checkInQuery.ids }); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + duration: 2000, + message: '删除成功' + }); + await initGoodsDetailData(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch(() => {}); +}; + +const refreshGoodsDetailData = () => { + initGoodsDetailData(); +}; +// 分页改变 +const onHandleSizeChange = (val: number) => { + goodsDetailState.listQuery.pageSize = val; + initGoodsDetailData(); +}; +// 分页改变 +const onHandleCurrentChange = (val: number) => { + goodsDetailState.listQuery.pageIndex = val; + initGoodsDetailData(); +}; + +// const getDepartmentData = async () => { +// let res = await departmentApi().getDepartmentList(); +// if (res.data.code === '200') { +// goodsDetailState.departmentList = res.data.data; +// } else { +// ElMessage({ +// type: 'warning', +// message: res.data.msg +// }); +// } +// }; + +onMounted(() => { + goodsDetailState.listQuery.searchParams.smId = (Number(route.query.id) || null) + initGoodsDetailData(); + // getDepartmentData(); + getGoodsByLevel(); +}) +</script> + +<style scoped lang="scss"> +$homeNavLengh: 8; +.home-container { + height: calc(100vh - 144px); + box-sizing: border-box; + overflow: hidden; + .homeCard { + width: 100%; + padding: 20px; + box-sizing: border-box; + background: #fff; + border-radius: 4px; + + .main-card { + width: 100%; + height: 100%; + .cardTop { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + .mainCardBtn { + margin: 0; + } + } + .pageBtn { + height: 60px; + display: flex; + align-items: center; + justify-content: right; + + .demo-pagination-block + .demo-pagination-block { + margin-top: 10px; + } + .demo-pagination-block .demonstration { + margin-bottom: 16px; + } + } + } + &:last-of-type { + height: calc(100% - 100px); + } + } + .el-row { + display: flex; + align-items: center; + margin-bottom: 20px; + &:last-child { + margin-bottom: 0; + } + .grid-content { + align-items: center; + min-height: 36px; + } + + .topInfo { + display: flex; + align-items: center; + font-size: 16px; + font-weight: bold; + + & > div { + white-space: nowrap; + margin-right: 20px; + } + } + } +} +.stepItem { + width: 100%; + display: flex; + align-items: flex-start; + margin-bottom: 30px; + margin-left: 30px; + padding-bottom: 30px; + border-left: 2px solid #ccc; + &:first-of-type { + margin-top: 30px; + } + &:last-of-type { + margin-bottom: 0; + border-left: none; + } + .stepNum { + width: 30px; + height: 30px; + border-radius: 15px; + box-sizing: border-box; + color: #333; + border: 1px solid #999; + line-height: 28px; + text-align: center; + margin-right: 10px; + margin-left: -16px; + margin-top: -30px; + } + .stepCard { + width: 100%; + margin-top: -30px; + + .box-card { + width: 100%; + &:deep(.el-card__header) { + padding: 10px 15px; + } + .card-header { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + & > div:first-of-type { + margin-right: 80px; + font-size: 18px; + font-weight: bold; + } + } + } + } + &:hover .card-header { + color: #0098f5; + } + &:hover .stepNum { + border: 2px solid #0098f5; + color: #0098f5; + } +} +</style> diff --git a/src/views/facilityManagement/safetyGoodsAndEquipment/components/addGoodsDialog.vue b/src/views/facilityManagement/safetyGoodsAndEquipment/components/addGoodsDialog.vue new file mode 100644 index 0000000..eb05a5f --- /dev/null +++ b/src/views/facilityManagement/safetyGoodsAndEquipment/components/addGoodsDialog.vue @@ -0,0 +1,267 @@ +<template> + <div class="system-add-menu-container"> + <el-dialog :title="addGoodsState.title" :close-on-click-modal="false" v-model="addGoodsState.showAddGoodsDialog" width="50%"> + <el-tabs class="active" v-model="addGoodsState.activeName"> + <el-tab-pane label="物资信息" name="goodsInformation"> + <div class="filter-container" style="padding-bottom: 20px"> + <el-button size="default" type="primary" @click="onOpenGoodsClassifyDialog('新增', '')"> + <el-icon> + <ele-FolderAdd /> + </el-icon> + 新增分类 + </el-button> + </div> + + <el-table + :data="addGoodsState.goodsData" + border fit highlight-current-row lazy + row-key="id" + :load="load" + :row-class-name="tableRowClassName" + :header-cell-style="{ background: '#fafafa' }" + :tree-props="{ children: 'childList', hasChildren: true }" + style="width: 100%"> + <el-table-column prop="materialClassifyName" label="分类名称" show-overflow-tooltip align="center"/> + <el-table-column prop="materialClassifyName" label="类别" show-overflow-tooltip align="center"> + <template #default="scope"> + <div v-if="scope.row.parentId === 0">{{'分类名称'}}</div> + <div v-if="scope.row.parentId !== 0">{{'物资名称'}}</div> + </template> + </el-table-column> + <el-table-column label="操作" width="150" align="center"> + <template #default="scope"> + <el-button v-if="scope.row.parentId === 0" size="small" text type="primary" @click="onOpenGoodsClassifyDialog('新增物资', scope.row)"> + <el-icon> + <ele-FolderAdd /> + </el-icon> + 新增物资 + </el-button> + <el-button size="small" text type="primary" :icon="Edit" @click="onOpenGoodsClassifyDialog('编辑', scope.row)">编辑</el-button> + <el-button size="small" text type="danger" :icon="Delete" @click="deleteGoodsClassify(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + <el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" :pager-count="5" :page-sizes="[5, 10, 20]" v-model:current-page="addGoodsState.listQuery.pageIndex" background v-model:page-size="addGoodsState.listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="addGoodsState.total" class="page-position" style="padding-top: 20px;"> </el-pagination> + </el-tab-pane> + </el-tabs> + </el-dialog> + <el-dialog :title="addGoodsState.goodsClassifyTitle" :close-on-click-modal="false" v-model="addGoodsState.showAddGoodsClassifyDialog" width="30%"> + <el-form + :model="addGoodsState.goodsClassifyForm" + :rules="addGoodsState.goodsClassifyRules" + ref="goodsClassifyRef" + size="default" + label-width="120px"> + <el-row> + <el-col :span="24" class="mb20" v-if="!addGoodsState.goodsClassifyForm.parentId"> + <el-form-item label="分类名称" prop="materialClassifyName"> + <el-input v-model="addGoodsState.goodsClassifyForm.materialClassifyName" placeholder="输入分类名称" class="input-add"> + </el-input> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20" v-if="addGoodsState.goodsClassifyForm.parentId"> + <el-form-item label="物资名称" prop="materialClassifyName"> + <el-input v-model="addGoodsState.goodsClassifyForm.materialClassifyName" placeholder="输入物资名称" class="input-add"> + </el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="addGoodsState.showAddGoodsClassifyDialog = !addGoodsState.showAddGoodsClassifyDialog" size="default">取 消</el-button> + <el-button type="primary" @click="submitGoodsClassify" v-throttle size="default">确 定</el-button> + </span> + </template> + </el-dialog> + </div> +</template> + +<script setup lang="ts"> +import {computed, nextTick, onMounted, reactive, ref, watch} from 'vue' +import { Edit, Delete, } from '@element-plus/icons-vue'; +import {AddGoodsStateType, BigClassifyType} from "/@/views/facilityManagement/safetyGoodsAndEquipment/index"; +import {mount} from "sortablejs"; +import {goodsAndEquipmentApi} from "/@/api/facilityManagement/safetyGoodsAndEquipment"; +import {ElMessage, valueEquals} from "element-plus/es"; +import {ElMessageBox} from "element-plus"; +import {inspectTaskApi} from "/@/api/intellectInspectSystem/inspectTask"; + +const addGoodsState = reactive<AddGoodsStateType>({ + title:'', + goodsClassifyTitle:'', + showAddGoodsDialog: false, + showAddGoodsClassifyDialog: false, + activeName: 'goodsInformation', + goodsData: [], + goodsBigClassifyList: [], + total:0, + listQuery:{ + pageSize: 5, + pageIndex: 1, + searchParams: { + classifyName:'' + } + }, + goodsClassifyForm: { + id: null, + materialClassifyName: '', + parentId: null, + }, + goodsClassifyRules: { + + }, +}); + +const openAddGoodsDialog = (goodsBigClassifyList: BigClassifyType []) => { + addGoodsState.showAddGoodsDialog = true + addGoodsState.goodsBigClassifyList = goodsBigClassifyList + getGoodsClassifyDataByPage() +} + +const onOpenGoodsClassifyDialog = (title: string, value:BigClassifyType ) => { + addGoodsState.showAddGoodsClassifyDialog = true + addGoodsState.goodsClassifyForm = { + id: null, + materialClassifyName: '', + parentId: null, + } + if(title === '新增') { + addGoodsState.goodsClassifyTitle = '新增分类' + }else if(title === '新增物资'){ + addGoodsState.goodsClassifyTitle = `新增${value.materialClassifyName}` + addGoodsState.goodsClassifyForm.parentId = value.id + } else if(title === '编辑' && value.parentId === 0){ + addGoodsState.goodsClassifyTitle = '编辑分类' + addGoodsState.goodsClassifyForm = { + id: value.id, + materialClassifyName: value.materialClassifyName, + parentId: null, + } + }else { + addGoodsState.goodsClassifyTitle = `编辑${addGoodsState.goodsBigClassifyList.find(item => item.id === value.parentId)?.materialClassifyName as string}` + addGoodsState.goodsClassifyForm.parentId = addGoodsState.goodsBigClassifyList.find(item => item.id === value.parentId)?.id as number + addGoodsState.goodsClassifyForm.materialClassifyName = value.materialClassifyName + addGoodsState.goodsClassifyForm.id = value.id + } +} + +const submitGoodsClassify = async () => { + if(addGoodsState.goodsClassifyTitle.substring(0,2) === '新增'){ + let res = await goodsAndEquipmentApi().addGoodsClassify(addGoodsState.goodsClassifyForm); + if(res.data.code === '200'){ + addGoodsState.showAddGoodsClassifyDialog = false; + await getGoodsClassifyDataByPage(); + ElMessage({ + type: 'success', + message: '新增成功', + duration: 2000 + }); + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + }else{ + let res = await goodsAndEquipmentApi().updateGoodsClassify(addGoodsState.goodsClassifyForm); + if(res.data.code === '200'){ + addGoodsState.showAddGoodsClassifyDialog = false; + await getGoodsClassifyDataByPage(); + ElMessage({ + type: 'success', + message: '编辑成功', + duration: 2000 + }); + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + } +}; + +const deleteGoodsClassify = (row: BigClassifyType) => { + ElMessageBox.confirm(`此操作将永久删除该:“${row.materialClassifyName}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await goodsAndEquipmentApi().deleteGoodsClassify({ id: row.id }); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + duration: 2000, + message: '删除成功' + }); + await getGoodsClassifyDataByPage(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch(() => {}); +}; + +const getGoodsClassifyDataByPage = async () => { + let res = await goodsAndEquipmentApi().getAllSafetyEquipmentByPage(addGoodsState.listQuery); + if(res.data.code === '200'){ + addGoodsState.goodsData = res.data.data + addGoodsState.total = res.data.total + }else{ + ElMessage({ + message:res.data.msg, + type:'warning' + }) + } +} + +const tableRowClassName = ( row: {rowIndex: number, row: BigClassifyType } ) => { + if (row.row.parentId === 0) { + return 'big-row'; + } else{ + return 'small-row'; + } +} + +const onHandleSizeChange = (val: number) => { + addGoodsState.listQuery.pageSize = val + getGoodsClassifyDataByPage() +} + +const onHandleCurrentChange = (val: number) => { + addGoodsState.listQuery.pageIndex = val + getGoodsClassifyDataByPage() +} + +const load = ( + row: BigClassifyType, + treeNode: unknown, + resolve: (date: BigClassifyType[]) => void +) => { + setTimeout(() => { + resolve([]) + }, 1000) +} + +defineExpose({ + openAddGoodsDialog, +}); + + +</script> + +<style scoped> +/*:deep(.el-overlay .el-overlay-dialog .el-dialog .el-dialog__body) {*/ +/* padding-bottom: 20px !important;*/ +/*}*/ +:deep(.el-table .big-row) { + font-size: 16px !important; + font-weight: 700; +} + +</style> diff --git a/src/views/facilityManagement/safetyGoodsAndEquipment/components/batchInStorage.vue b/src/views/facilityManagement/safetyGoodsAndEquipment/components/batchInStorage.vue new file mode 100644 index 0000000..1274271 --- /dev/null +++ b/src/views/facilityManagement/safetyGoodsAndEquipment/components/batchInStorage.vue @@ -0,0 +1,144 @@ +<template> + <div> + <el-dialog :title="batchInStorageState.title" :close-on-click-modal="false" v-model="batchInStorageState.batchInStorageDialogVisible" width="30%"> + <el-form + :model="batchInStorageState.inStorageData" + :rules="batchInStorageState.inStorageDataRules" + ref="inStorageDataRef" + size="default" + v-loading="batchInStorageState.loading" + element-loading-text="Loading..." + label-width="150px"> + <el-row> + <el-col :span="24" class="mb20"> + <el-form-item label="当前所选物资/设备:"> + <el-input v-model="batchInStorageState.materialName" :readonly="true" class="input-add"> + </el-input> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20"> + <el-form-item label="按RFID标记:" prop="rfid"> + <el-input v-model="batchInStorageState.inStorageData.rfid" placeholder="选填" class="input-add"> + </el-input> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20"> + <el-form-item label="入库数量:" prop="wareHousingCount"> + <el-input @input="onVerifiyNumberInteger($event, 'noticeTime')" v-model="batchInStorageState.inStorageData.wareHousingCount" placeholder="输入入库数量" class="input-add"> + </el-input> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20"> + <el-form-item label="有效期类型:" prop="validType"> + <el-radio-group v-model="batchInStorageState.inStorageData.validType"> + <el-radio :label="0">长期</el-radio> + <el-radio :label="1">非长期</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20" v-if="batchInStorageState.inStorageData.validType === 1"> + <el-form-item label="有效期至:" prop="validTime"> + <el-date-picker + v-model="batchInStorageState.inStorageData.validTime" + format="YYYY-MM-DD" + value-format="YYYY-MM-DD" + placeholder="选择日期时间" + style="width: 90%" /> + </el-form-item> + </el-col> + + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button :disabled="batchInStorageState.loading" @click="batchInStorageState.batchInStorageDialogVisible = !batchInStorageState.batchInStorageDialogVisible" size="default">取 消</el-button> + <el-button :disabled="batchInStorageState.loading" type="primary" @click="submitInStorageData" v-throttle size="default">确 定</el-button> + </span> + </template> + </el-dialog> + </div> +</template> + +<script setup lang="ts"> +import { reactive, ref} from 'vue' +import {BatchInStorageStateType, DataType} from "/@/views/facilityManagement/safetyGoodsAndEquipment/index"; +import {verifiyNumberInteger} from "/@/utils/toolsValidate"; +import {ElMessage} from "element-plus"; +import { goodsAndEquipmentApi } from '../../../../api/facilityManagement/safetyGoodsAndEquipment/index' + +const inStorageDataRef = ref() + +const batchInStorageState = reactive<BatchInStorageStateType>({ + title: '批量入库', + loading: false, + materialName: '', + batchInStorageDialogVisible: false, + inStorageData:{ + smId: null, + wareHousingCount: null, + validType: null, + validTime: null, + rfid: null, + }, + inStorageDataRules: { + wareHousingCount: [{ required: true, message: '请填写物资数量', trigger: 'blur' }], + validType: [{ required: true, message: '请选择有效期类型', trigger: 'change' }], + validTime: [{ required: true, message: '请选择有效期至', trigger: 'change' }], + }, +}) + +const openBatchInStorageDialog = (value: DataType) => { + batchInStorageState.batchInStorageDialogVisible = true + batchInStorageState.inStorageData.smId = value.id + batchInStorageState.materialName = value.materialName +} + +const submitInStorageData = () => { + inStorageDataRef.value.validate(async (valid: boolean) => { + if(valid){ + batchInStorageState.loading = true; + let res = await goodsAndEquipmentApi().batchInStorageGoods(batchInStorageState.inStorageData); + if(res.data.code === '200'){ + batchInStorageState.batchInStorageDialogVisible = false; + emit('refreshData') + ElMessage({ + type: 'success', + message: '入库成功', + duration: 2000 + }); + }else{ + ElMessage({ + type: 'warning', + message:res.data.msg + }); + } + batchInStorageState.loading = false + }else{ + ElMessage({ + type: 'warning', + message: '请完善基本信息' + }); + } + }); +}; + +const emit = defineEmits(['refreshData',]); + +defineExpose({ + openBatchInStorageDialog, +}) + +const onVerifiyNumberInteger = (val: number, title: string) => { + batchInStorageState.inStorageData.wareHousingCount = Number(verifiyNumberInteger(val.toString())) === 0 ? null : Number(verifiyNumberInteger(val.toString())); +}; +</script> + +<style scoped> +:deep(.el-dialog__header) { + padding: var(--el-dialog-padding-primary); + padding-bottom: 10px; + margin-right: 16px; + word-break: break-all; + text-align: center !important; +} +</style> diff --git a/src/views/facilityManagement/safetyGoodsAndEquipment/components/batchOutStorage.vue b/src/views/facilityManagement/safetyGoodsAndEquipment/components/batchOutStorage.vue new file mode 100644 index 0000000..b1e4873 --- /dev/null +++ b/src/views/facilityManagement/safetyGoodsAndEquipment/components/batchOutStorage.vue @@ -0,0 +1,154 @@ +<template> + <div> + <el-dialog :title="batchOutStorageState.title" :close-on-click-modal="false" v-model="batchOutStorageState.batchOutStorageDialogVisible" width="30%"> + <el-form + :model="batchOutStorageState.outStorageData" + :rules="batchOutStorageState.outStorageDataRules" + ref="outStorageDataRef" + size="default" + v-loading="batchOutStorageState.loading" + element-loading-text="Loading..." + label-width="150px"> + <el-row> + <el-col :span="24" class="mb20"> + <el-form-item label="当前所选物资/设备:"> + <el-input v-model="batchOutStorageState.materialName" :readonly="true" class="input-add"> + </el-input> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20"> + <el-form-item label="按RFID标记:" prop="rfid"> + <el-input v-model="batchOutStorageState.outStorageData.rfid" placeholder="选填" class="input-add"> + </el-input> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20"> + <el-form-item label="出库数量:" prop="count"> + <el-input @Output="onVerifiyNumberInteger($event, 'noticeTime')" v-model="batchOutStorageState.outStorageData.count" placeholder="输入出库数量" class="input-add"> + </el-input> + </el-form-item> + </el-col> + <el-col :span="24" class="mb20"> + <el-form-item label="认领人:" prop="claimantId"> + <el-select class="input-add" v-model="batchOutStorageState.outStorageData.claimantId" placeholder="选择认领人"> + <el-option + v-for="item in batchOutStorageState.userList" + :key="item.uid" + :value="item.uid" + :label="item.realName" + ></el-option> + </el-select> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button :disabled="batchOutStorageState.loading" @click="batchOutStorageState.batchOutStorageDialogVisible = !batchOutStorageState.batchOutStorageDialogVisible" size="default">取 消</el-button> + <el-button :disabled="batchOutStorageState.loading" type="primary" @click="submitOutStorageData" v-throttle size="default">确 定</el-button> + </span> + </template> + </el-dialog> + </div> +</template> + +<script setup lang="ts"> +import {onMounted, reactive, ref} from 'vue' +import {BatchOutStorageStateType, DataType} from "/@/views/facilityManagement/safetyGoodsAndEquipment/index"; +import {verifiyNumberInteger} from "/@/utils/toolsValidate"; +import {ElMessage} from "element-plus"; +import { goodsAndEquipmentApi } from '../../../../api/facilityManagement/safetyGoodsAndEquipment/index' +import {teamManageApi} from "/@/api/systemManage/basicDateManage/personShiftManage/teamManage"; + +const outStorageDataRef = ref() + +const batchOutStorageState = reactive<BatchOutStorageStateType>({ + title: '批量出库', + loading: false, + materialName: '', + batchOutStorageDialogVisible: false, + outStorageData:{ + smId: null, + count: null, + claimantId: null, + rfid: null, + }, + outStorageDataRules: { + count: [{ required: true, message: '请填写出库数量', trigger: 'blur' }], + claimantId: [{ required: true, message: '请选择认领人', trigger: 'change' }], + }, + userList: [], +}) + +const openBatchOutStorageDialog = (value: DataType) => { + batchOutStorageState.batchOutStorageDialogVisible = true + batchOutStorageState.outStorageData.smId = value.id + batchOutStorageState.materialName = value.materialName +} + +const submitOutStorageData = () => { + outStorageDataRef.value.validate(async (valid: boolean) => { + if(valid){ + batchOutStorageState.loading = true; + let res = await goodsAndEquipmentApi().batchOutStorageGoods(batchOutStorageState.outStorageData); + if(res.data.code === '200'){ + batchOutStorageState.batchOutStorageDialogVisible = false; + emit('refreshData') + ElMessage({ + type: 'success', + message: '出库成功', + duration: 2000 + }); + }else{ + ElMessage({ + type: 'warning', + message:res.data.msg + }); + } + batchOutStorageState.loading = false + }else{ + ElMessage({ + type: 'warning', + message: '请完善基本信息' + }); + } + }); +}; + +const emit = defineEmits(['refreshData',]); + +defineExpose({ + openBatchOutStorageDialog, +}) + +const onVerifiyNumberInteger = (val: number, title: string) => { + batchOutStorageState.outStorageData.count = Number(verifiyNumberInteger(val.toString())) === 0 ? null : Number(verifiyNumberInteger(val.toString())); + +}; + +const getUserByDepartment = async () => { + let res = await teamManageApi().getAllMember(1); + if (res.data.code === '200') { + batchOutStorageState.userList = JSON.parse(JSON.stringify(res.data.data)); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } +} + +onMounted(() => { + getUserByDepartment() +}) +</script> + +<style scoped> +:deep(.el-dialog__header) { + paddOutg: var(--el-dialog-padding-primary); + paddOutg-bottom: 10px; + margOut-right: 16px; + word-break: break-all; + text-align: center !important; +} +</style> diff --git a/src/views/facilityManagement/safetyGoodsAndEquipment/components/safetyGoodsAndEquipmentDialog.vue b/src/views/facilityManagement/safetyGoodsAndEquipment/components/safetyGoodsAndEquipmentDialog.vue new file mode 100644 index 0000000..4ace281 --- /dev/null +++ b/src/views/facilityManagement/safetyGoodsAndEquipment/components/safetyGoodsAndEquipmentDialog.vue @@ -0,0 +1,221 @@ +<template> + <div class="system-add-menu-container"> + <el-dialog :title="dialogState.title" :close-on-click-modal="false" v-model="dialogState.showSafetyGoodsAndEquipmentDialog" width="600px"> + <el-form + :model="dialogState.safetyGoodsAndEquipmentForm" + :rules="dialogState.safetyGoodsAndEquipmentRules" + ref="safetyGoodsAndEquipmentRef" + size="default" + v-loading="dialogState.loading" + element-loading-text="Loading..." + label-width="120px"> + <el-row> + <el-col :span="18" class="mb20"> + <el-form-item label="物资大类" prop="bigClassifyId"> + <el-select v-model="dialogState.safetyGoodsAndEquipmentForm.bigClassifyId" @change="changeSmallClassify(null)" placeholder="物资大类" class="input-add"> + <el-option + v-for="item in dialogState.goodsBigClassifyList" + :key="item.id" + :value="item.id" + :label="item.materialClassifyName" + ></el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="5"> + <el-button type="primary" @click="openAddGoods">添加物资</el-button> + </el-col> + + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="物资小类" prop="smallClassifyId"> + <el-select class="input-add" v-model="dialogState.safetyGoodsAndEquipmentForm.smallClassifyId" placeholder="请先选择物资大类"> + <el-option + v-for="item in dialogState.goodsSmallClassifyList" + :key="item.id" + :value="item.id" + :label="item.materialClassifyName" + ></el-option> + </el-select> + </el-form-item> + </el-col> + + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="部门" prop="depId"> + <el-cascader + :options="dialogState.departmentList" + :props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName' }" + placeholder="请选择部门" + clearable + class="input-add" + v-model="dialogState.safetyGoodsAndEquipmentForm.depId"> + </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="consumable"> + <el-select class="input-add" v-model="dialogState.safetyGoodsAndEquipmentForm.consumable" placeholder="是否耗材" clearable filterable> + <el-option + v-for="item in dialogState.consumableList" + :key="item.id" + :value="item.id" + :label="item.name" + > + </el-option> + </el-select> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="dialogState.showSafetyGoodsAndEquipmentDialog = !dialogState.showSafetyGoodsAndEquipmentDialog" size="default">取 消</el-button> + <el-button type="primary" @click="submitSafetyGoodsAndEquipment" v-throttle size="default">确 定</el-button> + </span> + </template> + </el-dialog> + <add-goods-dialog ref="addGoodsDialogRef"></add-goods-dialog> + </div> +</template> + +<script setup lang="ts"> +import {computed, nextTick, reactive, ref, watch} from 'vue' +import { + BigClassifyType, + DataType, DepartmentType, + isValidKey, + SafetyGoodsAndEquipmentDialogStateType, safetyGoodsAndEquipmentFormType +} from "/@/views/facilityManagement/safetyGoodsAndEquipment/index"; +import { goodsAndEquipmentApi } from "/@/api/facilityManagement/safetyGoodsAndEquipment"; +import {ElMessage} from "element-plus"; +import AddGoodsDialog from "./addGoodsDialog.vue"; + +const safetyGoodsAndEquipmentRef = ref(); +const addGoodsDialogRef = ref() + +const dialogState = reactive<SafetyGoodsAndEquipmentDialogStateType>({ + safetyGoodsAndEquipmentForm: { + id: null, + bigClassifyId: null, + smallClassifyId: null, + depId: null, + consumable: null, + }, + safetyGoodsAndEquipmentRules: { + bigClassifyId: [{ required: true, message: '请选择物资大类', trigger: 'change' }], + smallClassifyId: [{ required: true, message: '请选择物资小类', trigger: 'change' }], + depId: [{ required: true, message: '请选择部门', trigger: 'change' }], + consumable: [{ required: true, message: '请选择是否耗材', trigger: 'change' }], + }, + showSafetyGoodsAndEquipmentDialog: false, + title: '', + loading: false, + depList: [], + goodsBigClassifyList: [], + goodsSmallClassifyList: [], + departmentList: [], + consumableList: [ + {id: 0, name: '是'}, + {id: 1, name: '否'}, + ], +}); + +watch(() => dialogState.safetyGoodsAndEquipmentForm.bigClassifyId ,(newVal, oldVal) => { + +},); + +const openAddGoods = () => { + addGoodsDialogRef.value.openAddGoodsDialog(dialogState.goodsBigClassifyList) +} + +const openSafetyGoodsAndEquipmentDialog = + (title: string, value: safetyGoodsAndEquipmentFormType, goodsBigClassifyList: BigClassifyType [], departmentList : DepartmentType []) => { + dialogState.title = title; + dialogState.showSafetyGoodsAndEquipmentDialog = true; + dialogState.goodsBigClassifyList = goodsBigClassifyList; + dialogState.departmentList = departmentList; + dialogState.safetyGoodsAndEquipmentForm = { + id: null, + bigClassifyId: null, + smallClassifyId: null, + depId: null, + consumable: null, + }; + if(title === '新增') { + dialogState.title = '新增' + }else { + dialogState.title = '编辑' + changeSmallClassify(value.bigClassifyId) + for(let key in dialogState.safetyGoodsAndEquipmentForm) { + if(isValidKey(key, dialogState.safetyGoodsAndEquipmentForm)){ + dialogState.safetyGoodsAndEquipmentForm[key] = value[key]; + } + } + } +}; + +const changeSmallClassify = (id: number | null) => { + dialogState.safetyGoodsAndEquipmentForm.smallClassifyId = null; + dialogState.goodsSmallClassifyList = dialogState.goodsBigClassifyList[dialogState.goodsBigClassifyList. + findIndex(item => item.id === (dialogState.safetyGoodsAndEquipmentForm.bigClassifyId || id))].childList as Array<BigClassifyType>; +} + +const submitSafetyGoodsAndEquipment = () => { + safetyGoodsAndEquipmentRef.value.validate(async (valid: boolean) => { + if(valid){ + dialogState.loading = true + if(dialogState.title === '新增') { + let res = await goodsAndEquipmentApi().addGoodsEquipment(dialogState.safetyGoodsAndEquipmentForm) + if(res.data.code === '200'){ + dialogState.showSafetyGoodsAndEquipmentDialog = false + emit('refreshData') + ElMessage({ + type: 'success', + message: '安全物资设备新增成功', + duration: 2000 + }); + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + }else{ + let res = await goodsAndEquipmentApi().updateGoodsEquipment(dialogState.safetyGoodsAndEquipmentForm) + if(res.data.code === '200'){ + dialogState.showSafetyGoodsAndEquipmentDialog = false + emit('refreshData') + ElMessage({ + type: 'success', + message: '安全物资设备编辑成功', + duration: 2000 + }); + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } + } + dialogState.loading = false + }else{ + ElMessage({ + type: 'warning', + message: '请完善基本信息' + }) + } + }) +}; + +const emit = defineEmits(['refreshData',]) + +defineExpose({ + openSafetyGoodsAndEquipmentDialog, +}); + +</script> + +<style scoped> +.input-length{ + width: 100% !important; +} +</style> diff --git a/src/views/facilityManagement/safetyGoodsAndEquipment/index.ts b/src/views/facilityManagement/safetyGoodsAndEquipment/index.ts new file mode 100644 index 0000000..3772b41 --- /dev/null +++ b/src/views/facilityManagement/safetyGoodsAndEquipment/index.ts @@ -0,0 +1,126 @@ +export type TableDataType = { + goodsAndEquipmentData: DataType []; + goodsBigClassifyList: BigClassifyType []; + departmentList: DepartmentType []; + listQuery: { + pageSize: number; + pageIndex: number; + searchParams: { + bigClassifyId: number | null; + materialName: string; + } + }; + total: number; +} + +export type SafetyGoodsAndEquipmentDialogStateType = { + safetyGoodsAndEquipmentForm: safetyGoodsAndEquipmentFormType, + safetyGoodsAndEquipmentRules: { + + }, + showSafetyGoodsAndEquipmentDialog: Boolean, + title: string, + loading: Boolean, + depList: DepartmentType []; + consumableList: Type []; + departmentList: DepListType []; + goodsBigClassifyList: BigClassifyType []; + goodsSmallClassifyList: BigClassifyType []; +} + +export type AddGoodsStateType = { + title: string; + goodsClassifyTitle: string; + showAddGoodsDialog: boolean; + showAddGoodsClassifyDialog: boolean; + activeName: string; + goodsData: BigClassifyType []; + goodsBigClassifyList: BigClassifyType []; + total: number; + listQuery: { + pageSize: number; + pageIndex: number; + searchParams: { + classifyName: string; + } + }; + goodsClassifyForm: { + id: null | number; + materialClassifyName: string; + parentId: number | null; + }; + goodsClassifyRules: { + + } +} + +export type BatchInStorageStateType = { + title: string; + loading: boolean; + materialName: string; + batchInStorageDialogVisible: boolean; + inStorageData: { + smId: null | number, + wareHousingCount: null | number, + validType: null | number, + validTime: null | string, + rfid: null | string, + }, + inStorageDataRules: { + }, +} + +export type BatchOutStorageStateType = { + title: string; + loading: boolean; + materialName: string; + batchOutStorageDialogVisible: boolean; + outStorageData: { + smId: null | number, + count: null | number, + claimantId: null | number, + rfid: null | string, + }; + outStorageDataRules: { + }; + userList: []; +} + +export type Type = { + id: number; + name: string; +} + +export type safetyGoodsAndEquipmentFormType = { + id: null | number, + bigClassifyId: null | number, + smallClassifyId: null | number, + depId: null | number, + consumable: null | number, +} + +export type DataType = { + id: number | null; + materialName: string; +} + +export type DepListType = { + +} + +export function isValidKey(key: string | number | symbol, object:object): key is keyof typeof object{ + return key in object; +} + +export type DepartmentType = { + +} + +export type BigClassifyType = { + id: number; + materialClassifyName: string; + parentId?: number; + childList?: BigClassifyType []; +} + + diff --git a/src/views/facilityManagement/safetyGoodsAndEquipment/index.vue b/src/views/facilityManagement/safetyGoodsAndEquipment/index.vue new file mode 100644 index 0000000..d47495a --- /dev/null +++ b/src/views/facilityManagement/safetyGoodsAndEquipment/index.vue @@ -0,0 +1,326 @@ +<template> + <div class="home-container"> + <div style="height: 100%"> + <el-row class="homeCard"> +<!-- <div class="basic-line">--> +<!-- <span>设备区域名称:</span>--> +<!-- <el-input class="input-box" v-model="tableData.listQuery.regionName" placeholder="设备区域名称" clearable> </el-input>--> +<!-- </div>--> +<!-- <div class="basic-line">--> +<!-- <span>设备区域类型:</span>--> +<!-- <el-select class="input-box" v-model="tableData.listQuery.regionTypeId" placeholder="设备区域类型" filterable>--> +<!-- </el-select>--> +<!-- </div>--> + <div style="padding-bottom: 10px"> + <el-button size="large" type="primary" class="ml10" v-throttle @click="refreshGoodsAndEquipmentData"> + <el-icon> + <ele-Search /> + </el-icon> + 查询 + </el-button> + <el-button size="large" type="success" class="ml10" @click="onOpenDialogRef('新增', '')"> + <el-icon> + <ele-FolderAdd /> + </el-icon> + 新增 + </el-button> + <el-button size="large" class="ml10" @click="openAddGoods()"> + 管理分类 + </el-button> + </div> + </el-row> + <div class="homeCard"> + <div class="main-card"> + <el-table :data="tableData.goodsAndEquipmentData" style="width: 100%" height="calc(100% - 100px)" :header-cell-style="{ background: '#fafafa' }"> + <el-table-column type="index" label="序号" width="60" /> + <el-table-column prop="bigClassifyName" label="大类物资类型名称" show-overflow-tooltip></el-table-column> + <el-table-column prop="materialName" label="物资名称" show-overflow-tooltip></el-table-column> + <el-table-column prop="serialNum" label="序列号" show-overflow-tooltip></el-table-column> + <el-table-column prop="depName" label="部门名称" show-overflow-tooltip></el-table-column> + <el-table-column prop="consumableName" label="是否是耗材" show-overflow-tooltip></el-table-column> + <el-table-column prop="validStockCount" label="库存" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="250" align="center"> + <template #default="scope"> + <el-button size="small" text type="success" :icon="Edit" @click="openBatchInStorage('批量入库', scope.row)">批量入库</el-button> + <el-button size="small" text type="warning" :icon="Edit" @click="openBatchOutStorage('批量出库', scope.row)">批量出库</el-button> + <el-button size="small" text type="primary" :icon="Edit" @click="linkToGoodsDetail('查看明细', scope.row)">查看明细</el-button> + <el-button size="small" text :icon="Edit" @click="onOpenDialogRef('编辑', scope.row)">编辑</el-button> + <el-button size="small" text type="danger" :icon="Delete" @click="onDelGoodsEquipment(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + <br /> + <el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" :pager-count="5" :page-sizes="[10, 20, 30]" v-model:current-page="tableData.listQuery.pageIndex" background v-model:page-size="tableData.listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="tableData.total" class="page-position"> </el-pagination> + </div> + </div> + </div> + <safety-goods-and-equipment-dialog ref="safetyGoodsAndEquipmentDialogRef" @refreshData="refreshGoodsAndEquipmentData"></safety-goods-and-equipment-dialog> + <batch-out-storage ref="batchOutStorageRef" @refreshData="refreshGoodsAndEquipmentData"></batch-out-storage> + <batch-in-storage ref="batchInStorageRef" @refreshData="refreshGoodsAndEquipmentData"></batch-in-storage> + <add-goods-dialog ref="addGoodsDialogRef"></add-goods-dialog> + </div> +</template> + +<script setup lang="ts"> +import {onMounted, reactive, ref} from 'vue' +import {BigClassifyType, DataType, TableDataType} from "/@/views/facilityManagement/safetyGoodsAndEquipment/index"; +import { Edit, View, Plus, Delete, Refresh, Search, Download } from '@element-plus/icons-vue'; +import {goodsAndEquipmentApi} from "/@/api/facilityManagement/safetyGoodsAndEquipment"; +import {ElMessage, ElMessageBox} from "element-plus"; +import SafetyGoodsAndEquipmentDialog from './components/safetyGoodsAndEquipmentDialog.vue' +import {departmentApi} from "/@/api/systemManage/department"; +import router from "/@/router"; +import BatchInStorage from './components/batchInStorage.vue' +import BatchOutStorage from './components/batchOutStorage.vue' +import AddGoodsDialog from "./components/addGoodsDialog.vue"; + +const safetyGoodsAndEquipmentDialogRef = ref() +const batchInStorageRef = ref() +const batchOutStorageRef = ref() +const addGoodsDialogRef = ref() + +const tableData = reactive<TableDataType>({ + goodsAndEquipmentData:[], + goodsBigClassifyList:[], + departmentList:[], + listQuery:{ + pageSize: 10, + pageIndex: 1, + searchParams: { + bigClassifyId:null, + materialName:'' + } + }, + total:0, +}) + +const initGoodsAndEquipmentData = async () => { + let res = await goodsAndEquipmentApi().getGoodsEquipmentData(tableData.listQuery) + if(res.data.code === '200'){ + tableData.goodsAndEquipmentData = res.data.data; + tableData.total = res.data.total; + }else{ + ElMessage({ + type:'warning', + message:res.data.msg + }) + } +}; + +const onOpenDialogRef = (title: string, value: DataType) => { + safetyGoodsAndEquipmentDialogRef.value.openSafetyGoodsAndEquipmentDialog(title,value,tableData.goodsBigClassifyList, tableData.departmentList); +}; + +const openBatchInStorage = (title: string, value: DataType) => { + batchInStorageRef.value.openBatchInStorageDialog(value) +} + +const openBatchOutStorage = (title: string, value: DataType) => { + batchOutStorageRef.value.openBatchOutStorageDialog(value) +} + +const openAddGoods = () => { + addGoodsDialogRef.value.openAddGoodsDialog(tableData.goodsBigClassifyList) +} + +const linkToGoodsDetail = (title: string, value: DataType) => { + router.push({ path: '/goodsDetailManage', query:{ id: value.id } }); +} + +const onDelGoodsEquipment = (value: DataType) => { + ElMessageBox.confirm(`此操作将永久删除该:“${value.materialName}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await goodsAndEquipmentApi().deleteGoodsEquipment({ id: value.id }); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + duration: 2000, + message: '删除成功' + }); + await initGoodsAndEquipmentData(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch(() => {}); +}; + +const refreshGoodsAndEquipmentData = () => { + initGoodsAndEquipmentData(); +}; +// 分页改变 +const onHandleSizeChange = (val: number) => { + tableData.listQuery.pageSize = val; + initGoodsAndEquipmentData(); +}; +// 分页改变 +const onHandleCurrentChange = (val: number) => { + tableData.listQuery.pageIndex = val; + initGoodsAndEquipmentData(); +}; + +const getAllSafetyEquipmentList = async () => { + let res = await goodsAndEquipmentApi().getAllSafetyEquipment(); + if(res.data.code === '200'){ + tableData.goodsBigClassifyList = res.data.data + }else{ + ElMessage({ + message:res.data.msg, + type:'warning' + }) + } +} + +const getDepartmentData = async () => { + let res = await departmentApi().getDepartmentList(); + if (res.data.code === '200') { + tableData.departmentList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } +}; + +onMounted(() => { + initGoodsAndEquipmentData(); + getAllSafetyEquipmentList(); + getDepartmentData(); +}) +</script> + +<style scoped lang="scss"> +$homeNavLengh: 8; +.home-container { + height: calc(100vh - 144px); + box-sizing: border-box; + overflow: hidden; +.homeCard { + width: 100%; + padding: 20px; + box-sizing: border-box; + background: #fff; + border-radius: 4px; + +.main-card { + width: 100%; + height: 100%; +.cardTop { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + .mainCardBtn { + margin: 0; + } +} +.pageBtn { + height: 60px; + display: flex; + align-items: center; + justify-content: right; + +.demo-pagination-block + .demo-pagination-block { + margin-top: 10px; +} +.demo-pagination-block .demonstration { + margin-bottom: 16px; +} +} +} +&:last-of-type { + height: calc(100% - 100px); + } +} +.el-row { + display: flex; + align-items: center; + margin-bottom: 20px; +&:last-child { + margin-bottom: 0; + } +.grid-content { + align-items: center; + min-height: 36px; +} + +.topInfo { + display: flex; + align-items: center; + font-size: 16px; + font-weight: bold; + +& > div { + white-space: nowrap; + margin-right: 20px; + } +} +} +} +.stepItem { + width: 100%; + display: flex; + align-items: flex-start; + margin-bottom: 30px; + margin-left: 30px; + padding-bottom: 30px; + border-left: 2px solid #ccc; +&:first-of-type { + margin-top: 30px; + } +&:last-of-type { + margin-bottom: 0; + border-left: none; + } +.stepNum { + width: 30px; + height: 30px; + border-radius: 15px; + box-sizing: border-box; + color: #333; + border: 1px solid #999; + line-height: 28px; + text-align: center; + margin-right: 10px; + margin-left: -16px; + margin-top: -30px; +} +.stepCard { + width: 100%; + margin-top: -30px; + +.box-card { + width: 100%; +&:deep(.el-card__header) { + padding: 10px 15px; + } +.card-header { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; +& > div:first-of-type { + margin-right: 80px; + font-size: 18px; + font-weight: bold; + } +} +} +} +&:hover .card-header { + color: #0098f5; + } +&:hover .stepNum { + border: 2px solid #0098f5; + color: #0098f5; + } +} +</style> diff --git a/static/loginPage.js/login.js b/static/loginPage.js/login.js index 431ef23..075087b 100644 --- a/static/loginPage.js/login.js +++ b/static/loginPage.js/login.js @@ -157,9 +157,9 @@ pJS.fn.retinaInit = function(){ if(pJS.retina_detect && window.devicePixelRatio > 1){ - pJS.canvas.pxratio = window.devicePixelRatio; + pJS.canvas.pxratio = window.devicePixelRatio; pJS.tmp.retina = true; - } + } else{ pJS.canvas.pxratio = 1; pJS.tmp.retina = false; @@ -363,7 +363,7 @@ this.vx_i = this.vx; this.vy_i = this.vy; - + /* if shape is image */ @@ -392,7 +392,7 @@ } } - + }; @@ -402,7 +402,7 @@ var p = this; if(p.radius_bubble != undefined){ - var radius = p.radius_bubble; + var radius = p.radius_bubble; }else{ var radius = p.radius; } @@ -491,9 +491,9 @@ pJS.canvas.ctx.lineWidth = pJS.particles.shape.stroke.width; pJS.canvas.ctx.stroke(); } - + pJS.canvas.ctx.fill(); - + }; @@ -664,7 +664,7 @@ pJS.tmp.count_svg = 0; pJS.fn.particlesEmpty(); pJS.fn.canvasClear(); - + /* restart */ pJS.fn.vendors.start(); @@ -684,14 +684,14 @@ var opacity_line = pJS.particles.line_linked.opacity - (dist / (1/pJS.particles.line_linked.opacity)) / pJS.particles.line_linked.distance; - if(opacity_line > 0){ - + if(opacity_line > 0){ + /* style */ var color_line = pJS.particles.line_linked.color_rgb_line; pJS.canvas.ctx.strokeStyle = 'rgba('+color_line.r+','+color_line.g+','+color_line.b+','+opacity_line+')'; pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width; //pJS.canvas.ctx.lineCap = 'round'; /* performance issue */ - + /* path */ pJS.canvas.ctx.beginPath(); pJS.canvas.ctx.moveTo(p1.x, p1.y); @@ -725,7 +725,7 @@ p2.vy += ay; } - + } @@ -805,7 +805,7 @@ if(dist_mouse <= pJS.interactivity.modes.bubble.distance){ if(ratio >= 0 && pJS.interactivity.status == 'mousemove'){ - + /* size */ if(pJS.interactivity.modes.bubble.size != pJS.particles.size.value){ @@ -854,7 +854,7 @@ if(pJS.interactivity.status == 'mouseleave'){ init(); } - + } /* on click event */ @@ -933,7 +933,7 @@ repulseRadius = pJS.interactivity.modes.repulse.distance, velocity = 100, repulseFactor = clamp((1/repulseRadius)*(-1*Math.pow(dist_mouse/repulseRadius,2)+1)*repulseRadius*velocity, 0, 50); - + var pos = { x: p.x + normVec.x * repulseFactor, y: p.y + normVec.y * repulseFactor @@ -946,7 +946,7 @@ p.x = pos.x; p.y = pos.y; } - + } @@ -1001,7 +1001,7 @@ // }else{ // process(); // } - + }else{ @@ -1009,7 +1009,7 @@ p.vx = p.vx_i; p.vy = p.vy_i; - + } } @@ -1039,7 +1039,7 @@ pJS.canvas.ctx.strokeStyle = 'rgba('+color_line.r+','+color_line.g+','+color_line.b+','+opacity_line+')'; pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width; //pJS.canvas.ctx.lineCap = 'round'; /* performance issue */ - + /* path */ pJS.canvas.ctx.beginPath(); pJS.canvas.ctx.moveTo(p.x, p.y); @@ -1155,7 +1155,7 @@ } }); - + } @@ -1359,7 +1359,7 @@ pJS.fn.vendors.init(); pJS.fn.vendors.draw(); } - + } }else{ @@ -1406,7 +1406,7 @@ pJS.fn.vendors.eventsListeners(); pJS.fn.vendors.start(); - + }; @@ -1520,7 +1520,7 @@ }; window.particlesJS.load = function(tag_id, path_config_json, callback){ - +debugger /* load json config */ var xhr = new XMLHttpRequest(); xhr.open('GET', path_config_json); @@ -1542,4 +1542,4 @@ } export { loginBg -} \ No newline at end of file +} -- Gitblit v1.9.2