Files
dvcp_v2_webapp/project/xiushan/apps/processManagement/approvalManage/components/approvalDetail.vue
2022-12-01 09:35:20 +08:00

993 lines
31 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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 v-if="!!detailObj.objId" #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 PersonCreditReport from "../../../../components/personCreditReport";
import EnterpriseDialog from "../../../../components/enterpriseDialog";
Vue.use(Viewer)
export default {
name: "approvalDetail",
components: {EnterpriseDialog, PersonCreditReport},
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.detailObj
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('/api/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;
:deep(.ai-detail__content--wrapper ){
min-width: 720px;
padding-left: 100px;
}
:deep( .el-scrollbar ){
min-height: 0;
flex: 1;
margin-bottom: 16px;
.is-horizontal {
display: none;
}
.el-scrollbar__wrap {
overflow-x: hidden;
}
}
: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;
}
:deep( .family-info ){
margin-left: 24px;
: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;
}
}
: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 {
: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;
}
:deep( .ailist-title__right ){
font-size: 14px;
color: #5088FF;
user-select: none;
cursor: pointer;
}
:deep( .el-radio ){
margin-bottom: 10px;
}
.dialog-form {
:deep( .el-form-item__label ){
justify-content: flex-end;
}
}
}
</style>