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>
|