<template>
|
<GlobalWindow :title="title" :visible.sync="visible" @confirm="confirm">
|
<div class="modal_wrap">
|
<div class="modal_content">
|
<div class="header">
|
<div class="left">
|
<div class="h1">公务车申请</div>
|
<div class="time">提交时间:{{ model.createDate }}</div>
|
</div>
|
<span class="right" v-if="model.status === 0">申请中</span>
|
<span class="right" v-if="model.status === 1">审批中</span>
|
<span class="right" style="background:#53b76f " v-if="model.status === 2">审批通过</span>
|
<span class="right" style="background:#dc362e " v-if="model.status === 3">审批不通过</span>
|
<span class="right" style="background:#B2B2B2; " v-if="model.status === 4">已撤销</span>
|
</div>
|
<div class="info">
|
<div class="title">公务车申请信息</div>
|
<div class="list">
|
<div class="item" style="width: 100%">
|
<div class="label">申请人</div>
|
<div class="value">{{ model.memberName || '' }} {{ model.memberPhone || '' }} ({{ model.companyName || ''
|
}})
|
</div>
|
</div>
|
<div class="item">
|
<div class="label">申请车辆</div>
|
<div class="value">{{ model.carCode || '' }}</div>
|
</div>
|
<div class="item">
|
<div class="label">司机信息</div>
|
<div class="value" v-if="model.driverId != null">{{ model.driverName || '' }} {{ model.driverPhone || ''
|
}}
|
</div>
|
<div class="value" v-if="model.driverId == null">未指派</div>
|
</div>
|
<div class="item">
|
<div class="label">用车事由</div>
|
<div class="value">{{ model.content }}</div>
|
</div>
|
<div class="item">
|
<div class="label">乘车人员</div>
|
<div class="value">{{ model.memberNames || '' }}</div>
|
</div>
|
<div class="item">
|
<div class="label">目的地类别</div>
|
<div class="value status-green" v-if="model.type == 0">【市内用车】</div>
|
<div class="value status-red" v-if="model.type == 1">【市外用车】</div>
|
</div>
|
<div class="item">
|
<div class="label">目的地</div>
|
<div class="value">{{ model.addr || '' }}</div>
|
</div>
|
<div class="item">
|
<div class="label">预计出发时间</div>
|
<div class="value" v-if="model.planUseDate">{{ model.planUseDate.slice(0,16) }}</div>
|
</div>
|
<div class="item">
|
<div class="label">用车时段</div>
|
<div class="value">始:<span v-if="model.startTime">{{ model.startTime.slice(0,16) }}</span><br>止:<span v-if="model.endTime">{{ model.endTime.slice(0,16) }}</span></div>
|
</div>
|
</div>
|
</div>
|
</div>
|
<div class="side">
|
<div class="side_title">审批流程</div>
|
<div class="list" v-if="
|
model.approveDateVO != null && model.approveDateVO.approveList != null
|
">
|
<div class="item" v-for="(item, index) in model.approveDateVO.approveList" :key="item.id">
|
<div class="separate" v-if="index < model.approveDateVO.approveList.length - 1"></div>
|
<div class="info">
|
<img src="@/assets/icons/ic_tongguo.png" class="iconnew" v-if="item.status == 2" />
|
<img src="@/assets/icons/ic_dangqian.png" class="iconnew" v-if="item.status == 1" />
|
<img src="@/assets/icons/ic_jujue.png" class="iconnew" v-if="item.status == 3" />
|
<img src="@/assets/icons/ic_grey.png" class="iconnew" v-if="item.status == null || item.status == 0" />
|
<div style="display: inline" v-if="item.approveType != 1">
|
<img v-if="item.faceImg != null && item.faceImg != ''" :src="item.faceImg" class="avatar" alt="" />
|
<img v-if="item.faceImg == null || item.faceImg == ''" src="@/assets/avatar/man.png" class="avatar"
|
alt="" />
|
</div>
|
<div style="display: inline" v-if="item.approveType == 1">
|
<img v-if="item.type != 1" src="@/assets/icons/ic_duoren.png" class="avatar" alt="" />
|
<img v-if="item.type == 1" src="@/assets/icons/ic_chaosong.png" class="avatar" alt="" />
|
</div>
|
<div class="content">
|
<div class="line">
|
<div class="name">{{ item.title }}</div>
|
<div class="time">{{ item.checkDate }}</div>
|
</div>
|
<div class="line">
|
<div class="company">
|
{{ item.memberName }}
|
<div style="display: inline" v-if="item.statusInfo != null && item.statusInfo != ''">
|
(<span :class="{ padding: item.statusInfo == '处理中' || item.status == '1' }">{{
|
item.statusInfo || ""
|
}}</span>)
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
<div v-if="
|
item.approveType != 1 &&
|
item.checkInfo != null &&
|
item.checkInfo != ''
|
" class="remark">
|
{{ item.checkInfo || "" }}
|
</div>
|
<div v-if="item.approveType == 0 || item.type == 1 || item.approveType == 1" class="childList">
|
<div class="m_content company" v-for="item1 in item.approveList" :key="item1.id">
|
<img v-if="item1.faceImg != null && item1.faceImg != ''" :src="item1.faceImg" class="avatar" alt="" />
|
<img v-if="item1.faceImg == null || item1.faceImg == ''" src="@/assets/avatar/man.png" class="avatar"
|
alt="" />
|
<span> {{ item1.memberName }}</span>
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
<!-- -->
|
<template v-slot:footer>
|
<el-button @click="agreeOpen" type="primary"
|
v-if="model.approveDateVO != null && model.approveDateVO.canBeApproved != null && model.approveDateVO.canBeApproved == 1"
|
class="status-red">同意</el-button>
|
<el-button @click="jectOpen" type="danger"
|
v-if="model.approveDateVO != null && model.approveDateVO.canBeApproved != null && model.approveDateVO.canBeApproved == 1">拒绝</el-button>
|
<el-button @click="visible = false">返回</el-button>
|
</template>
|
<el-dialog append-to-body title="同意申请" style="text-align: center" class="dialogCl" :visible.sync="isShowProblem"
|
width="480px">
|
<el-form :model="dealForm" :rules="rules" ref="dealForm">
|
<!-- <el-form-item label="派车司机" prop="driverId" required v-if="model.approveDateVO!=null && model.approveDateVO.driverParam === 1"> -->
|
<el-form-item label="派车司机" prop="driverId"
|
v-if="model.approveDateVO != null && model.approveDateVO.driverParam == 1">
|
<el-select v-model="dealForm.driverId" style="width: 300px" filterable clearable placeholder="请选择派遣司机">
|
<el-option v-for="item in memberList" :key="item.id" :label="item.name + '-' + item.phone" :value="item.id">
|
</el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item label="同意说明">
|
<el-input type="textarea" placeholder="请填写说明" :rows="4" v-model="dealForm.checkInfo" />
|
</el-form-item>
|
</el-form>
|
<span slot="footer" class="dialog-footer">
|
<el-button @click="isShowProblem = false">取消</el-button>
|
<el-button type="primary" :loading="dealing" @click="dealDo">确定</el-button>
|
</span>
|
</el-dialog>
|
<el-dialog append-to-body title="拒绝申请" style="text-align: center" class="dialogCl" :visible.sync="isBackProblem"
|
width="600px">
|
<el-form :model="backForm" ref="backForm" label-width="100px">
|
<el-form-item label="拒绝说明">
|
<el-input type="textarea" placeholder="请填写说明" :rows="4" v-model="backForm.checkInfo" />
|
</el-form-item>
|
</el-form>
|
<span slot="footer" class="dialog-footer">
|
<el-button @click="isBackProblem = false">取消</el-button>
|
<el-button type="primary" :loading="dealing" @click="backDo">确定</el-button>
|
</span>
|
</el-dialog>
|
</GlobalWindow>
|
</template>
|
|
<script>
|
import BaseOpera from '@/components/base/BaseOpera'
|
import GlobalWindow from '@/components/common/GlobalWindow'
|
import { driveList } from '@/api/business/member'
|
import { approveDo } from '@/api/business/approve'
|
import { mapState } from 'vuex'
|
|
export default {
|
name: 'OperaCarUseBookWindow',
|
components: { GlobalWindow },
|
extends: BaseOpera,
|
data() {
|
return {
|
title: '公务车申请',
|
visible: false,
|
dataId: null,
|
model: {},
|
dealing: false,
|
isShowProblem: false,
|
isBackProblem: false,
|
memberList: [],
|
dealForm: {
|
driveId: null,
|
checkInfo: null
|
},
|
backForm: {
|
checkInfo: null
|
},
|
rules: {
|
driverId: [{ required: true, message: '请选择派遣司机', trigger: 'blur' }]
|
}
|
}
|
},
|
computed: {
|
...mapState(['userInfo'])
|
},
|
created() {
|
this.config({
|
api: '/business/carUseBook',
|
'field.id': 'id'
|
})
|
},
|
methods: {
|
dealDo() {
|
this.$refs.dealForm.validate((valid) => {
|
if (!valid) {
|
return
|
}
|
this.$dialog.actionConfirm('操作确认', '您确认同意该申请吗?')
|
.then(() => {
|
this.dealing = true
|
approveDo({
|
objId: this.dataId,
|
objType: this.model.type == 1 ? 4 : 3,
|
status: 2,
|
driverId: this.dealForm.driverId,
|
checkInfo: this.dealForm.checkInfo
|
})
|
.then(res => {
|
this.$tip.apiSuccess('处理成功')
|
this.getDetail()
|
this.isShowProblem = false
|
})
|
.finally(() => {
|
this.dealing = false
|
})
|
})
|
})
|
},
|
agreeOpen() {
|
this.isShowProblem = true
|
this.$set(this.dealForm, 'driverId', this.model.driverId)
|
|
this.$set(this.dealForm, 'checkInfo', '')
|
this.loadMemberList()
|
},
|
jectOpen() {
|
this.isBackProblem = true
|
this.backForm = {
|
checkInfo: null
|
}
|
},
|
backDo() {
|
this.$refs.backForm.validate((valid) => {
|
if (!valid) {
|
return
|
}
|
approveDo({
|
objId: this.dataId,
|
objType: this.model.type == 1 ? 4 : 3,
|
status: 3,
|
checkInfo: this.backForm.checkInfo
|
}).then(res => {
|
this.$tip.apiSuccess('退回成功')
|
this.getDetail()
|
this.isBackProblem = false
|
})
|
.catch(e => {
|
})
|
.finally(() => {
|
this.dealing = false
|
})
|
})
|
},
|
open(title, target) {
|
this.title = title
|
this.visible = true
|
this.model = {}
|
this.dataId = target.id
|
this.$nextTick(() => {
|
this.memberList = []
|
this.dealForm = {
|
driveId: null,
|
checkInfo: null
|
}
|
this.backForm = {
|
checkInfo: null
|
}
|
this.getDetail()
|
})
|
},
|
getDetail() {
|
this.api.detail(this.dataId)
|
.then(res => {
|
this.model = res
|
if (this.model.approveDateVO && this.model.approveDateVO.approveList.length > 0) {
|
this.model.approveDateVO.approveList.forEach(item => {
|
if (item.approveList && item.approveList.length == 1 && item.type !== 1) {
|
item.title = item.approveList[0].title
|
item.faceImg = item.approveList[0].faceImg
|
item.memberName = item.approveList[0].memberName
|
item.statusInfo = item.approveList[0].statusInfo
|
item.status = item.approveList[0].status
|
item.approveList = []
|
}
|
})
|
}
|
this.dealForm.driveId = res.driveId
|
})
|
},
|
loadMemberList() {
|
driveList({}).then(res => {
|
this.memberList = res
|
})
|
}
|
}
|
}
|
</script>
|
|
<style lang="scss" scoped>
|
@import "@/assets/style/variables.scss";
|
|
.upload_box {
|
width: 84px;
|
height: 84px;
|
border-radius: 4px;
|
background-color: #f7f7f7;
|
display: flex;
|
flex-direction: column;
|
justify-content: center;
|
align-items: center;
|
color: #999999;
|
border: 1px solid #e4e4e4;
|
|
.icon {
|
font-size: 24px;
|
}
|
|
.text {
|
font-size: 12px;
|
}
|
}
|
|
.side_title {
|
font-weight: 600;
|
font-size: 18px;
|
color: #111111;
|
margin-bottom: 20px;
|
margin-left: 20px;
|
margin-top: 20px;
|
}
|
|
.modal_wrap {
|
display: flex;
|
height: 100%;
|
|
.modal_content {
|
flex: 1;
|
padding: 0px 30px;
|
border-radius: 8px;
|
overflow: hidden;
|
height: 100%;
|
|
.title {
|
font-weight: 600;
|
font-size: 18px;
|
color: #333333;
|
margin-bottom: 20px;
|
margin-top: 30px;
|
}
|
|
.info {
|
.list {
|
display: flex;
|
flex-wrap: wrap;
|
|
.item {
|
display: flex;
|
width: 40%;
|
margin-bottom: 20px;
|
|
&:nth-of-type(2n) {
|
width: 60%;
|
}
|
|
.label {
|
color: #888888;
|
width: 100px;
|
}
|
|
.value {
|
flex: 1;
|
color: #111111;
|
}
|
}
|
}
|
}
|
|
.header {
|
display: flex;
|
justify-content: space-between;
|
align-items: center;
|
padding: 20px 30px;
|
margin: 0 -30px;
|
border-radius: 8px 8px 0 0;
|
background: linear-gradient(to right, #f2f6fe, #cadffa);
|
|
.h1 {
|
font-weight: 600;
|
font-size: 22px;
|
color: #111111;
|
margin-bottom: 8px;
|
}
|
|
.time {
|
font-size: 14px;
|
color: #999999;
|
}
|
|
.right {
|
height: 40px;
|
font-size: 16px;
|
color: #ffffff;
|
line-height: 40px;
|
padding: 0 20px;
|
background: #207ff7;
|
box-shadow: 4px 4px 0px 0px rgba(32, 127, 247, 0.16);
|
border-radius: 16px 0px 16px 0px;
|
}
|
}
|
|
.table_info {
|
.name_wrap {
|
display: flex;
|
align-items: center;
|
|
.avatar {
|
width: 40px;
|
height: 40px;
|
border-radius: 50%;
|
margin-right: 12px;
|
}
|
|
.content {
|
.line {
|
display: flex;
|
}
|
|
.tag {
|
color: #b2cbf9;
|
border: 1px solid #b2cbf9;
|
padding: 0px 4px;
|
border-radius: 4px;
|
margin-left: 6px;
|
}
|
}
|
}
|
}
|
}
|
|
.side {
|
height: 100%;
|
width: 420px;
|
background: #ffffff;
|
border-left: 20px solid #f7f7f7;
|
|
.list {
|
.item {
|
padding: 8px 0;
|
position: relative;
|
|
.separate {
|
position: absolute;
|
border-left: 2px dashed #cccccc;
|
left: 31px;
|
height: calc(100% - 30px);
|
top: 49px;
|
}
|
|
.avatar {
|
width: 40px;
|
height: 40px;
|
border-radius: 50%;
|
margin: 0 12px 0 16px;
|
//border: 1px solid;
|
}
|
|
.childList {
|
display: flex;
|
flex-wrap: wrap;
|
margin-left: 100px;
|
}
|
|
.company {
|
font-size: 13px;
|
color: #888888;
|
|
.status {
|
color: $primaryColor;
|
}
|
}
|
|
.m_content {
|
display: flex;
|
flex-direction: column;
|
align-items: center;
|
justify-content: center;
|
margin-bottom: 4px;
|
}
|
|
.info {
|
display: flex;
|
align-items: center;
|
margin-left: 20px;
|
|
.icon {
|
position: relative;
|
z-index: 11;
|
color: #53b76f;
|
font-size: 24px;
|
}
|
|
.icon1 {
|
position: relative;
|
z-index: 11;
|
color: deepskyblue;
|
font-size: 24px;
|
}
|
|
.icon2 {
|
position: relative;
|
z-index: 11;
|
color: #dc362e;
|
font-size: 24px;
|
}
|
|
.iconnew {
|
width: 24px;
|
height: 24px;
|
}
|
|
.icon3 {
|
position: relative;
|
z-index: 11;
|
color: gray;
|
font-size: 24px;
|
}
|
|
.content {
|
flex: 1;
|
|
.line {
|
display: flex;
|
justify-content: space-between;
|
align-content: center;
|
margin-bottom: 6px;
|
|
.status {
|
color: #888888;
|
}
|
|
.padding {
|
color: $primaryColor;
|
}
|
|
.name {
|
font-weight: 600;
|
font-size: 16px;
|
color: #111111;
|
}
|
|
.time {
|
color: #888888;
|
}
|
}
|
}
|
}
|
|
.remark {
|
background: #f7f7f7;
|
border-radius: 4px;
|
padding: 13px 15px;
|
color: #666666;
|
margin-left: 100px;
|
}
|
}
|
}
|
}
|
}
|
</style>
|