<template>
|
<div class="home-container">
|
<div style="height: 100%">
|
<el-form :model="form" label-width="150px" :rules="applyRules" ref="ruleFormRef">
|
<div class="homeCard">
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="作业人" prop="operatorUids">
|
<el-select v-model="form.operatorUids" multiple>
|
<el-option
|
v-for="item in workerList"
|
:key="item.uid"
|
:label="item.username"
|
:value="item.uid"
|
/>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="作业时间" prop="workTimeLine">
|
<el-date-picker
|
v-model="form.workTimeLine"
|
format="YYYY-MM-DD HH:mm"
|
value-format="YYYY-MM-DD HH:mm:00"
|
type="datetimerange"
|
range-separator="至"
|
start-placeholder="开始时间"
|
end-placeholder="结束时间"
|
/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="作业内容" prop="workContent">
|
<el-input
|
v-model="form.workContent"
|
autosize
|
type="textarea"
|
placeholder="请输入作业内容"
|
/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="作业地址" prop="workLocation">
|
<el-input
|
v-model="form.workLocation"
|
autosize
|
type="textarea"
|
placeholder="请输入作业地址"
|
/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="危害辨识" prop="hazardIdentification">
|
<el-input
|
v-model="form.hazardIdentification"
|
placeholder="请输入危害辨识"
|
/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="关联设备" prop="cameraIds">
|
<el-select v-model="form.cameraIds" multiple>
|
<el-option
|
v-for="item in deviceList"
|
:key="item.id"
|
:label="item.name"
|
:value="item.id"
|
/>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-divider border-style="dashed"/>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="作业单位" prop="workDetail.operationDepId">
|
<!-- <el-select v-model="form.workDetail.operationDepId">-->
|
<!-- <el-option-->
|
<!-- v-for="item in csDepList"-->
|
<!-- :key="item.value"-->
|
<!-- :label="item.label"-->
|
<!-- :value="item.value"-->
|
<!-- />-->
|
<!-- </el-select>-->
|
<el-cascader v-model="form.workDetail.operationDepId" :options="departList" :props="casProps" :show-all-levels="false" @change="handleChange" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="范围" prop="workDetail.gbScope">
|
<el-input
|
v-model="form.workDetail.gbScope"
|
autosize
|
type="textarea"
|
placeholder="请输入"
|
/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="动土方式" prop="workDetail.gbMethod">
|
<el-input
|
v-model="form.workDetail.gbMethod"
|
autosize
|
type="textarea"
|
placeholder="请输入"
|
/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="关联作业" prop="workDetail.otherSpecialWork">
|
<el-select v-model="form.workDetail.otherSpecialWork" multiple>
|
<el-option v-for="item in otherWorkList" :key="item.value" :label="item.label" :value="item.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="openMaList">选择物资标准</el-button>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
</div>
|
</el-form>
|
<material-dialog ref="material" @conFirmMaterials="conFirmMaterials"></material-dialog>
|
<div class="applyBtn">
|
<el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">发起申请</el-button>
|
</div>
|
</div>
|
<el-dialog v-model="dialogVisible">
|
<img w-full :src="dialogImageUrl" alt="Preview Image" />
|
</el-dialog>
|
</div>
|
</template>
|
|
<script lang="ts">
|
import { toRefs, reactive, defineComponent, ref, defineAsyncComponent } from 'vue';
|
import { storeToRefs } from 'pinia';
|
import { initBackEndControlRoutes } from '/@/router/backEnd';
|
import {useUserInfo} from "/@/stores/userInfo";
|
import { Session } from '/@/utils/storage';
|
import { Search,Plus } from '@element-plus/icons-vue'
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
import type { FormInstance, FormRules, UploadProps, UploadUserFile } from 'element-plus'
|
import { workApplyApi } from '/@/api/specialWorkSystem/workApply';
|
import axios from 'axios';
|
|
interface stateType {
|
equipmentDialog: boolean,
|
form: Object,
|
csDepList: Array<any>,
|
otherWorkList: Array<any>,
|
fileList: Array<file>,
|
uploadUrl: string,
|
dialogVisible: Boolean,
|
dialogImageUrl: string | null,
|
imgLimit: number,
|
casProps: {},
|
isOverSize: Boolean
|
}
|
interface file {
|
url: string;
|
}
|
export default {
|
name: 'groundForm',
|
components: {
|
materialDialog: defineAsyncComponent(() => import('/@/views/specialWorkSystem/workTicket/zysq/components/materialDialog.vue')),
|
},
|
props:['workerList','departList', 'deviceList'],
|
setup(props: any, context: any) {
|
const userInfo = useUserInfo()
|
const { userInfos } = storeToRefs(userInfo);
|
const state = reactive<stateType>({
|
equipmentDialog: false,
|
form: {
|
operatorUids: [],
|
workType: 4,
|
workLevel: 0,
|
workContent: '',
|
workLocation: '',
|
hazardIdentification: '',
|
cameraIds: [],
|
maBaseId: null,
|
workDetail:{
|
operationDepId: null,
|
gbScope: '',
|
gbMethod: '',
|
gbPath: [],
|
otherSpecialWork: []
|
},
|
receiveUids: [],
|
workTimeLine: [],
|
expStartTime: '',
|
expEndTime: ''
|
},
|
isOverSize: false,
|
fileList: [],
|
imgLimit: 3,
|
uploadUrl: '',
|
dialogVisible: false,
|
dialogImageUrl: null,
|
csDepList: [
|
{
|
label: "单位一",
|
value: 1
|
},
|
{
|
label: "单位二",
|
value: 2
|
},
|
{
|
label: "单位三",
|
value: 3
|
},
|
{
|
label: "单位四",
|
value: 4
|
},
|
{
|
label: "单位五",
|
value: 5
|
},
|
{
|
label: "单位六",
|
value: 6
|
}
|
],
|
otherWorkList: [
|
{
|
label: '动火作业',
|
value: 1
|
},
|
{
|
label: '受限空间作业',
|
value: 2
|
},
|
{
|
label: '吊装作业',
|
value: 3
|
},
|
{
|
label: '动土作业',
|
value: 4
|
},
|
{
|
label: '断路作业',
|
value: 5
|
},
|
{
|
label: '高处作业',
|
value: 6
|
},
|
{
|
label: '临时用电作业',
|
value: 7
|
},
|
{
|
label: '盲板抽堵作业',
|
value: 8
|
}
|
],
|
casProps: {
|
emitPath: false,
|
value: 'depId',
|
label: 'depName',
|
multiple: false,
|
expandTrigger: 'hover',
|
checkStrictly: true
|
}
|
});
|
const material = ref()
|
const ruleFormRef = ref<FormInstance>()
|
const applyRules = reactive<FormRules>({
|
operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }],
|
workType: [{ required: true, message: '该内容不能为空', trigger: 'blur' }],
|
workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }],
|
workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }],
|
hazardIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }],
|
cameraIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }],
|
workTimeLine: [{ required: true, message: '该内容不能为空', trigger: 'blur' }],
|
"workDetail.operationDepId": [{ required: true, message: '该内容不能为空', trigger: 'blur' }],
|
"workDetail.gbScope": [{ required: true, message: '该内容不能为空', trigger: 'blur' }],
|
"workDetail.gbMethod": [{ required: true, message: '该内容不能为空', trigger: 'blur' }],
|
"workDetail.gbPath": [{ required: true, message: '该内容不能为空', trigger: 'blur' }]
|
});
|
// const toZero = (value: string | number,index: number,name: string,x:number) =>{
|
// if(!value){
|
// state.materialList[index][name][x].value = 0
|
// }
|
// }
|
|
const openMaList = ()=>{
|
if(state.form.operatorUids == []){
|
ElMessage({
|
type: 'warning',
|
message: '请先选择作业人再获取相应物资配置'
|
});
|
}else{
|
if(material.value.receiveUids.length==0){
|
material.value.receiveUids = state.form.operatorUids
|
}
|
material.value.getMaList(state.form.workType,state.form.workLevel)
|
material.value.workerList = props.workerList
|
}
|
}
|
const conFirmMaterials = (receiveUids: Array<number>,chosenId: number) =>{
|
state.form.maBaseId = null
|
state.form.receiveUids = []
|
state.form.receiveUids = receiveUids
|
state.form.maBaseId = chosenId
|
}
|
|
const submitForm = async (formEl: FormInstance | undefined) => {
|
if (!formEl) return
|
await formEl.validate(async (valid, fields) => {
|
if (valid) {
|
// if (state.form.wmAddReqDTOList == null || state.form.wmAddReqDTOList.length == 0){
|
// ElMessage({
|
// type: 'warning',
|
// message: '请确认关联物资的配置'
|
// });
|
// return
|
// }
|
state.form.expStartTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[0]
|
state.form.expEndTime = JSON.parse(JSON.stringify(state.form.workTimeLine))[1]
|
let { workTimeLine, ...data } = JSON.parse(JSON.stringify(state.form))
|
data.workDetail.otherSpecialWork = data.workDetail.otherSpecialWork.join(',')
|
data.workDetail.gbPath = data.workDetail.gbPath.join(',')
|
const res = await workApplyApi().postGroundApply(data)
|
if (res.data.code === '200') {
|
ElMessage({
|
type: 'success',
|
message: '提交成功!'
|
});
|
formEl.resetFields()
|
state.form.workDetail.gbPath = []
|
state.fileList = []
|
} else {
|
ElMessage({
|
type: 'warning',
|
message: res.data.msg
|
});
|
}
|
material.value.maBaseId = null
|
material.value.receiveUids = []
|
} else {
|
console.log('error submit!', fields)
|
}
|
})
|
}
|
|
const handlePreview: UploadProps['onPreview'] = (uploadFile) => {
|
console.log(uploadFile);
|
};
|
|
const handlePictureCardPreview = (uploadFile: { url: string }) => {
|
state.dialogImageUrl = uploadFile.url!;
|
state.dialogVisible = true;
|
};
|
|
const getUploadUrl = async (rawFile: any) => {
|
const fileSize = rawFile.size / 1024 < 500 ? '1' : '0'
|
if(fileSize === '0'){
|
ElMessage({
|
type: 'warning',
|
message: '文件大小不能超过500k。'
|
});
|
state.isOverSize = true
|
return false
|
}else{
|
const res = await workApplyApi().getUploadUrl(rawFile.name);
|
state.form.workDetail.gbPath.push(res.data.data.fileName)
|
state.uploadUrl = res.data.data.uploadUrl;
|
}
|
};
|
|
const upload = async (params: any) => {
|
// const formData = new FormData();
|
// formData.append('file', state.fileList[0].raw);
|
let reader = new FileReader();
|
reader.readAsArrayBuffer(params.file);
|
reader.onload = async () => {
|
axios
|
.put(state.uploadUrl, reader.result, {
|
header: { 'Content-Type': 'multipart/form-data' }
|
})
|
.then(() => {
|
// if (state.fileList.length === 2) {
|
// state.fileList.splice(0, 1);
|
// }
|
// console.log(state.form.workDetail.gbPath,'gbpath')
|
});
|
};
|
};
|
|
const beforeRemove = (file: {}, fileList: []) => {
|
const result = new Promise((resolve, reject) => {
|
if(!state.isOverSize){
|
ElMessageBox.confirm('此操作将删除该图片, 是否继续?', '提示', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning'
|
})
|
.then(() => {
|
// console.log(state.workDetail.gbPath,'path')
|
const list = JSON.parse(JSON.stringify(state.form.workDetail.gbPath))
|
fileList.map((item,index)=>{
|
if(item.uid === file.uid){
|
fileList.splice(index,1)
|
state.form.workDetail.gbPath.splice(index,1)
|
// 请求删除接口
|
deletePic(false,list[index])
|
}
|
})
|
})
|
.catch(() => {
|
reject(false);
|
});
|
}else{
|
const list = JSON.parse(JSON.stringify(state.form.workDetail.gbPath))
|
fileList.map((item,index)=>{
|
if(item.uid === file.uid){
|
fileList.splice(index,1)
|
state.form.workDetail.gbPath.splice(index,1)
|
deletePic(true,list[index])
|
}
|
})
|
state.isOverSize = false
|
}
|
});
|
return result;
|
};
|
|
|
// 删除图片接口
|
const deletePic = async(isOverSize:boolean,fileName:string)=>{
|
const res = await workApplyApi().deleteFile({fileName: fileName})
|
if (res.data.code === '200') {
|
ElMessage({
|
type: isOverSize ? 'error' : 'success',
|
message: isOverSize ? '上传失败':'删除成功!'
|
});
|
} else {
|
ElMessage({
|
type: 'warning',
|
message: res.data.msg
|
});
|
}
|
}
|
|
const showTip =()=>{
|
ElMessage({
|
type: 'warning',
|
message: '超出文件上传数量'
|
});
|
}
|
|
// const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => {
|
// console.log('2111111111111')
|
// };
|
|
// 折线图
|
const renderMenu = async (value: string) => {
|
Session.set('projectId',value)
|
userInfos.value.projectId = value
|
await initBackEndControlRoutes();
|
};
|
return {
|
renderMenu,
|
Search,
|
Plus,
|
ruleFormRef,
|
applyRules,
|
material,
|
openMaList,
|
conFirmMaterials,
|
handlePreview,
|
getUploadUrl,
|
beforeRemove,
|
upload,
|
showTip,
|
submitForm,
|
handlePictureCardPreview,
|
...toRefs(state),
|
};
|
},
|
};
|
</script>
|
|
<style scoped lang="scss">
|
.avatar-uploader .avatar {
|
width: 178px;
|
height: 178px;
|
display: block;
|
}
|
.home-container {
|
height: 100%;
|
overflow: hidden;
|
position: relative;
|
.homeCard{
|
width: 100%;
|
padding: 20px;
|
box-sizing: border-box;
|
background: #fff;
|
border-radius: 4px;
|
margin-bottom: 20px;
|
}
|
.applyBtn{
|
width: 100%;
|
background: #fff;
|
padding-top: 15px;
|
z-index: 5;
|
box-shadow: 0 -3px 8px rgba(150,150,150,.1);
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
}
|
.el-row{
|
margin-bottom: 20px;
|
}
|
.el-row:last-child {
|
margin-bottom: 0;
|
}
|
.el-input{
|
width: 100% !important;
|
}
|
.el-date-editor::v-deep{
|
width: 100%;
|
}
|
.el-select{
|
width: 100%;
|
}
|
:deep(.el-cascader){
|
width: 100% !important;
|
}
|
}
|
</style>
|
<style>
|
.avatar-uploader .el-upload {
|
border: 1px dashed var(--el-border-color);
|
border-radius: 6px;
|
cursor: pointer;
|
position: relative;
|
overflow: hidden;
|
transition: var(--el-transition-duration-fast);
|
}
|
|
.avatar-uploader .el-upload:hover {
|
border-color: var(--el-color-primary);
|
}
|
|
.el-icon.avatar-uploader-icon {
|
font-size: 28px;
|
color: #8c939d;
|
width: 178px;
|
height: 178px;
|
text-align: center;
|
}
|
</style>
|