994 lines
31 KiB
Vue
994 lines
31 KiB
Vue
<template>
|
||
<div class="app_detail detail-content details-page">
|
||
<ai-detail>
|
||
<ai-title slot="title" title="审批详情" isShowBack isShowBottomBorder @onBackClick="approval.goBack()">
|
||
<template #rightBtn>
|
||
<template v-if="listType==0&&$permissions('zwsp_oaapprovalapplyinfo_approve')">
|
||
<el-button size="small" icon="iconfont iconClean del-btn-list" @click="agreeRefulse(0)">拒绝</el-button>
|
||
<el-button size="small" type="primary" icon="iconfont iconCorrect" @click="agreeRefulse(1)">同意</el-button>
|
||
</template>
|
||
<el-button v-if="listType==2&&detail.approvalStatus==0&&$permissions('app_oaapprovalapplyinfo_del')"
|
||
size="small" class="iconfont iconRevoke del-btn-list" style="width: 76px;" @click="recall">撤回
|
||
</el-button>
|
||
</template>
|
||
</ai-title>
|
||
<template #content>
|
||
<ai-sidebar :tabTitle="menuList" @change="change"/>
|
||
<el-scrollbar>
|
||
<template v-if="currentMenu==0">
|
||
<ai-card title="基本信息">
|
||
<template #content>
|
||
<ul class="detail_ul">
|
||
<li style="width: 60%">
|
||
<span>审批编号:</span>
|
||
<p>{{ detail.serialNumber }}</p>
|
||
</li>
|
||
<li style="width: 60%">
|
||
<span>发起人:</span>
|
||
<p>{{ detail.createUserName }}</p>
|
||
</li>
|
||
<li>
|
||
<span>所属部门:</span>
|
||
<p> {{ dict.getLabel('hbDepartment', detail.department) || '-' }}</p>
|
||
</li>
|
||
<li>
|
||
<span>所属分类:</span>
|
||
<p>{{ detail.classificationName }}</p>
|
||
</li>
|
||
<li>
|
||
<span>申请时间:</span>
|
||
<p>{{ detail.createTime |format }}</p>
|
||
</li>
|
||
</ul>
|
||
<svg class="svgStatus" aria-hidden="true">
|
||
<use xlink:href="#iconsp_ing" v-if="detail.approvalStatus==0"></use>
|
||
<use xlink:href="#iconsp-pass" v-if="detail.approvalStatus==1"></use>
|
||
<use xlink:href="#iconsp_refused" v-if="detail.approvalStatus==2"></use>
|
||
<use xlink:href="#iconcancel" v-if="detail.approvalStatus==3"></use>
|
||
</svg>
|
||
</template>
|
||
</ai-card>
|
||
</template>
|
||
<template v-if="currentMenu==1">
|
||
<ai-card title="申请表单">
|
||
<template #right>
|
||
<ai-dialog-btn text="信息报告" :dialog-title="cpConfig.dialogTitle">
|
||
<component :is="cpConfig.component" v-bind="cpConfig.params"/>
|
||
</ai-dialog-btn>
|
||
</template>
|
||
<template #content>
|
||
<el-form label-suffix=":" label-width="180px" size="small">
|
||
<div class="border-wrap">
|
||
<div v-for="(item, index) in applyForm" :key="index">
|
||
<ai-title :title="index"/>
|
||
<el-form-item v-for="e in item" :key="e.id" :label="[e.fieldName,e.fieldNameSuffix].join('')">
|
||
<el-input :value="getFieldValue(e)" readonly style="width: 100%;" v-if="e.fieldDataType!=5"/>
|
||
<el-checkbox-group v-else v-model="!e.fieldValue ? '' : String(e.fieldValue).split(',')">
|
||
<el-checkbox :label="val.dictValue" disabled v-for="(val,idx) in dict.getDict(e.dictionaryCode)" :key="idx">
|
||
{{ val.dictName }}
|
||
</el-checkbox>
|
||
</el-checkbox-group>
|
||
</el-form-item>
|
||
</div>
|
||
<template v-if="applyForm=={}">
|
||
<div class="no-data"></div>
|
||
</template>
|
||
</div>
|
||
</el-form>
|
||
</template>
|
||
</ai-card>
|
||
</template>
|
||
<template v-if="currentMenu==2">
|
||
<ai-card title="附件材料">
|
||
<template #content>
|
||
<ai-table :tableData="detailObj.annexs" :colConfigs="colConfigs" :isShowPagination="false"
|
||
:header-cell-style="{fontWeight:'bold',color:'#333'}">
|
||
<el-table-column slot="annex" label="材料附件">
|
||
<template v-slot="{row}">
|
||
<img class="tableImage" :src="row.annexFile.url" alt="" v-viewer>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column slot="options" label="操作" align="center">
|
||
<template v-slot="{row}">
|
||
<el-button v-if="row.exampleFile" @click="downFile(row.exampleFile.accessUrl)" type="text">查看样例
|
||
</el-button>
|
||
<el-button v-if="row.emptyFile" @click="downFile(row.emptyFile.accessUrl)" type="text">下载空表
|
||
</el-button>
|
||
</template>
|
||
</el-table-column>
|
||
</ai-table>
|
||
</template>
|
||
</ai-card>
|
||
</template>
|
||
<template v-if="currentMenu==3">
|
||
<ai-card title="审批记录">
|
||
<template #content>
|
||
<div class="add_record">
|
||
<el-steps direction="vertical">
|
||
<el-step v-for="(item,index) in processList" :key="index"
|
||
:class="item.isCancelItem ? 'bg-999' : ''">
|
||
<div slot="icon" class="record_icon">
|
||
<span class="icon_img iconfont iconAll_Profile"
|
||
v-if="!item.stepAvatar && !item.userName"></span>
|
||
<img v-if="item.stepAvatar" :src="item.stepAvatar" alt="" width="40px" height="40px"
|
||
style="border-radius: 50%;margin-top: 3px;" :style="{right:item.stepAvatar?'-12px':''}">
|
||
<span class="icon_img"
|
||
v-if="!item.stepAvatar && item.userName">{{ item.userName.slice(-2) }}</span>
|
||
|
||
<svg class="svgProgress" aria-hidden="true" v-if="['0','1','6'].includes(item.stepType)">
|
||
<use xlink:href="#iconsptg"></use>
|
||
</svg>
|
||
|
||
<svg class="svgProgress" aria-hidden="true" v-if="['3','4'].includes(item.stepType)"
|
||
:style="{right:!item.stepAvatar?'-8px':''}">
|
||
<use xlink:href="#icondsp"></use>
|
||
</svg>
|
||
|
||
<svg class="svgProgress" aria-hidden="true" v-if="item.stepType==8">
|
||
<use xlink:href="#iconRecalled"></use>
|
||
</svg>
|
||
|
||
<svg class="svgProgress" aria-hidden="true" v-if="item.stepType==2">
|
||
<use xlink:href="#iconNo_Effect"></use>
|
||
</svg>
|
||
|
||
</div>
|
||
<div slot="title" class="record_title">
|
||
<p>{{ item.title }}</p>
|
||
<span>{{ item.approvalTime && moment(item.approvalTime).format("YYYY-MM-DD HH:mm") }}</span>
|
||
</div>
|
||
<div slot="description" class="record_desc">
|
||
<p class="desc_name">
|
||
{{ item.title2 }}
|
||
<span :style="{color:color(item.stepType)}">{{ item.title2Desc }}</span>
|
||
</p>
|
||
<!-- <p class="desc_name">{{item.userName}}</p>-->
|
||
|
||
<span class="desc_name" v-if="item.opinion"
|
||
style="line-height: 26px;">审批意见:{{ item.opinion }}</span>
|
||
<ul class="desc_ul">
|
||
<li class="desc_li" v-if="item.candidateFieldInfos && item.candidateFieldInfos.length"
|
||
style="display: flex;flex-direction: column;">
|
||
<div v-for="(m,i) in item.candidateFieldInfos" :key="i" style="margin-left: 10px;">
|
||
<div class="desc_div">{{ m.fieldName }}
|
||
<span v-if="m.fieldNameSuffix" v-text="m.fieldNameSuffix"/>
|
||
:{{ m.dictionaryCode ? dict.getLabel(m.dictionaryCode, m.fieldValue) : m.fieldValue }}
|
||
</div>
|
||
</div>
|
||
</li>
|
||
<li class="desc_li">
|
||
<span class="li_opinion" v-if="item.annexFiles && item.annexFiles.length>0">审批附件:</span>
|
||
<div style="flex: 1;">
|
||
<div class="desc_div">
|
||
<el-image v-for="(value,_v) in item.pictureFiles" :key="_v" :preview-src-list="[value.accessUrl]"
|
||
:src="value.accessUrl" alt="图片" width="80px" height="80px"
|
||
style="border: 1px solid #ddd;cursor: pointer;"/>
|
||
</div>
|
||
<ul class="file_ul">
|
||
<li v-for="(v,_i) in item.annexFiles" :key="_i" @click="downFile(v.accessUrl)">
|
||
<p>{{ v.name }}</p>
|
||
<span>{{ Math.round(v.size / 1024) }}KB</span>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
<ul class="desc_ul dia_ul">
|
||
<li v-for="(value,index) in item.candidates" :key="index">
|
||
<p class="right_name" v-if="value.name">
|
||
<span v-if="!value.avatar">{{ value.name.slice(-2) }}</span>
|
||
<img v-else :src="value.avatar" alt="" width="40px" height="40px"
|
||
style="border-radius: 50%;">
|
||
</p>
|
||
<p style="text-align: center;margin-top: 4px;">{{ value.name }}</p>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</el-step>
|
||
</el-steps>
|
||
</div>
|
||
</template>
|
||
</ai-card>
|
||
</template>
|
||
<template v-if="currentMenu==4 && detailObj.tableType && detailObj.tableType === '2'">
|
||
<ai-card title="签署文件">
|
||
<template #right>
|
||
<el-button type="primary" @click="handleDownload">下载文件</el-button>
|
||
</template>
|
||
<template #content>
|
||
<div class="sealFile">
|
||
<el-image :src="sealFileURL" :preview-src-list="[sealFileURL]">
|
||
<ai-empty slot="error"/>
|
||
</el-image>
|
||
</div>
|
||
</template>
|
||
</ai-card>
|
||
</template>
|
||
</el-scrollbar>
|
||
</template>
|
||
</ai-detail>
|
||
<!--审批同意、拒绝-->
|
||
<el-dialog :title="titleType" center :visible.sync="isAgree" width="720px" v-loading="loading"
|
||
:close-on-click-modal="false" @close="form.fieldInfos = []">
|
||
<div style="max-height: 400px;overflow-y: auto;">
|
||
<el-form size="small" :model="form" label-width="120px" ref="ruleForm" label-position="right"
|
||
class="dialog-form">
|
||
<el-form-item v-for="(op,i) in form.fieldInfos" :key="i"
|
||
:label="op.fieldName + (op.fieldNameSuffix ? op.fieldNameSuffix : '')" class="dynamicFormItem"
|
||
:prop="`fieldInfos.${i}.fieldValue`"
|
||
:rules="{required:op.mustFill==1,message:`请输入${op.fieldName}`}">
|
||
<el-input placeholder="请输入..." v-model.number="op.fieldValue"
|
||
clearable v-if="op.fieldDataType=='0'" show-word-limit :maxlength="op.fieldLength"/>
|
||
|
||
<el-input type="textarea" :rows="3" placeholder="请输入..." v-model.trim="op.fieldValue"
|
||
clearable v-if="op.fieldDataType=='1'" show-word-limit
|
||
:maxlength="op.fieldLength"/>
|
||
|
||
<el-radio-group style="width: 100%;" v-if="op.fieldDataType==4" v-model="op.fieldValue">
|
||
<el-radio :label="k.dictValue" v-for="(k,m) in dict.getDict(op.dictionaryCode)" :key="m">
|
||
{{ k.dictName }}
|
||
</el-radio>
|
||
</el-radio-group>
|
||
|
||
<el-date-picker
|
||
v-if="op.fieldDataType==3"
|
||
v-model.trim="op.fieldValue"
|
||
format="yyyy年MM月dd日"
|
||
value-format="yyyy年MM月dd日"
|
||
type="date"
|
||
placeholder="请选择">
|
||
</el-date-picker>
|
||
<ai-select v-if="op.fieldDataType=='9'" v-model="op.fieldValue" :selectList="dict.getDict(op.dictionaryCode)"/>
|
||
</el-form-item>
|
||
<el-form-item label="指定审批人" prop="appointNextCandidateId" :rules="[{ required: true, message: '请选择指定审批人'}]" v-if="form.nextNodeAreaFilter==3">
|
||
<ai-select v-model="form.appointNextCandidateId" :selectList="form.nextCandidateList"/>
|
||
</el-form-item>
|
||
<el-form-item label="审批意见" prop="opinion" :rules="[{ required: true, message: '请输入审批意见', trigger: 'blur' }]" v-if="!form.pass">
|
||
<el-input type="textarea" :rows="4" v-model.trim="form.opinion" placeholder="请输入" show-word-limit :maxlength="150"/>
|
||
</el-form-item>
|
||
<el-form-item label="图片" prop="imgList" style="position: relative;" v-if="form.pictureEnable==1">
|
||
<span style="position: absolute;left: -78px;top: 18px;font-size: 12px;color: #999;">(最多9张)</span>
|
||
<el-upload
|
||
action
|
||
class="upload-demo"
|
||
multiple
|
||
list-type="picture-card"
|
||
:http-request="uploadImg"
|
||
:on-remove="handleRemoveImg"
|
||
:on-change="handleChangeImg"
|
||
:file-list="imgList"
|
||
:limit="9"
|
||
accept=".jpg,.png,.jpeg"
|
||
:on-exceed="()=>$message.error('最多只能上传9张图片!')">
|
||
<div style="position: relative;">
|
||
<span class="iconfont iconPhoto" style="font-size: 35px;"></span>
|
||
<p style="position: absolute;top: 30px;left: 46px;">上传图片</p>
|
||
</div>
|
||
</el-upload>
|
||
</el-form-item>
|
||
<el-form-item label="附件" prop="fileList" v-if="form.annexEnable==1">
|
||
<el-upload
|
||
class="upload-demo"
|
||
action
|
||
multiple
|
||
accept=".zip,.rar,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.txt,.jpg,.png"
|
||
:http-request="uploadFile"
|
||
:on-exceed="()=>$message.error('最多只能上传9个附件!')"
|
||
:on-remove="handleRemove"
|
||
:on-change="handleChange"
|
||
:limit="9"
|
||
:file-list="fileList">
|
||
<el-button size="mini"> 添加附件</el-button>
|
||
<div slot="tip" class="el-upload__tip">
|
||
<p style="line-height: 0;">最多上传9个附件,单个文件最大10MB </p>
|
||
<p style="line-height: 40px;">
|
||
支持.zip、.rar、.doc、.docx、.xls、.xlsx、.ppt、.pptx、.pdf、.txt、.jpg、.png格式</p>
|
||
</div>
|
||
</el-upload>
|
||
</el-form-item>
|
||
</el-form>
|
||
</div>
|
||
<div slot="footer" style="text-align: center;">
|
||
<el-button style="width: 92px;" size="small" @click="cancel()">取消</el-button>
|
||
<el-button style="width: 92px;" size="small" type="primary" @click="saveAgree">确认
|
||
</el-button>
|
||
</div>
|
||
</el-dialog>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import moment from 'dayjs'
|
||
import {mapState} from "vuex";
|
||
import Viewer from 'v-viewer'
|
||
import Vue from 'vue'
|
||
import AiDialogBtn from "../../../../components/AiDialogBtn";
|
||
import PersonCreditReport from "../../../../components/personCreditReport";
|
||
import EnterpriseDialog from "../../../../components/enterpriseDialog";
|
||
|
||
Vue.use(Viewer)
|
||
|
||
export default {
|
||
name: "approvalDetail",
|
||
components: {EnterpriseDialog, PersonCreditReport, AiDialogBtn},
|
||
inject: ['approval'],
|
||
props: {
|
||
instance: Function,
|
||
dict: Object,
|
||
permissions: Function,
|
||
detail: Object,
|
||
listType: String
|
||
},
|
||
data() {
|
||
return {
|
||
moment,
|
||
currentMenu: 0,
|
||
detailObj: {},
|
||
dataList: [],
|
||
processList: [],
|
||
isAgree: false,
|
||
form: {
|
||
id: '',
|
||
pass: true,
|
||
annex: '',
|
||
picture: '',
|
||
option: "",
|
||
transfers: [],
|
||
fieldInfos: []
|
||
},
|
||
form1: {
|
||
transfers: [],
|
||
type: 1
|
||
},
|
||
allPerson: [],
|
||
imgList: [],
|
||
fileList: [],
|
||
alreadyList: [],//已审批的
|
||
imgUrl: '',
|
||
url: "/admin/sysunit/getAll2",
|
||
applyForm: {},
|
||
menuList: ["基本信息", '申请表单', '附件材料', "审批记录"],
|
||
loading: false,
|
||
areaId: "",
|
||
}
|
||
},
|
||
computed: {
|
||
rules() {
|
||
return {
|
||
transfers: [
|
||
{required: true, message: '请选择转办人', trigger: 'change'}
|
||
]
|
||
}
|
||
},
|
||
...mapState(['user']),
|
||
sealFileURL() {
|
||
return this.detailObj?.pdfPicFile?.accessUrl || ""
|
||
},
|
||
colConfigs() {
|
||
return [
|
||
{label: "材料名称", prop: "annexName"},
|
||
{slot: "annex"},
|
||
{slot: "options"}
|
||
]
|
||
},
|
||
titleType: v => v.form.pass ? '审批同意' : '审批拒绝',
|
||
cpConfig() {
|
||
const {objId, objType} = this.detail
|
||
let configs = {
|
||
0: {dialogTitle: "个人信息报告", params: {...this.$props, personId: objId}, component: PersonCreditReport},
|
||
1: {dialogTitle: "企业信息报告", params: {...this.$props, enterpriseId: objId}, component: EnterpriseDialog},
|
||
}
|
||
return configs?.[objType] || {}
|
||
}
|
||
},
|
||
methods: {
|
||
handleDownload() {
|
||
const aLink = document.createElement('a')
|
||
aLink.download = this.detailObj.pdfFile.fileName || "签署文件"
|
||
aLink.href = this.detailObj.pdfFile.url
|
||
aLink.dispatchEvent(new MouseEvent('click', {}))
|
||
},
|
||
change(index) {
|
||
this.currentMenu = index
|
||
this.searchLog(index)
|
||
},
|
||
getValue(e, val) {
|
||
return e.dictionaryCode && this.dict.getLabel(e.dictionaryCode, val)
|
||
},
|
||
getFieldValue(e) {
|
||
return !!e.dictionaryCode ? this.dict.getLabel(e.dictionaryCode, e.fieldValue) : e.fieldValue
|
||
},
|
||
getAreaName(e) {
|
||
return e.areaValue
|
||
},
|
||
color(status) {
|
||
return ['#2EA222', '#2EA222', '#FF4466', '#2EA222', '#FF8822', '#2EA222', '#2EA222', '#FF4466', '#FF8822', '#FF8822'][+status]
|
||
},
|
||
/**
|
||
* 转办
|
||
*/
|
||
onConfirm() {
|
||
this.$refs["ruleForm1"].validate(valid => {
|
||
if (valid) {
|
||
this.form1.id = this.detail.id;
|
||
this.instance.post('/oa/approv-alapply-info/approval', this.form1).then(res => {
|
||
if (res && res.code == 0) {
|
||
this.$message.success("转办成功");
|
||
this.approval.goBack()
|
||
}
|
||
})
|
||
}
|
||
})
|
||
},
|
||
cancel() {
|
||
this.form = {id: '', pass: true, annex: '', picture: '', fieldInfos: []}
|
||
this.imgList = []
|
||
this.fileList = []
|
||
this.isAgree = false
|
||
},
|
||
// 下载
|
||
downFile(url) {
|
||
window.open(url);
|
||
},
|
||
searchLog(index) {
|
||
if (index == 3) {
|
||
this.instance.post('/app/approv-alapply-info/processinfo-id2', null, {
|
||
params: {id: this.detail.id}
|
||
}).then(res => {
|
||
if (res && res.data) {
|
||
let cancelIndex = ''
|
||
let isCancel = false
|
||
let dictionaryArr = []
|
||
res.data.map((item, index) => {
|
||
item.isCancelItem = false
|
||
if (item.stepType == 8) {
|
||
cancelIndex = index
|
||
isCancel = true
|
||
}
|
||
|
||
if (item.candidateFieldInfos) {
|
||
item.candidateFieldInfos.map(e => {
|
||
if (e.dictionaryCode && dictionaryArr.indexOf(e.dictionaryCode) == -1) {
|
||
dictionaryArr.push(e.dictionaryCode)
|
||
}
|
||
})
|
||
}
|
||
})
|
||
if (isCancel) {
|
||
res.data.map((item, index) => {
|
||
if (index > cancelIndex) {
|
||
item.isCancelItem = true
|
||
}
|
||
})
|
||
}
|
||
if (dictionaryArr.length) {
|
||
this.dict.load(dictionaryArr)
|
||
}
|
||
this.processList = res.data;
|
||
}
|
||
})
|
||
}
|
||
},
|
||
// 节点记录
|
||
searchDetail(id) {
|
||
this.instance.post('/app/approv-alapply-info/info-id-table', null, {
|
||
params: {id}
|
||
}).then(res => {
|
||
if (res && res.data) {
|
||
this.detailObj = res.data
|
||
let dicts = []
|
||
res.data.tableInfo.tableFieldInfos.map(item => {
|
||
item.dictionaryCode && dicts.push(item.dictionaryCode)
|
||
if (item.fieldType == 0) {
|
||
let {groupName} = item
|
||
this.applyForm[groupName]?.push(item) || (this.applyForm[groupName] = [item])
|
||
}
|
||
})
|
||
|
||
this.dict.load(dicts)
|
||
if (res.data.approvalStatus == 1) {
|
||
this.menuList.push('签署文件')
|
||
}
|
||
}
|
||
})
|
||
},
|
||
// 上传图片
|
||
uploadImg(file) {
|
||
const isLt10M = file.file.size / 1024 / 1024 < 10;
|
||
if (!isLt10M) {
|
||
this.$message.error("附件大小不超过10mb!");
|
||
for (let i = 0; i < this.imgList.length; i++) {
|
||
if (this.imgList[i].uid == file.file.uid) {
|
||
this.imgList.splice(i, 1);
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
let formData = new FormData();
|
||
formData.append("file", file.file);
|
||
this.instance.post(`/admin/file/add`, formData).then(res => {
|
||
if (res && res.code == 0) {
|
||
let img = res.data[0].split(';');
|
||
this.imgList.forEach((item, index) => {
|
||
if (item.uid == file.file.uid) {
|
||
this.imgList[index].id = img[1];
|
||
}
|
||
})
|
||
}
|
||
});
|
||
},
|
||
handleRemoveImg(file, fileList) {
|
||
this.imgList = fileList;
|
||
},
|
||
handleChangeImg(file, fileList) {
|
||
this.imgList = fileList;
|
||
},
|
||
// 上传附件
|
||
uploadFile: function (file) {
|
||
const isLt10M = file.file.size / 1024 / 1024 < 10;
|
||
if (!isLt10M) {
|
||
this.$message.error("附件大小不超过10mb!");
|
||
for (let i = 0; i < this.fileList.length; i++) {
|
||
if (this.fileList[i].uid == file.file.uid) {
|
||
this.fileList.splice(i, 1);
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
let formData = new FormData();
|
||
formData.append("file", file.file);
|
||
this.instance.post(`/admin/file/add`, formData, {withCredentials: false}).then(res => {
|
||
if (res && res.code == 0) {
|
||
let img = res.data[0].split(';');
|
||
this.fileList.forEach((item, index) => {
|
||
if (item.uid == file.file.uid) {
|
||
this.fileList[index].id = img[1];
|
||
}
|
||
})
|
||
}
|
||
});
|
||
},
|
||
handleRemove(file, fileList) {
|
||
this.fileList = fileList;
|
||
},
|
||
handleChange(file, fileList) {
|
||
this.fileList = fileList;
|
||
},
|
||
|
||
/**
|
||
* 同意和拒绝
|
||
* @param index
|
||
*/
|
||
agreeRefulse(index) {
|
||
let dictionaryArr = []
|
||
this.loading = true
|
||
this.instance.post(`/app/approv-alapply-info/approval-popup?id=${this.detail.id}&type=${index}`).then(res => {
|
||
if (res?.data) {
|
||
if (index == 1) {
|
||
this.form = res.data
|
||
this.form.fieldInfos = res.data.fieldInfos.filter(e => e.fieldType == 3)
|
||
this.form.nextCandidateList = this.form.nextCandidateList?.map(e => ({dictValue: e.candidate, dictName: e.name}))
|
||
this.form.fieldInfos.map(e => {
|
||
if (e.dictionaryCode && !dictionaryArr.includes(e.dictionaryCode)) {
|
||
dictionaryArr.push(e.dictionaryCode)
|
||
}
|
||
})
|
||
dictionaryArr.length > 0 && this.dict.load(dictionaryArr)
|
||
}
|
||
this.form.pass = index == 1
|
||
this.isAgree = true;
|
||
}
|
||
}).finally(() => this.loading = false)
|
||
},
|
||
saveAgree() {
|
||
this.form.id = this.detail.id;
|
||
let arr = [];
|
||
let brr = [];
|
||
this.imgList.map(v => {
|
||
arr.push(v.id)
|
||
});
|
||
this.form.picture = arr.join(',');
|
||
this.fileList.map(_v => {
|
||
brr.push(_v.id)
|
||
});
|
||
this.form.transfers = this.allPerson.candidateList;
|
||
this.form.annex = brr.join(',');
|
||
this.$refs["ruleForm"].validate((valid) => {
|
||
if (valid) {
|
||
this.loading = true
|
||
this.instance.post('/app/approv-alapply-info/approval', this.form).then((res) => {
|
||
if (res?.code == 0) {
|
||
this.$message.success('审批已提交!');
|
||
this.isAgree = false
|
||
this.loading = false
|
||
this.approval.goBack()
|
||
}
|
||
}).catch((err) => {
|
||
this.$message.error(err.response.data.msg || "服务器异常")
|
||
this.loading = false
|
||
})
|
||
}
|
||
});
|
||
},
|
||
// 撤回
|
||
recall() {
|
||
this.$confirm("确定撤回该审批吗?").then(() => {
|
||
this.instance.post('/app/approv-alapply-info/cancel', null, {
|
||
params: {id: this.detail.id}
|
||
}).then((res) => {
|
||
if (res && res.code == 0) {
|
||
this.approval.goBack()
|
||
}
|
||
}).catch(() => {
|
||
})
|
||
})
|
||
},
|
||
},
|
||
created() {
|
||
this.dict.load(['nodeType', 'approvalStatus', 'hbDepartment', 'sex', 'nation', 'marital', 'education', 'yesOrNo'])
|
||
// this.areaId = this.user.info.areaId.substring(0, 6) + '000000'
|
||
this.searchDetail(this.detail.id);
|
||
this.searchLog(this.currentMenu)
|
||
},
|
||
filters: {
|
||
format(time) {
|
||
return time ? moment(time).format("YYYY-MM-DD HH:mm") : '-'
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style scoped lang="scss">
|
||
.app_detail {
|
||
height: 100%;
|
||
display: flex;
|
||
flex-direction: column;
|
||
overflow: auto;
|
||
|
||
::v-deep.ai-detail__content--wrapper {
|
||
min-width: 720px;
|
||
padding-left: 100px;
|
||
}
|
||
|
||
::v-deep .el-scrollbar {
|
||
min-height: 0;
|
||
flex: 1;
|
||
margin-bottom: 16px;
|
||
|
||
.is-horizontal {
|
||
display: none;
|
||
}
|
||
|
||
.el-scrollbar__wrap {
|
||
overflow-x: hidden;
|
||
}
|
||
|
||
}
|
||
|
||
::v-deep .dynamicFormItem {
|
||
.el-form-item__label {
|
||
line-height: normal;
|
||
display: flex;
|
||
align-items: center;
|
||
}
|
||
}
|
||
|
||
.tableImage {
|
||
width: 64px;
|
||
height: 64px;
|
||
}
|
||
|
||
.border-wrap {
|
||
box-sizing: border-box;
|
||
padding: 20px;
|
||
width: 100%;
|
||
min-height: 100px;
|
||
border: 1px solid #6FAFFF;
|
||
|
||
.no-data {
|
||
background-size: 120px 120px;
|
||
height: 160px;
|
||
margin: 48px auto 10px;
|
||
}
|
||
|
||
.small-input {
|
||
width: 48px;
|
||
margin: 0 8px;
|
||
}
|
||
|
||
::v-deep .family-info {
|
||
margin-left: 24px;
|
||
|
||
::v-deep .el-form-item__content {
|
||
margin-left: 24px !important;
|
||
}
|
||
}
|
||
}
|
||
|
||
.svgStatus {
|
||
position: absolute;
|
||
top: -20px;
|
||
right: 20px;
|
||
width: 90px;
|
||
}
|
||
|
||
.detail_ul {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
flex-wrap: wrap;
|
||
font-size: 14px;
|
||
margin-bottom: 20px;
|
||
|
||
li {
|
||
width: 33%;
|
||
display: flex;
|
||
margin-bottom: 8px;
|
||
|
||
span {
|
||
width: 70px;
|
||
color: #999;
|
||
}
|
||
|
||
p {
|
||
flex: 1;
|
||
color: #333;
|
||
}
|
||
}
|
||
|
||
img {
|
||
margin-right: 16px;
|
||
margin-bottom: 16px;
|
||
}
|
||
}
|
||
|
||
.file_ul {
|
||
li {
|
||
height: 40px;
|
||
line-height: 40px;
|
||
border: 1px solid #D0D4DC;
|
||
border-radius: 4px;
|
||
margin-bottom: 16px;
|
||
padding: 0 8px;
|
||
font-size: 14px;
|
||
color: #333;
|
||
display: flex;
|
||
justify-content: space-between;
|
||
cursor: pointer;
|
||
|
||
span {
|
||
color: #999;
|
||
}
|
||
}
|
||
|
||
li:hover {
|
||
color: #2266FF;
|
||
}
|
||
}
|
||
|
||
::v-deep.add_record {
|
||
.el-step.is-vertical .el-step__line {
|
||
width: 1px;
|
||
left: 20px;
|
||
}
|
||
|
||
.el-step__icon {
|
||
width: 40px;
|
||
height: 40px;
|
||
background-color: #2266FF;
|
||
border: 1px solid #fff;
|
||
}
|
||
|
||
.el-step__main {
|
||
padding-left: 36px !important;
|
||
margin-bottom: 30px;
|
||
}
|
||
|
||
.bg-999 {
|
||
color: #999;
|
||
|
||
.el-step__icon {
|
||
background-color: #D0D4DC !important;
|
||
}
|
||
|
||
.el-step__line {
|
||
background-color: #fff;
|
||
}
|
||
|
||
.record_title {
|
||
p {
|
||
color: #999 !important;
|
||
}
|
||
}
|
||
|
||
.desc_name, .desc_ul {
|
||
color: #999 !important;
|
||
}
|
||
}
|
||
|
||
.step-hide {
|
||
.el-step__line {
|
||
background-color: #fff;
|
||
}
|
||
}
|
||
|
||
|
||
.dia_ul {
|
||
justify-content: left;
|
||
flex-wrap: wrap;
|
||
|
||
li {
|
||
margin-bottom: 10px;
|
||
}
|
||
}
|
||
|
||
|
||
.right_name {
|
||
border: 1px solid #fff;
|
||
width: 40px;
|
||
height: 40px;
|
||
border-radius: 50%;
|
||
line-height: 40px;
|
||
text-align: center;
|
||
font-size: 14px;
|
||
background-color: #2266FF;
|
||
color: #fff;
|
||
margin: 0 20px;
|
||
position: relative;
|
||
|
||
.el-icon-arrow-right, .el-icon-circle-plus {
|
||
position: absolute;
|
||
top: 15px;
|
||
right: -30px;
|
||
color: #999;
|
||
}
|
||
|
||
.el-icon-error {
|
||
position: absolute;
|
||
top: 0;
|
||
color: #333;
|
||
right: -6px;
|
||
cursor: pointer;
|
||
}
|
||
}
|
||
|
||
|
||
.upload-demo {
|
||
::v-deep .el-icon-close {
|
||
transform: translateX(-50px);
|
||
}
|
||
}
|
||
|
||
.record_icon {
|
||
position: relative;
|
||
|
||
.icon_img {
|
||
width: 40px;
|
||
height: 40px;
|
||
border-radius: 50%;
|
||
// background-color: #2266FF;
|
||
color: #fff;
|
||
line-height: 44px;
|
||
font-size: 14px;
|
||
}
|
||
|
||
.svgProgress {
|
||
height: 14px;
|
||
width: 14px;
|
||
position: absolute;
|
||
bottom: -2px;
|
||
right: -2px;
|
||
}
|
||
|
||
.pro {
|
||
height: 14px;
|
||
width: 14px;
|
||
position: absolute;
|
||
bottom: 2px;
|
||
right: -6px;
|
||
}
|
||
}
|
||
|
||
.record_title {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
|
||
p {
|
||
font-size: 16px;
|
||
color: #333;
|
||
}
|
||
|
||
span {
|
||
font-size: 14px;
|
||
color: #999;
|
||
}
|
||
}
|
||
|
||
.record_desc {
|
||
.desc_name {
|
||
font-size: 14px;
|
||
color: #666;
|
||
}
|
||
|
||
.desc_ul {
|
||
font-size: 14px;
|
||
color: #666;
|
||
|
||
.desc_li {
|
||
display: flex;
|
||
margin-top: 8px;
|
||
|
||
.li_opinion {
|
||
width: 80px;
|
||
}
|
||
|
||
.desc_div {
|
||
flex: 1;
|
||
min-width: 0;
|
||
margin-bottom: 8px;
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
|
||
img {
|
||
margin-right: 8px;
|
||
margin-bottom: 8px;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
.dia_ul {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
margin-top: 10px;
|
||
|
||
li {
|
||
margin-right: 16px;
|
||
}
|
||
}
|
||
|
||
.desc_status {
|
||
color: #2EA222;
|
||
}
|
||
|
||
.desc_status2 {
|
||
color: #FF4466;
|
||
}
|
||
|
||
.desc_status1 {
|
||
color: #FF8822;
|
||
}
|
||
}
|
||
}
|
||
|
||
.right_name {
|
||
border: 1px solid #fff;
|
||
width: 40px;
|
||
height: 40px;
|
||
border-radius: 50%;
|
||
line-height: 40px;
|
||
text-align: center;
|
||
font-size: 14px;
|
||
background-color: #2266FF;
|
||
color: #fff;
|
||
position: relative;
|
||
}
|
||
|
||
::v-deep .ailist-title__right {
|
||
font-size: 14px;
|
||
color: #5088FF;
|
||
user-select: none;
|
||
cursor: pointer;
|
||
}
|
||
|
||
::v-deep .el-radio {
|
||
margin-bottom: 10px;
|
||
}
|
||
|
||
.dialog-form {
|
||
::v-deep .el-form-item__label {
|
||
justify-content: flex-end;
|
||
}
|
||
}
|
||
}
|
||
</style>
|