Files

79 lines
2.7 KiB
Vue

<template>
<view class="page">
<fy-header title="协同详情" back />
<view v-if="row" class="body">
<view class="card">
<view class="top">
<text class="type">协同</text>
<wd-tag :type="row.status === 'done' ? 'success' : 'primary'" plain>{{ row.status === 'done' ? '已办结' : '待办理' }}</wd-tag>
</view>
<text class="t">{{ row.title }}</text>
<view class="kv">
<text class="k">发起</text>
<text class="v">{{ row.assignerName || '-' }}</text>
</view>
<view class="kv">
<text class="k">办理</text>
<text class="v">{{ row.assigneeName || '-' }}</text>
</view>
<text v-if="row.content || row.remark" class="c">{{ row.content || row.remark }}</text>
</view>
<view v-if="canDone" class="btn-primary" @click="done">标记已办理</view>
</view>
</view>
</template>
<script>
import FyHeader from '../../components/fy-header.vue'
import { store } from '../../utils/store.js'
import { oaGet, oaPost } from '../../utils/api.js'
import { toast } from '../../utils/format.js'
export default {
components: { FyHeader },
data() { return { id: '', row: null } },
computed: {
canDone() {
if (!this.row || this.row.status === 'done') return false
const me = store.me
return me && (String(this.row.assigneeId) === me.id || String(this.row.assignee) === me.username)
}
},
onLoad(q) {
this.id = decodeURIComponent(q.id || '')
this.load()
},
methods: {
async load() {
try {
this.row = await oaGet('/work-tasks/' + encodeURIComponent(this.id), store.token)
} catch (_) {
this.row = { id: this.id, title: '协同任务' }
}
},
async done() {
try {
await oaPost('/work-tasks/' + encodeURIComponent(this.id) + '/done', {}, store.token)
toast('已办结', 'success')
this.load()
} catch (e) {
toast(e.message || '操作失败')
}
}
}
}
</script>
<style scoped>
.body { padding: 16rpx 24rpx 48rpx; }
.card { padding: 28rpx; margin-bottom: 24rpx; }
.top { display: flex; align-items: center; justify-content: space-between; }
.type { font-size: 22rpx; color: #1677FF; background: #E8F1FF; border-radius: 8rpx; padding: 2rpx 10rpx; }
.t { display: block; margin-top: 16rpx; font-size: 34rpx; font-weight: 650; color: #111827; line-height: 1.4; }
.kv { display: flex; justify-content: space-between; padding: 20rpx 0; }
.kv + .kv { border-top: 1rpx solid #F0F2F5; }
.k { color: #6B7280; font-size: 26rpx; }
.v { font-size: 26rpx; color: #111827; }
.c { display: block; margin-top: 8rpx; padding-top: 16rpx; border-top: 1rpx solid #F0F2F5; font-size: 28rpx; color: #374151; line-height: 1.65; }
</style>