Files
emsfront/src/views/ems/ticket/AddTicket.vue

218 lines
7.4 KiB
Vue
Raw Normal View History

2025-06-30 17:32:04 +08:00
<template>
2025-07-11 17:14:02 +08:00
<el-dialog v-loading="loading>0" :visible.sync="dialogTableVisible" class="ems-dialog" :title="mode === 'add'?'新增工单':`编辑工单` " :close-on-click-modal="false" :show-close="false">
<el-form ref="addTempForm" :model="formData" :rules="rules" size="medium" label-width="120px">
2025-07-11 17:14:02 +08:00
<el-form-item label="工单号" prop="ticketNo" v-if="mode !== 'add'">
<el-input disabled v-model="formData.ticketNo" clearable :style="{width: '100%'}">
2025-06-30 17:32:04 +08:00
</el-input>
</el-form-item>
2025-07-11 17:14:02 +08:00
<el-form-item label="工单标题" prop="title">
2025-06-30 17:32:04 +08:00
<el-input v-model="formData.title" placeholder="请输入" clearable :style="{width: '100%'}">
</el-input>
</el-form-item>
2025-07-11 17:14:02 +08:00
<el-form-item label="问题描述" prop="content">
<el-input v-model="formData.content" type="textarea" placeholder="请输入" clearable :style="{width: '100%'}">
2025-06-30 17:32:04 +08:00
</el-input>
</el-form-item>
2025-07-11 17:14:02 +08:00
<el-form-item label="处理状态" prop="status">
<el-select v-model="formData.status" placeholder="请选择" :style="{width: '100%'}">
<el-option :label="value" :value="parseInt(key)" v-for="(value,key) in ticketStatusOptions" :key="key+'ticketStatusOptions'"></el-option>
2025-06-30 17:32:04 +08:00
</el-select>
</el-form-item>
2025-07-11 17:14:02 +08:00
<el-form-item label="提交人" prop="userId">
<el-select v-model="formData.userId" placeholder="请选择" :style="{width: '100%'}">
<el-option :label="item.userName" :value="item.userId" v-for="(item,index) in userList" :key="index+'createUserList'"></el-option>
</el-select>
2025-06-30 17:32:04 +08:00
</el-form-item>
2025-07-11 17:14:02 +08:00
<el-form-item label="处理人" prop="workUserId">
<el-select v-model="formData.workUserId" placeholder="请选择" :style="{width: '100%'}">
<el-option :label="item.userName" :value="item.userId" v-for="(item,index) in userList" :key="index+'updateUserList'"></el-option>
</el-select>
2025-06-30 17:32:04 +08:00
</el-form-item>
<el-form-item label="预计完成时间" prop="expectedCompleteTime" >
<el-date-picker
v-model="formData.expectedCompleteTime"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetime"
placeholder="请选择"
:style="{width: '100%'}"
>
</el-date-picker>
</el-form-item>
2025-07-11 17:14:02 +08:00
<el-form-item label="提交时间" prop="createTime" v-if="mode !== 'add'">
<el-input v-model="formData.createTime" disabled :style="{width: '100%'}">
2025-06-30 17:32:04 +08:00
</el-input>
</el-form-item>
<el-form-item label="图片" v-if="mode !== 'add' && formData.images && formData.images.length>0">
<img v-for="item in formData.images" :key="item+'imgs'" :src="item" alt="" srcset="" class="ticket-imgs">
</el-form-item>
2025-06-30 17:32:04 +08:00
</el-form>
2025-06-30 17:32:04 +08:00
<div slot="footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="saveDialog">确定</el-button>
</div>
</el-dialog>
</template>
<script>
2025-07-11 17:14:02 +08:00
import {mapState} from "vuex";
import {getTicket,getAllUser,addTicket,updateTicket} from'@/api/ems/ticket'
2025-07-12 15:55:05 +08:00
import {validText} from '@/utils/validate'
2025-06-30 17:32:04 +08:00
export default {
props:{
mode:{
type:String,
default:"add"
},
2025-07-11 17:14:02 +08:00
id:{
type:String,
required:false
}
2025-06-30 17:32:04 +08:00
},
data() {
2025-07-11 17:14:02 +08:00
const validateContent=(rule, value, callback) =>{
if (value === '') {
callback(new Error(`请输入${rule.field === 'title' ?'工单标题' :'问题描述'}`));
2025-07-12 15:55:05 +08:00
} else if (!validText(value)) {
callback(new Error('只能输入中文、英文、数字和特殊字符!'));
2025-07-11 17:14:02 +08:00
} else {
callback();
}
}
2025-06-30 17:32:04 +08:00
return {
2025-07-11 17:14:02 +08:00
loading:0,
2025-06-30 17:32:04 +08:00
dialogTableVisible:false,
2025-07-11 17:14:02 +08:00
userList:[],
2025-06-30 17:32:04 +08:00
formData: {
2025-07-11 17:14:02 +08:00
id:'',
ticketNo:'',//工单号
2025-06-30 17:32:04 +08:00
title: '',//工单标题
2025-07-11 17:14:02 +08:00
content: '',
status:'',
createBy:'',//提交人
userId:'',//提交人id
updateBy: '',//处理人
workUserId:'',//处理人id
createTime: '',//提交时间
expectedCompleteTime:'',//预计完成时间
images:[],//图片列表
2025-06-30 17:32:04 +08:00
},
rules: {
2025-07-11 17:14:02 +08:00
title:[
{ validator: validateContent, trigger: 'blur' }
],
content:[
{ validator: validateContent, trigger: 'blur' }
],
status:[
{ required: true, message: '请选择工单状态', trigger: ['blur', 'change']}
],
userId:[
{ required: true, message: '请选择提交人', trigger: ['blur', 'change'] }
],
workUserId:[
{ required: true, message: '请选择处理人', trigger: ['blur', 'change'] }
],
expectedCompleteTime:[
{ required: true, message: '请选择预计完成时间', trigger: ['blur', 'change'] }
],
2025-06-30 17:32:04 +08:00
},
}
},
2025-07-11 17:14:02 +08:00
computed: {
...mapState({
ticketStatusOptions: state => state?.ems?.ticketStatusOptions || {},
})
},
watch:{
dialogTableVisible:{
handler(newVal){
newVal && this.getUserList()
},
immediate: true,
},
id:{
handler(newVal){
if(newVal && this.mode !== 'add'){
//获取详情
this.loading+=1
getTicket(newVal).then(response => {
this.formData = JSON.parse(JSON.stringify(response?.data || {}));
const {images=''} = this.formData
this.formData.images = JSON.parse(images)
2025-07-11 17:14:02 +08:00
}).finally(() => {this.loading-=1})
}
},
immediate: true,
}
},
2025-06-30 17:32:04 +08:00
methods: {
2025-07-11 17:14:02 +08:00
getUserList(){
this.loading= this.loading+1
getAllUser().then(response => {
this.userList = JSON.parse(JSON.stringify(response?.data || []));
}).finally(() => {
this.loading=this.loading -1
})
},
2025-06-30 17:32:04 +08:00
saveDialog() {
this.$refs.addTempForm.validate(valid => {
if (!valid) return
2025-07-11 17:14:02 +08:00
this.loading+=1
const {title='',content='',status='',userId='',workUserId='',id='',expectedCompleteTime=''} = this.formData;
2025-07-11 17:14:02 +08:00
if(this.mode === 'add'){
addTicket({title,content,status,userId,workUserId,expectedCompleteTime}).then(response => {
2025-07-11 17:14:02 +08:00
if(response.code === 200){
//新增成功
// 关闭弹窗 更新表格
this.$emit('update')
this.closeDialog()
}
}).finally(() => {
this.loading-=1
})
}else{
updateTicket({title,content,status,userId,workUserId,id,expectedCompleteTime}).then(response => {
2025-07-11 17:14:02 +08:00
if(response.code === 200){
//新增成功
// 关闭弹窗 更新表格
this.$emit('update')
this.closeDialog()
}
}).finally(() => {
this.loading-=1
})
}
2025-06-30 17:32:04 +08:00
})
},
closeDialog(){
// 清空所有数据
2025-07-12 15:55:05 +08:00
this.$emit('clear')
2025-06-30 17:32:04 +08:00
this.$refs.addTempForm.resetFields()
this.formData={
title: '',//工单标题
2025-07-11 17:14:02 +08:00
content: '',
status:'',
createBy:'',//提交人
userId:'',//提交人id
updateBy: '',//处理人
workUserId:'',//处理人id
completeTime: '',//提交时间
ticketNo:'',//工单号
expectedCompleteTime:'',
images: []
2025-06-30 17:32:04 +08:00
}
this.dialogTableVisible=false
}
}
}
</script>
<style scoped>
.ticket-imgs{
width:150px;
height: 100px;
2025-06-30 17:32:04 +08:00
}
</style>