1066 lines
34 KiB
Vue
1066 lines
34 KiB
Vue
|
|
<template>
|
|||
|
|
<div style="height:100%">
|
|||
|
|
<ai-detail>
|
|||
|
|
<template #title>
|
|||
|
|
<ai-title
|
|||
|
|
:title="basicInfo.parentTaskCode ? '子任务详情' : '任务详情'"
|
|||
|
|
isShowBottomBorder
|
|||
|
|
isShowBack
|
|||
|
|
@onBackClick="onBack()"
|
|||
|
|
>
|
|||
|
|
<template #rightBtn v-if="detailType == 1">
|
|||
|
|
<el-button
|
|||
|
|
type="primary"
|
|||
|
|
icon="iconfont iconReject"
|
|||
|
|
v-if="basicInfo.status == 0"
|
|||
|
|
@click="closeWork()">关闭任务</el-button
|
|||
|
|
>
|
|||
|
|
<el-button
|
|||
|
|
type="primary"
|
|||
|
|
icon="iconfont iconCorrect"
|
|||
|
|
v-if="basicInfo.status == 0"
|
|||
|
|
@click="markCompleted('1')"
|
|||
|
|
>确认完成</el-button
|
|||
|
|
>
|
|||
|
|
<el-button
|
|||
|
|
icon="iconfont iconDelete"
|
|||
|
|
class="del-btn-list"
|
|||
|
|
v-if="basicInfo.status == 1 || basicInfo.status == 2"
|
|||
|
|
@click="deleteTask()"
|
|||
|
|
>删除任务</el-button
|
|||
|
|
>
|
|||
|
|
</template>
|
|||
|
|
</ai-title>
|
|||
|
|
</template>
|
|||
|
|
<template #content>
|
|||
|
|
<ai-card title="任务进度">
|
|||
|
|
<template #right v-if="basicInfo.parentTaskCode && detailType != 2 && detailType != 3">
|
|||
|
|
<el-button type="primary" @click="toParent()">查看父级任务</el-button>
|
|||
|
|
</template>
|
|||
|
|
<template slot="content">
|
|||
|
|
<ai-wrapper class="mar-t16" label-width="80px" :columnsNumber="2">
|
|||
|
|
<ai-info-item
|
|||
|
|
label="任务状态:"
|
|||
|
|
:class="{
|
|||
|
|
color1: basicInfo.status == 0,
|
|||
|
|
color2: basicInfo.status == 1,
|
|||
|
|
color3: basicInfo.status == 2,
|
|||
|
|
}"
|
|||
|
|
><span>{{
|
|||
|
|
dict.getLabel("workTaskStatus", basicInfo.status) || "-"
|
|||
|
|
}}</span></ai-info-item
|
|||
|
|
>
|
|||
|
|
<ai-info-item label="当前进度:"
|
|||
|
|
><span>{{ basicInfo.percent + "%" }}</span></ai-info-item
|
|||
|
|
>
|
|||
|
|
</ai-wrapper>
|
|||
|
|
<div class="echart" id="echart"></div>
|
|||
|
|
</template>
|
|||
|
|
</ai-card>
|
|||
|
|
<ai-card title="任务执行情况">
|
|||
|
|
<template slot="content">
|
|||
|
|
<el-row
|
|||
|
|
type="flex"
|
|||
|
|
justify="space-between"
|
|||
|
|
align="center"
|
|||
|
|
style="margin-bottom: 8px"
|
|||
|
|
>
|
|||
|
|
<el-col :span="16">
|
|||
|
|
<el-radio-group
|
|||
|
|
v-model="ListType"
|
|||
|
|
size="small"
|
|||
|
|
@change="ListTypeChange"
|
|||
|
|
>
|
|||
|
|
<el-radio-button label="userInfoList">执行人</el-radio-button>
|
|||
|
|
<el-radio-button label="checkUserList">督办人</el-radio-button>
|
|||
|
|
<el-radio-button label="sendUserList">抄送人</el-radio-button>
|
|||
|
|
</el-radio-group>
|
|||
|
|
<el-input
|
|||
|
|
v-model="listName"
|
|||
|
|
placeholder="姓名"
|
|||
|
|
size="small"
|
|||
|
|
style="width: 160px; margin-left: 8px"
|
|||
|
|
@input="filterData"
|
|||
|
|
></el-input>
|
|||
|
|
</el-col>
|
|||
|
|
<el-col
|
|||
|
|
:span="8"
|
|||
|
|
class="icon add-icon"
|
|||
|
|
v-if="basicInfo.status == 0"
|
|||
|
|
>
|
|||
|
|
<ai-wechat-selecter style="display: inline-block;" v-if="ListType == 'userInfoList' && detailType == 1"
|
|||
|
|
:instance="instance"
|
|||
|
|
v-model="addUserList"
|
|||
|
|
:disable="appReportTaskDoInfoList"
|
|||
|
|
:isAdd="false"
|
|||
|
|
@change="confirmAdd(1)"
|
|||
|
|
>
|
|||
|
|
<i
|
|||
|
|
class="iconfont iconAdd"
|
|||
|
|
style="color: #5088ff"
|
|||
|
|
>添加执行人</i
|
|||
|
|
>
|
|||
|
|
</ai-wechat-selecter>
|
|||
|
|
|
|||
|
|
<ai-wechat-selecter style="display: inline-block;" v-if="ListType == 'checkUserList' && detailType == 1"
|
|||
|
|
:instance="instance"
|
|||
|
|
:disable="appReportTaskDoInfoList"
|
|||
|
|
v-model="addUserList"
|
|||
|
|
:isAdd="false"
|
|||
|
|
@change="confirmAdd(2)"
|
|||
|
|
>
|
|||
|
|
<i
|
|||
|
|
class="iconfont iconAdd"
|
|||
|
|
style="color: #5088ff"
|
|||
|
|
>添加督办人</i
|
|||
|
|
>
|
|||
|
|
</ai-wechat-selecter>
|
|||
|
|
|
|||
|
|
<ai-wechat-selecter style="display: inline-block;" v-if="ListType == 'sendUserList' && detailType == 1"
|
|||
|
|
:instance="instance"
|
|||
|
|
v-model="addUserList"
|
|||
|
|
:disable="appReportTaskDoInfoList"
|
|||
|
|
:isAdd="false"
|
|||
|
|
@change="confirmAdd(3)"
|
|||
|
|
>
|
|||
|
|
<i
|
|||
|
|
class="iconfont iconAdd"
|
|||
|
|
style="color: #5088ff"
|
|||
|
|
>添加抄送人</i
|
|||
|
|
>
|
|||
|
|
</ai-wechat-selecter>
|
|||
|
|
|
|||
|
|
<i
|
|||
|
|
class="iconfont iconClock"
|
|||
|
|
style="color: #5088ff; margin-left: 8px"
|
|||
|
|
:style="isAll ? 'opacity:0.5' : ''"
|
|||
|
|
v-if="ListType == 'userInfoList' && detailType != 3"
|
|||
|
|
@click="urgeMessageAll()"
|
|||
|
|
>一键催办</i
|
|||
|
|
>
|
|||
|
|
</el-col>
|
|||
|
|
</el-row>
|
|||
|
|
<ai-table :isShowPagination="false"
|
|||
|
|
class="ai-table"
|
|||
|
|
:tableData="basicInfo[ListType]"
|
|||
|
|
:col-configs="colConfigs"
|
|||
|
|
:dict="dict"
|
|||
|
|
>
|
|||
|
|
<el-table-column slot="status" label="任务状态" align="center" v-if="ListType == 'userInfoList'">
|
|||
|
|
<template slot-scope="{ row }">
|
|||
|
|
<span >{{$dict.getLabel("workTaskStatus", row.doStatus)}}</span>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
<el-table-column slot="percent" label="完成时间" align="center" v-if="ListType == 'userInfoList'">
|
|||
|
|
<template slot-scope="{ row }">
|
|||
|
|
<span >{{ row.finishTime|| '-' }}</span>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
<el-table-column slot="percent" label="完成进度" align="center" v-if="ListType == 'userInfoList'">
|
|||
|
|
<template slot-scope="{ row }">
|
|||
|
|
<span>{{ row.percent + '%'}}</span>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
<el-table-column
|
|||
|
|
slot="options"
|
|||
|
|
label="操作"
|
|||
|
|
align="center"
|
|||
|
|
fixed="right"
|
|||
|
|
width="200"
|
|||
|
|
>
|
|||
|
|
<template slot-scope="{ row }">
|
|||
|
|
<div>
|
|||
|
|
<i
|
|||
|
|
class="iconfont iconClock icon-color89B"
|
|||
|
|
title="催办"
|
|||
|
|
:style="
|
|||
|
|
row.doStatus == 0
|
|||
|
|
? row.isSend
|
|||
|
|
? 'opacity:0.5'
|
|||
|
|
: ''
|
|||
|
|
: 'opacity:0.5'
|
|||
|
|
"
|
|||
|
|
style="cursor: pointer"
|
|||
|
|
v-if="ListType == 'userInfoList' && basicInfo.status == 0 && detailType != 3"
|
|||
|
|
@click="urgeMessage(row)"
|
|||
|
|
></i>
|
|||
|
|
<span
|
|||
|
|
class="iconfont iconShow icon-color89B"
|
|||
|
|
title="详情"
|
|||
|
|
v-if="ListType == 'userInfoList'"
|
|||
|
|
style="cursor: pointer; margin-left: 8px"
|
|||
|
|
@click="getExecute(row)"
|
|||
|
|
></span>
|
|||
|
|
<span
|
|||
|
|
class="iconfont iconRevoke icon-color89B"
|
|||
|
|
title="删除"
|
|||
|
|
style="margin-left: 8px; cursor: pointer"
|
|||
|
|
v-if="basicInfo.status == 0 && detailType == 1"
|
|||
|
|
@click="deleteUnit(row)"
|
|||
|
|
></span>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
</ai-table>
|
|||
|
|
</template>
|
|||
|
|
</ai-card>
|
|||
|
|
<ai-card title="任务信息">
|
|||
|
|
<template slot="content">
|
|||
|
|
<ai-wrapper class="mar-t16" label-width="80px" :columnsNumber="2">
|
|||
|
|
<ai-info-item label="发起人:"
|
|||
|
|
><span>{{ basicInfo.sponsorUserName }}</span></ai-info-item
|
|||
|
|
>
|
|||
|
|
<ai-info-item label="创建人:"
|
|||
|
|
><span>{{ basicInfo.createUserName }}</span></ai-info-item
|
|||
|
|
>
|
|||
|
|
<ai-info-item label="创建时间:"
|
|||
|
|
><span>{{ basicInfo.createTime }}</span></ai-info-item
|
|||
|
|
>
|
|||
|
|
</ai-wrapper>
|
|||
|
|
<ai-wrapper class="mar-t16" label-width="80px" :columnsNumber="2">
|
|||
|
|
<ai-info-item label="任务状态:">
|
|||
|
|
<span>{{
|
|||
|
|
dict.getLabel("workTaskStatus", basicInfo.status) || "-"
|
|||
|
|
}}</span>
|
|||
|
|
</ai-info-item>
|
|||
|
|
<ai-info-item label="任务类型:"
|
|||
|
|
><span>{{
|
|||
|
|
$dict.getLabel("workTaskType", basicInfo.type) || "-"
|
|||
|
|
}}</span></ai-info-item
|
|||
|
|
>
|
|||
|
|
</ai-wrapper>
|
|||
|
|
<ai-wrapper class="mar-t16" label-width="80px" :columnsNumber="2">
|
|||
|
|
<ai-info-item label="截止时间:">
|
|||
|
|
<span
|
|||
|
|
>{{ basicInfo.lastTime
|
|||
|
|
}}<i
|
|||
|
|
:style="
|
|||
|
|
basicInfo.isOverTime == 0
|
|||
|
|
? 'color:#FF8822;'
|
|||
|
|
: 'color:#FF4466;'
|
|||
|
|
"
|
|||
|
|
style="margin-left: 8px; font-style: inherit"
|
|||
|
|
v-if="basicInfo.overTimeStatus"
|
|||
|
|
>({{ basicInfo.overTimeStatus }})</i
|
|||
|
|
></span
|
|||
|
|
>
|
|||
|
|
</ai-info-item>
|
|||
|
|
</ai-wrapper>
|
|||
|
|
<ai-wrapper label-width="80px" :columnsNumber="1">
|
|||
|
|
<ai-info-item label="任务说明:"
|
|||
|
|
><span>{{ basicInfo.taskDescription }}</span></ai-info-item
|
|||
|
|
>
|
|||
|
|
</ai-wrapper>
|
|||
|
|
<ai-bar title="附件">
|
|||
|
|
<template
|
|||
|
|
slot="right"
|
|||
|
|
v-if="basicInfo.fileList && basicInfo.fileList.length"
|
|||
|
|
>
|
|||
|
|
<span class="Edit" @click="downFileAll"
|
|||
|
|
><i class="iconfont iconDownload"></i>下载全部</span
|
|||
|
|
>
|
|||
|
|
</template>
|
|||
|
|
</ai-bar>
|
|||
|
|
<ai-file-list
|
|||
|
|
v-if="basicInfo.fileList && basicInfo.fileList.length"
|
|||
|
|
:fileList="basicInfo.fileList"
|
|||
|
|
:fileOps="{ name: 'name', size: 'fileSizeStr' }"
|
|||
|
|
></ai-file-list>
|
|||
|
|
</template>
|
|||
|
|
</ai-card>
|
|||
|
|
<ai-card title="人员信息">
|
|||
|
|
<template slot="content">
|
|||
|
|
<div class="especial">
|
|||
|
|
<span class="people mar-r40 w80">执行人:</span>
|
|||
|
|
<ai-wechat-selecter
|
|||
|
|
slot="append"
|
|||
|
|
isShowUser
|
|||
|
|
:instance="instance"
|
|||
|
|
v-model="basicInfo.userInfoList"
|
|||
|
|
:isAdd="false"
|
|||
|
|
></ai-wechat-selecter>
|
|||
|
|
</div>
|
|||
|
|
<div class="especial">
|
|||
|
|
<span class="people mar-r40 w80">督办人:</span>
|
|||
|
|
<ai-wechat-selecter
|
|||
|
|
slot="append"
|
|||
|
|
isShowUser
|
|||
|
|
:instance="instance"
|
|||
|
|
v-model="basicInfo.checkUserList"
|
|||
|
|
:isAdd="false"
|
|||
|
|
></ai-wechat-selecter>
|
|||
|
|
</div>
|
|||
|
|
<div class="especial">
|
|||
|
|
<span class="people mar-r40 w80">抄送人:</span>
|
|||
|
|
<ai-wechat-selecter
|
|||
|
|
slot="append"
|
|||
|
|
isShowUser
|
|||
|
|
:instance="instance"
|
|||
|
|
v-model="basicInfo.sendUserList"
|
|||
|
|
:isAdd="false"
|
|||
|
|
></ai-wechat-selecter>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
</ai-card>
|
|||
|
|
<el-dialog
|
|||
|
|
class="deleteStyle mask execute"
|
|||
|
|
:visible.sync="executeDialog"
|
|||
|
|
width="800px"
|
|||
|
|
title="执行情况"
|
|||
|
|
:close-on-click-modal="false"
|
|||
|
|
>
|
|||
|
|
<el-dialog
|
|||
|
|
width="520px"
|
|||
|
|
title="执行说明:"
|
|||
|
|
class="deleteStyle mask execute"
|
|||
|
|
:visible.sync="innerVisible"
|
|||
|
|
@close="getExecute(executeInfo)"
|
|||
|
|
:close-on-click-modal="false"
|
|||
|
|
append-to-body
|
|||
|
|
>
|
|||
|
|
<div style="width: 480px; margin: auto; padding: 8px 0">
|
|||
|
|
<el-form
|
|||
|
|
:model="sayInfo"
|
|||
|
|
ref="numberValidateForm"
|
|||
|
|
label-width="100px"
|
|||
|
|
class="demo-ruleForm"
|
|||
|
|
>
|
|||
|
|
<el-form-item label="执行说明:" prop="doDescription">
|
|||
|
|
<el-input
|
|||
|
|
maxlength="1000"
|
|||
|
|
show-word-limit
|
|||
|
|
type="textarea"
|
|||
|
|
:rows="3"
|
|||
|
|
v-model="sayInfo.doDescription"
|
|||
|
|
autocomplete="off"
|
|||
|
|
></el-input>
|
|||
|
|
</el-form-item>
|
|||
|
|
</el-form>
|
|||
|
|
</div>
|
|||
|
|
<div slot="footer" style="text-align: center">
|
|||
|
|
<el-button
|
|||
|
|
style="width: 92px"
|
|||
|
|
size="small"
|
|||
|
|
@click="(innerVisible = false), getExecute(executeInfo)"
|
|||
|
|
>取 消</el-button
|
|||
|
|
>
|
|||
|
|
<el-button
|
|||
|
|
style="width: 92px"
|
|||
|
|
type="primary"
|
|||
|
|
size="small"
|
|||
|
|
@click="updateDescription()"
|
|||
|
|
>确 认</el-button
|
|||
|
|
>
|
|||
|
|
</div>
|
|||
|
|
</el-dialog>
|
|||
|
|
<div
|
|||
|
|
style="
|
|||
|
|
width: 740px;
|
|||
|
|
margin: auto;
|
|||
|
|
padding: 8px 0;
|
|||
|
|
max-height: 600px;
|
|||
|
|
overflow: auto;
|
|||
|
|
"
|
|||
|
|
>
|
|||
|
|
<ai-wrapper class="mar-t16" label-width="80px" :columnsNumber="2">
|
|||
|
|
<ai-info-item label="执行人:"><span>{{ executeInfo.userName }}</span></ai-info-item>
|
|||
|
|
<ai-info-item label="手机号:"><span>{{ executeInfo.phone }}</span></ai-info-item>
|
|||
|
|
</ai-wrapper>
|
|||
|
|
<ai-wrapper label-width="80px" :columnsNumber="1">
|
|||
|
|
<ai-info-item label="所属部门:"><span>{{ executeInfo.unitName }}</span></ai-info-item>
|
|||
|
|
</ai-wrapper>
|
|||
|
|
<ai-wrapper label-width="80px" :columnsNumber="2">
|
|||
|
|
<ai-info-item label="执行状态:">
|
|||
|
|
<p v-if="executeInfo.doStatus == 0" style="color: #ff8822">
|
|||
|
|
未完成
|
|||
|
|
</p>
|
|||
|
|
<p v-if="executeInfo.doStatus == 1" style="color: #2ea222">
|
|||
|
|
已完成
|
|||
|
|
</p>
|
|||
|
|
<p v-if="executeInfo.doStatus == 2">已终止</p>
|
|||
|
|
<p v-if="executeInfo.doStatus == 3">进行中</p>
|
|||
|
|
<p v-if="executeInfo.doStatus == 4">已关闭</p>
|
|||
|
|
<p v-if="executeInfo.doStatus == null">-</p>
|
|||
|
|
</ai-info-item>
|
|||
|
|
<ai-info-item label="完成时间:">
|
|||
|
|
<i style="display: block; font-style: normal">{{
|
|||
|
|
executeInfo.finishTime || "-"
|
|||
|
|
}}</i>
|
|||
|
|
<i
|
|||
|
|
style="color: #ff4466; display: block; font-style: normal"
|
|||
|
|
v-if="executeInfo.overTimeStatus && executeInfo.doStatus == 1"
|
|||
|
|
>({{ executeInfo.overTimeStatus }})</i
|
|||
|
|
>
|
|||
|
|
</ai-info-item>
|
|||
|
|
</ai-wrapper>
|
|||
|
|
<ai-wrapper label-width="80px" :columnsNumber="1">
|
|||
|
|
<ai-info-item label="当前进度:"><span>{{ executeInfo.percent + "%" }}</span></ai-info-item>
|
|||
|
|
</ai-wrapper>
|
|||
|
|
<ai-wrapper label-width="80px" :columnsNumber="1">
|
|||
|
|
<ai-info-item label="执行说明:"><span>{{ executeInfo.doDescription }}</span></ai-info-item>
|
|||
|
|
</ai-wrapper>
|
|||
|
|
|
|||
|
|
<div class="step">
|
|||
|
|
<!-- <el-steps direction="vertical" :active="null" >
|
|||
|
|
<el-step icon="iconfont iconSteps_Finished" v-for="(e,index) in executeInfo.processList" :key="index">
|
|||
|
|
<template v-slot:title>
|
|||
|
|
<p style="color:#333333;">{{e.remarks}}</p>
|
|||
|
|
</template>
|
|||
|
|
<template v-slot:description>
|
|||
|
|
<p style="color:#999999;">完成到 <span :style="e.percent<100 ? 'color:#5088FF':'color:#2EA222' ">{{e.percent}}%</span> | {{e.createDate}}</p>
|
|||
|
|
</template>
|
|||
|
|
</el-step>
|
|||
|
|
|
|||
|
|
</el-steps> -->
|
|||
|
|
<el-timeline>
|
|||
|
|
<el-timeline-item
|
|||
|
|
v-for="(e, index) in executeInfo.processList"
|
|||
|
|
:key="index"
|
|||
|
|
>
|
|||
|
|
<p style="color: #333333">{{ e.remarks }}</p>
|
|||
|
|
<p style="color: #999999">
|
|||
|
|
完成到
|
|||
|
|
<span
|
|||
|
|
:style="e.percent < 100 ? 'color:#5088FF' : 'color:#2EA222'"
|
|||
|
|
>{{ e.percent }}%</span
|
|||
|
|
>
|
|||
|
|
| {{ e.createDate }}
|
|||
|
|
</p>
|
|||
|
|
</el-timeline-item>
|
|||
|
|
</el-timeline>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div slot="footer" style="text-align: center">
|
|||
|
|
<el-button
|
|||
|
|
style="width: 92px"
|
|||
|
|
size="small"
|
|||
|
|
@click="executeDialog = false"
|
|||
|
|
>关 闭</el-button
|
|||
|
|
>
|
|||
|
|
<el-button
|
|||
|
|
style="width: 148px"
|
|||
|
|
type="primary"
|
|||
|
|
size="small"
|
|||
|
|
@click="
|
|||
|
|
(innerVisible = true),
|
|||
|
|
(sayInfo.doDescription = executeInfo.doDescription)
|
|||
|
|
"
|
|||
|
|
v-if="basicInfo.status == 0"
|
|||
|
|
>编辑执行说明</el-button
|
|||
|
|
>
|
|||
|
|
</div>
|
|||
|
|
</el-dialog>
|
|||
|
|
</template>
|
|||
|
|
</ai-detail>
|
|||
|
|
<!-- <detail v-else :instance="instance" :dict="dict" @back="showDetail=false" :params="parentInfo" fromType="SonDetail" detailType="1"></detail> -->
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
|
|||
|
|
import * as echarts from "echarts";
|
|||
|
|
import { mapState } from "vuex";
|
|||
|
|
export default {
|
|||
|
|
name: "SonDetail",
|
|||
|
|
props: {
|
|||
|
|
instance: Function,
|
|||
|
|
params: Object,
|
|||
|
|
dict: Object,
|
|||
|
|
detailType: String
|
|||
|
|
},
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
basicInfo: {
|
|||
|
|
userInfoList: [],
|
|||
|
|
checkUserList: [],
|
|||
|
|
sendUserList: [],
|
|||
|
|
},
|
|||
|
|
ListType: "userInfoList",
|
|||
|
|
listName: "",
|
|||
|
|
saveList: [],
|
|||
|
|
suspendDialog: false,
|
|||
|
|
REttitle: "",
|
|||
|
|
writeInfo: {
|
|||
|
|
finishDescription: "",
|
|||
|
|
},
|
|||
|
|
appReportTaskDoInfoList: [],
|
|||
|
|
taskRole: "1",
|
|||
|
|
checkName: "",
|
|||
|
|
sendName: "",
|
|||
|
|
userName: "",
|
|||
|
|
executeDialog: false,
|
|||
|
|
executeInfo: {},
|
|||
|
|
sayInfo: {
|
|||
|
|
doDescription: "",
|
|||
|
|
},
|
|||
|
|
isAll: false,
|
|||
|
|
colConfigs: [
|
|||
|
|
{ prop: "userName", label: "姓名" },
|
|||
|
|
{ prop: "phone", label: "手机号码" },
|
|||
|
|
{ prop: "unitName", label: "所属部门" },
|
|||
|
|
{ slot: "status"},
|
|||
|
|
{ slot: "percent", label: "完成进度" },
|
|||
|
|
{ slot: "finishTime"},
|
|||
|
|
{ slot: "options", label: "操作" },
|
|||
|
|
],
|
|||
|
|
addUserList: [],
|
|||
|
|
innerVisible: false,
|
|||
|
|
showDetail: false,
|
|||
|
|
parentInfo: {}
|
|||
|
|
};
|
|||
|
|
},
|
|||
|
|
computed: {
|
|||
|
|
...mapState(["user"]),
|
|||
|
|
},
|
|||
|
|
mounted() {
|
|||
|
|
this.dict
|
|||
|
|
.load("workTaskType", "workTaskStatus", "workTaskFinishStatus")
|
|||
|
|
.then(() => {
|
|||
|
|
this.searchDetail();
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
//查详情
|
|||
|
|
searchDetail() {
|
|||
|
|
this.sendName = "";
|
|||
|
|
this.checkName = "";
|
|||
|
|
this.userName = "";
|
|||
|
|
this.instance
|
|||
|
|
.post("/app/appworktaskinfo/queryDetailById", null, {
|
|||
|
|
params: { id: this.params.id },
|
|||
|
|
})
|
|||
|
|
.then((res) => {
|
|||
|
|
if (res.code == 0) {
|
|||
|
|
this.basicInfo = res.data;
|
|||
|
|
|
|||
|
|
this.basicInfo.userInfoList.map((item) => {
|
|||
|
|
item.detailId = item.id
|
|||
|
|
item.name = item.userName
|
|||
|
|
item.id = item.userId
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
if(this.basicInfo.checkUserList.length) {
|
|||
|
|
this.basicInfo.checkUserList.map((item) => {
|
|||
|
|
item.detailId = item.id
|
|||
|
|
item.name = item.userName
|
|||
|
|
item.id = item.userId
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(this.basicInfo.sponsorUserList.length) {
|
|||
|
|
this.basicInfo.sponsorUserList.map((item) => {
|
|||
|
|
item.detailId = item.id
|
|||
|
|
item.name = item.userName
|
|||
|
|
item.id = item.userId
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(this.basicInfo.sendUserList.length) {
|
|||
|
|
this.basicInfo.sendUserList.map((item) => {
|
|||
|
|
item.detailId = item.id
|
|||
|
|
item.name = item.userName
|
|||
|
|
item.id = item.userId
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
this.parentInfo = res.data.parentTask
|
|||
|
|
this.saveList = JSON.stringify(this.basicInfo[this.ListType]);
|
|||
|
|
|
|||
|
|
if (this.basicInfo.checkUserList.length) {
|
|||
|
|
this.basicInfo.checkUserList.forEach((v) => {
|
|||
|
|
this.checkName += v.userName + "、";
|
|||
|
|
});
|
|||
|
|
this.checkName = this.checkName.substring(
|
|||
|
|
0,
|
|||
|
|
this.checkName.length - 1
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (this.basicInfo.userInfoList.length) {
|
|||
|
|
this.basicInfo.userInfoList.forEach((v, index) => {
|
|||
|
|
this.userName += v.userName + "、";
|
|||
|
|
this.basicInfo.userInfoList[index].isSend = false;
|
|||
|
|
});
|
|||
|
|
this.userName = this.userName.substring(
|
|||
|
|
0,
|
|||
|
|
this.userName.length - 1
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (this.basicInfo.sendUserList.length) {
|
|||
|
|
this.basicInfo.sendUserList.forEach((v) => {
|
|||
|
|
this.sendName += v.userName + "、";
|
|||
|
|
});
|
|||
|
|
this.sendName = this.sendName.substring(
|
|||
|
|
0,
|
|||
|
|
this.sendName.length - 1
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//人员选择器去重
|
|||
|
|
this.appReportTaskDoInfoList = [
|
|||
|
|
...this.basicInfo.userInfoList,
|
|||
|
|
...this.basicInfo.checkUserList,
|
|||
|
|
...this.basicInfo.sendUserList,
|
|||
|
|
...this.basicInfo.sponsorUserList,
|
|||
|
|
];
|
|||
|
|
this.showEchartScale();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
showEchartScale() {
|
|||
|
|
let myChart = echarts.init(document.getElementById("echart"));
|
|||
|
|
let legendData = ["未完成", "已完成", "逾期完成"];
|
|||
|
|
let seriesData = [
|
|||
|
|
{ value: this.basicInfo.unFinished, name: "未完成" },
|
|||
|
|
{ value: this.basicInfo.finishedOnTime, name: "按时完成" },
|
|||
|
|
{ value: this.basicInfo.finishedOutOfTime, name: "逾期完成" },
|
|||
|
|
];
|
|||
|
|
let option = {
|
|||
|
|
backgroundColor: "#fff",
|
|||
|
|
tooltip: {
|
|||
|
|
trigger: "item",
|
|||
|
|
formatter: "{a} <br/>{b} : {c} ({d}%)",
|
|||
|
|
},
|
|||
|
|
legend: {
|
|||
|
|
orient: "vertical",
|
|||
|
|
right: 340,
|
|||
|
|
top: 70,
|
|||
|
|
bottom: 20,
|
|||
|
|
itemWidth: 8,
|
|||
|
|
itemHeight: 8,
|
|||
|
|
formatter: (name) => {
|
|||
|
|
let item = seriesData.find((e) => e.name == name);
|
|||
|
|
return `{title|${name}}{content|${
|
|||
|
|
item ? item.value.toLocaleString() : 0
|
|||
|
|
}}`;
|
|||
|
|
},
|
|||
|
|
// data: legendData
|
|||
|
|
textStyle: {
|
|||
|
|
fontSize: 14,
|
|||
|
|
rich: {
|
|||
|
|
title: {
|
|||
|
|
width: 100,
|
|||
|
|
color: "#AAA",
|
|||
|
|
paddingLeft: 6,
|
|||
|
|
fontSize: 14,
|
|||
|
|
},
|
|||
|
|
content: {
|
|||
|
|
color: "#333",
|
|||
|
|
width: 50,
|
|||
|
|
align: "right",
|
|||
|
|
fontSize: 14,
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
series: [
|
|||
|
|
{
|
|||
|
|
name: "完成情况比例",
|
|||
|
|
type: "pie",
|
|||
|
|
radius: ["40%", "75%"],
|
|||
|
|
center: ["14%", "45%"],
|
|||
|
|
avoidLabelOverlap: false,
|
|||
|
|
label: {
|
|||
|
|
position: "inside",
|
|||
|
|
formatter: (params) => {
|
|||
|
|
if (params.value == 0) {
|
|||
|
|
return "";
|
|||
|
|
} else {
|
|||
|
|
return `${params.percent}%`;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
data: seriesData,
|
|||
|
|
itemStyle: {
|
|||
|
|
normal: {
|
|||
|
|
color: function (params) {
|
|||
|
|
//自定义颜色
|
|||
|
|
var colorList = ["#FFAA44", "#2EA222", "#3D94FB"];
|
|||
|
|
return colorList[params.dataIndex];
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
};
|
|||
|
|
myChart.setOption(option);
|
|||
|
|
},
|
|||
|
|
ListTypeChange(val) {
|
|||
|
|
this.saveList = JSON.stringify(this.basicInfo[val]);
|
|||
|
|
this.listName = "";
|
|||
|
|
if (val == "userInfoList") this.taskRole = "1";
|
|||
|
|
if (val == "checkUserList") this.taskRole = "2";
|
|||
|
|
if (val == "sendUserList") this.taskRole = "3";
|
|||
|
|
this.searchDetail(this.params.id);
|
|||
|
|
},
|
|||
|
|
//删除任务
|
|||
|
|
deleteTask() {
|
|||
|
|
this.$confirm("是否确认删除本次任务,删除后无法恢复?", {
|
|||
|
|
type: "error",
|
|||
|
|
}).then(() => {
|
|||
|
|
this.instance
|
|||
|
|
.post("/app/appworktaskinfo/delete", null, {
|
|||
|
|
params: {
|
|||
|
|
id: this.params.id,
|
|||
|
|
},
|
|||
|
|
})
|
|||
|
|
.then((res) => {
|
|||
|
|
if (res.code == 0) {
|
|||
|
|
this.$message.success("删除成功");
|
|||
|
|
this.onBack();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
filterData(val) {
|
|||
|
|
if (val) {
|
|||
|
|
let list = JSON.parse(this.saveList).filter(
|
|||
|
|
(e) => e.userName.indexOf(val) !== -1
|
|||
|
|
);
|
|||
|
|
this.$set(this.basicInfo, this.ListType, list);
|
|||
|
|
} else {
|
|||
|
|
this.$set(this.basicInfo, this.ListType, JSON.parse(this.saveList));
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
//催办多人
|
|||
|
|
urgeMessageAll() {
|
|||
|
|
if (!this.isAll) {
|
|||
|
|
this.$confirm("是否向全部执行人发送催办提醒?", {
|
|||
|
|
type: "warning",
|
|||
|
|
title: "发送催办提醒",
|
|||
|
|
}).then(() => {
|
|||
|
|
this.instance
|
|||
|
|
.post("/app/appworktaskuserinfo/sendMesage", null, {
|
|||
|
|
params: {
|
|||
|
|
id: this.params.id,
|
|||
|
|
},
|
|||
|
|
})
|
|||
|
|
.then((res) => {
|
|||
|
|
if (res.code == 0) {
|
|||
|
|
this.$message.success("催办消息已发送");
|
|||
|
|
this.isAll = true;
|
|||
|
|
this.basicInfo.userInfoList.forEach((e, index) => {
|
|||
|
|
e.isSend = true;
|
|||
|
|
this.$set(this.basicInfo.userInfoList, index, e);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
//催办单人
|
|||
|
|
urgeMessage(row) {
|
|||
|
|
if (row.doStatus == 0 && !row.isSend) {
|
|||
|
|
this.$confirm(`是否向【执行人:${row.userName}】发送催办提醒?`, {
|
|||
|
|
type: "warning",
|
|||
|
|
title: "发送催办提醒",
|
|||
|
|
}).then(() => {
|
|||
|
|
this.instance
|
|||
|
|
.post("/app/appworktaskuserinfo/sendMesageOne", null, {
|
|||
|
|
params: {
|
|||
|
|
id: row.detailId,
|
|||
|
|
},
|
|||
|
|
})
|
|||
|
|
.then((res) => {
|
|||
|
|
if (res.code == 0) {
|
|||
|
|
this.$message.success("催办消息已发送");
|
|||
|
|
row.isSend = true;
|
|||
|
|
let index = this.basicInfo.userInfoList.findIndex(
|
|||
|
|
(e) => e.id == row.id
|
|||
|
|
);
|
|||
|
|
if (index > -1)
|
|||
|
|
this.$set(this.basicInfo.userInfoList, index, row);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
//执行情况
|
|||
|
|
getExecute(row) {
|
|||
|
|
this.instance
|
|||
|
|
.post("/app/appworktaskuserinfo/queryDetailById", null, {
|
|||
|
|
params: {
|
|||
|
|
id: row.detailId,
|
|||
|
|
},
|
|||
|
|
})
|
|||
|
|
.then((res) => {
|
|||
|
|
if (res.code == 0) {
|
|||
|
|
this.executeDialog = true;
|
|||
|
|
this.executeInfo = res.data;
|
|||
|
|
this.executeInfo.detailId = this.executeInfo.id
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
updateDescription() {
|
|||
|
|
this.instance
|
|||
|
|
.post(`/app/appworktaskuserinfo/updateDoDescription`, {
|
|||
|
|
id: this.executeInfo.detailId,
|
|||
|
|
doDescription: this.sayInfo.doDescription,
|
|||
|
|
})
|
|||
|
|
.then((res) => {
|
|||
|
|
if (res.code == 0) {
|
|||
|
|
this.innerVisible = false;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
//中止任务-取消任务-退回任务
|
|||
|
|
overTask(formName) {
|
|||
|
|
let url = ``;
|
|||
|
|
if (this.REttitle == "任务完成情况") {
|
|||
|
|
url = `/app/appworktaskuserinfo/confirm`;
|
|||
|
|
var obj = {
|
|||
|
|
taskCode: this.params.taskCode,
|
|||
|
|
finishDescription: this.writeInfo.finishDescription,
|
|||
|
|
lastTime: this.basicInfo.lastTime,
|
|||
|
|
};
|
|||
|
|
} else if (this.REttitle == "关闭任务") {
|
|||
|
|
url = `/app/appworktaskinfo/stopOrFinish`;
|
|||
|
|
var obj = {
|
|||
|
|
id: this.params.id,
|
|||
|
|
status: "2",
|
|||
|
|
closeDescription: this.writeInfo.finishDescription,
|
|||
|
|
};
|
|||
|
|
} else if (this.REttitle == "取消任务") {
|
|||
|
|
url = `/app/appreporttaskinfo/cancelTaskById`;
|
|||
|
|
var obj = {
|
|||
|
|
id: this.params.id,
|
|||
|
|
...this.writeInfo,
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
this.instance
|
|||
|
|
.post(
|
|||
|
|
url,
|
|||
|
|
{
|
|||
|
|
...obj,
|
|||
|
|
},
|
|||
|
|
null
|
|||
|
|
)
|
|||
|
|
.then((res) => {
|
|||
|
|
if (res.code == 0) {
|
|||
|
|
this.$message.success(this.REttitle + "成功");
|
|||
|
|
if (this.REttitle == "退回任务") {
|
|||
|
|
this.searchDetail(this.params.id);
|
|||
|
|
} else {
|
|||
|
|
this.onBack();
|
|||
|
|
}
|
|||
|
|
this.suspendDialog = false;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
//确认完成
|
|||
|
|
markCompleted(type) {
|
|||
|
|
this.$confirm(
|
|||
|
|
"标记完成后,本次任务变成已完成,任务结果将锁定无法修改,请确保所有执行人已经完成任务,是否继续?",
|
|||
|
|
{
|
|||
|
|
type: "success",
|
|||
|
|
title: "标记完成",
|
|||
|
|
}
|
|||
|
|
).then(() => {
|
|||
|
|
this.instance
|
|||
|
|
.post(
|
|||
|
|
"/app/appworktaskinfo/stopOrFinish",
|
|||
|
|
{
|
|||
|
|
id: this.params.id,
|
|||
|
|
status: type,
|
|||
|
|
},
|
|||
|
|
null
|
|||
|
|
)
|
|||
|
|
.then((res) => {
|
|||
|
|
if (res.code == 0) {
|
|||
|
|
this.$message.success("已标记完成");
|
|||
|
|
this.onBack();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
//删掉执行单位
|
|||
|
|
deleteUnit(row) {
|
|||
|
|
this.$confirm("是否确认删除此人?", {
|
|||
|
|
type: "warning",
|
|||
|
|
}).then(() => {
|
|||
|
|
this.instance
|
|||
|
|
.post("/app/appworktaskuserinfo/delete", null, {
|
|||
|
|
params: {
|
|||
|
|
ids: row.detailId,
|
|||
|
|
},
|
|||
|
|
})
|
|||
|
|
.then((res) => {
|
|||
|
|
if (res.code == 0) {
|
|||
|
|
this.$message.success("删除成功");
|
|||
|
|
this.searchDetail(this.params.id);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
surePersonalFn() {
|
|||
|
|
this.lastPersonalList = this.tags;
|
|||
|
|
this.lastPersonalList.forEach((item, index) => {
|
|||
|
|
this.lastPersonalList[index].taskCode = this.params.taskCode;
|
|||
|
|
this.lastPersonalList[index].taskRole = this.taskRole;
|
|||
|
|
});
|
|||
|
|
if (this.lastPersonalList.length > 0) {
|
|||
|
|
this.instance
|
|||
|
|
.post(
|
|||
|
|
`/app/appworktaskuserinfo/addUserInfos`,
|
|||
|
|
|
|||
|
|
this.lastPersonalList
|
|||
|
|
)
|
|||
|
|
.then((res) => {
|
|||
|
|
if (res.code == 0) {
|
|||
|
|
this.$message.success("保存成功");
|
|||
|
|
this.showSelectPer = false;
|
|||
|
|
this.searchDetail(this.params.id);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
} else {
|
|||
|
|
this.$message.error("增加人数不能为空");
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
surePersonal() {
|
|||
|
|
debounce(this.surePersonalFn(), 3000);
|
|||
|
|
},
|
|||
|
|
downFileAll () {
|
|||
|
|
if (this.basicInfo.fileList.length > 0) {
|
|||
|
|
this.instance.post('/app/appofficialdocumentinfo/downLoadAllFileForDetail', null, {
|
|||
|
|
responseType: 'blob',
|
|||
|
|
params: {
|
|||
|
|
id: this.basicInfo.id
|
|||
|
|
}
|
|||
|
|
}).then((res) => {
|
|||
|
|
const link = document.createElement('a')
|
|||
|
|
let blob = new Blob([res], { type: 'application/vnd.ms-excel' })
|
|||
|
|
link.style.display = 'none'
|
|||
|
|
link.href = URL.createObjectURL(blob)
|
|||
|
|
var num = ''
|
|||
|
|
for (let i = 0; i < 10; i++) {
|
|||
|
|
num += Math.ceil(Math.random() * 10)
|
|||
|
|
}
|
|||
|
|
link.setAttribute('download', '工作文件' + '.zip')
|
|||
|
|
document.body.appendChild(link)
|
|||
|
|
link.click()
|
|||
|
|
document.body.removeChild(link)
|
|||
|
|
})
|
|||
|
|
} else {
|
|||
|
|
this.$message.error('暂无附件提供下载')
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
downFile(item) {
|
|||
|
|
window.open(item.url);
|
|||
|
|
},
|
|||
|
|
onBack() {
|
|||
|
|
if(this.detailType == 'detail') { //从父任务
|
|||
|
|
this.$emit("back");
|
|||
|
|
}else { //列表
|
|||
|
|
this.$emit('change', {
|
|||
|
|
type: 'list',
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
},
|
|||
|
|
toParent() {
|
|||
|
|
if(this.detailType == 'detail') { //从父任务
|
|||
|
|
this.$emit("back");
|
|||
|
|
}else { //列表
|
|||
|
|
this.$emit('change', {
|
|||
|
|
type: 'Detail',
|
|||
|
|
params: {
|
|||
|
|
type: 'Detail',
|
|||
|
|
id: this.parentInfo.id,
|
|||
|
|
fromType: 'SonDetail',
|
|||
|
|
sonDetailId: this.params.id
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
confirmAdd(type) {
|
|||
|
|
if(this.addUserList.length>0){
|
|||
|
|
this.addUserList.map((item) => {
|
|||
|
|
item.taskRole = type
|
|||
|
|
item.taskCode = this.basicInfo.taskCode;
|
|||
|
|
})
|
|||
|
|
this.instance.post(`/app/appworktaskuserinfo/addUserInfos`,this.addUserList).then(res => {
|
|||
|
|
if(res.code==0){
|
|||
|
|
this.addUserList = []
|
|||
|
|
this.$message.success('保存成功');
|
|||
|
|
this.searchDetail();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}else{
|
|||
|
|
this.$message.error("增加人数不能为空")
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
closeWork() {
|
|||
|
|
this.$confirm("任务关闭后无法恢复,确定关闭?", {
|
|||
|
|
type: "error",
|
|||
|
|
}).then(() => {
|
|||
|
|
this.REttitle = "关闭任务"
|
|||
|
|
this.overTask()
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style scoped lang="scss">
|
|||
|
|
.especial {
|
|||
|
|
margin-bottom: 12px;
|
|||
|
|
.icon {
|
|||
|
|
vertical-align: top;
|
|||
|
|
display: inline-block;
|
|||
|
|
padding-top: 5px;
|
|||
|
|
margin-left: 20px;
|
|||
|
|
color: #f46;
|
|||
|
|
}
|
|||
|
|
.people {
|
|||
|
|
display: inline-block;
|
|||
|
|
font-size: 14px;
|
|||
|
|
color: #666;
|
|||
|
|
margin-right: 16px;
|
|||
|
|
vertical-align: top;
|
|||
|
|
}
|
|||
|
|
.AiWechatSelecter {
|
|||
|
|
display: inline-block;
|
|||
|
|
margin-left: 3px;
|
|||
|
|
}
|
|||
|
|
.hint {
|
|||
|
|
font-size: 14px;
|
|||
|
|
color: #999;
|
|||
|
|
margin-left: 16px;
|
|||
|
|
}
|
|||
|
|
.mar-r40 {
|
|||
|
|
margin-right: 40px;
|
|||
|
|
}
|
|||
|
|
.w80 {
|
|||
|
|
width: 80px;
|
|||
|
|
text-align: right;
|
|||
|
|
color: #888;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.add-icon {
|
|||
|
|
text-align: right;
|
|||
|
|
cursor: pointer;
|
|||
|
|
i {
|
|||
|
|
font-size: 14px;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.color1 {
|
|||
|
|
color: #4b87fe;
|
|||
|
|
}
|
|||
|
|
.color2 {
|
|||
|
|
color: #2ea222;
|
|||
|
|
}
|
|||
|
|
.color3 {
|
|||
|
|
color: #999999;
|
|||
|
|
}
|
|||
|
|
.echart {
|
|||
|
|
width: 100%;
|
|||
|
|
height: 240px;
|
|||
|
|
}
|
|||
|
|
.AiWechatSelecter{
|
|||
|
|
width: calc(100% - 150px);
|
|||
|
|
}
|
|||
|
|
</style>
|