Files
2024-10-31 14:34:57 +08:00

340 lines
8.0 KiB
Vue
Raw Permalink 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="sub-detail">
<div class="card">
<header>
<em>[子任务]</em>
{{detail.taskTitle}}
</header>
<u-gap height="16"></u-gap>
<u-row>
<span>任务类型</span>
<span>{{$dict.getLabel("workTaskType",detail.type)}}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>开始时间</span>
<span>{{detail.createTime}}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>截止时间</span>
<span>{{detail.lastTime}}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>剩余时间</span>
<span style="color:#1365DD">{{detail.overTimeStatus}}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>任务状态</span>
<span style="color:#1365DD">{{$dict.getLabel("workTaskDoStatus",detail.status)}}</span>
</u-row>
<u-gap height="16"></u-gap>
</div>
<div class="card" style="padding-top: 0">
<div class="label">任务说明</div>
<u-read-more close-text="展开" color="#999999" show-height="300">
<span>{{detail.taskDescription}}</span>
</u-read-more>
</div>
<div class="card">
<div class="label">当前进度</div>
<text>已完成{{detail.percent}}%</text>
<div class="progress">
<div class="pro-active" :style="{width:detail.percent + '%'}"></div>
</div>
</div>
<div class="card" style="padding-top: 0" v-if="detail.userInfoList && detail.userInfoList.length">
<div class="label title">任务完成进度(<i>{{count}}</i>/{{detail.userInfoList.length}})</div>
<u-row justify="between" v-for="(item,index) in detail.userInfoList" :key="index" @click="finishDetail(item)">
<div>{{item.userName && item.userName.substr(-2)}}</div>
<u-row justify="between" class="item">
<text class="name">{{item.userName}}</text>
<label class="right">
<span>已完成{{item.percent}}%</span>
<label class="arrow"></label>
</label>
</u-row>
</u-row>
</div>
<div class="footer" v-if="detail.status==0">
<div>
<img :src="$cdn + 'common/gb.png'" alt="" @click="show=true,content='确定是否要关闭任务?',idx=0">关闭任务
</div>
<div>
<img :src="$cdn + 'common/tx.png'" alt="" @click="show=true,content='该操作会向所有执行人发送提醒,您确定发送吗?',idx=1">一键催办
</div>
</div>
<u-modal v-model="show" :content="content" @confirm="confirm"></u-modal>
<ai-back></ai-back>
</div>
</template>
<script>
export default {
name: "subDetail",
data() {
return {
id: null,
detail: {},
show: false,
content: "",
idx: null,
count: 0,
}
},
onLoad(opt) {
this.id = opt.id
this.$dict.load("workTaskType", "workTaskDoStatus").then(_ => this.getDetail())
},
methods: {
finishDetail({id}){
uni.navigateTo({
url:"./finishDetail?id=" + id
})
},
confirm() {
this.$http.post(this.idx == 0 ? "/app/appworktaskinfo/stopOrFinish" : "/app/appworktaskuserinfo/sendMesage", null, {
params: {
id: this.id,
status: this.idx == 0 ? 2 : null
}
}).then(res => {
if (res.code == 0) {
this.$u.toast(this.idx == 0 ? "关闭成功" : "催办成功")
this.getDetail()
}
})
},
getDetail() {
this.$http.post("/app/appworktaskinfo/queryDetailById", null, {
params: {
id: this.id
}
}).then(res => {
if (res && res.data) {
this.detail = res.data
this.count = res.data?.userInfoList?.reduce((pre,cur)=>{
return pre + (cur.percent==100 ? 1 : 0)
},0)
}
})
}
},
}
</script>
<style lang="scss" scoped>
.sub-detail {
min-height: 100%;
overflow-x: hidden;
background-color: #F5F5F5;
padding-bottom: 140px;
.card {
background-color: #FFFFFF;
margin-bottom: 8px;
box-sizing: border-box;
padding: 16px 32px;
header {
font-size: 40px;
font-weight: 600;
color: #333333;
line-height: 64px;
letter-spacing: 1px;
& > em {
font-style: normal;
color: #1365DD;
font-size: 40px;
}
}
.u-row {
flex: 1;
margin-left: 16px;
position: relative;
.item {
height: 112px;
&:after {
width: 622px;
height: 2px;
content: "";
position: absolute;
left: 0;
bottom: 0;
background-color: rgba(216, 221, 230, 0.5);
}
}
& > div {
width: 80px;
height: 80px;
background-color: #4E8EEE;
border-radius: 50%;
text-align: center;
font-size: 28px;
font-weight: bold;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
}
& > span:first-child {
font-size: 30px;
color: #999999;;
line-height: 48px;
}
& > span:last-child {
font-size: 30px;
color: #343D65;
margin-left: 16px;
line-height: 48px;
}
.name {
font-size: 32px;
font-weight: 400;
color: #333333;
}
.title {
width: 490px;
height: 112px;
display: flex;
align-items: center;
font-size: 32px;
color: #333333;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.right {
font-size: 28px;
color: #1365DD;
display: flex;
align-items: center;
.arrow {
width: 16px;
height: 16px;
border-top: 3px solid #CCCCCC;
border-right: 3px solid #CCCCCC;
transform: rotate(45deg);
}
}
}
& > text {
width: 100%;
display: inline-block;
font-size: 30px;
color: #649EFD;
text-align: center;
}
.progress {
height: 12px;
background: #F2F4FC;
border-radius: 12px;
position: relative;
margin: 16px 0 80px 0;
.pro-active {
height: 12px;
background: #639EFD;
border-radius: 12px;
position: absolute;
left: 0;
top: 0;
}
}
& > span {
font-size: 32px;
color: #333333;
line-height: 48px;
letter-spacing: 1px;
display: inline-block;
}
.label {
height: 80px;
font-size: 32px;
color: #333333;
display: flex;
align-items: center;
margin-bottom: 16px;
& > em {
font-style: normal;
font-size: 32px;
color: #1365DD;
}
& > i {
font-style: normal;
font-size: 32px;
color: #2EA222;
}
}
.title {
font-weight: bold;
height: 96px;
border-bottom: 1px solid rgba(216, 221, 230, 0.5);
}
}
.footer {
height: 112px;
width: 100%;
position: fixed;
left: 0;
bottom: 0;
background: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
font-size: 36px;
color: #FFFFFF;
img {
width: 48px;
height: 48px;
margin-right: 8px;
}
& > div:first-child, div:last-child {
width: 50%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
& > div:first-child {
color: #666666;
}
& > div:last-child {
background: #1365DD;
}
}
}
</style>