2026-08-12 302e8457c8d34a35d7eabbd474d98ebc16120ed2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<script lang="ts" setup>
import type { OaNoticeApi } from '#/api/bpm/oa/notice';
 
import { computed, onMounted, ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
 
import { Page } from '@vben/common-ui';
 
import { Card, Descriptions, message, Spin, Tag } from 'ant-design-vue';
import { IconifyIcon } from '@vben/icons';
 
import { getNotice } from '#/api/bpm/oa/notice';
 
import {
  NOTICE_STATUS_OPTIONS,
  NOTICE_STATUS_TAG,
  NOTICE_TYPE_OPTIONS,
  NOTICE_TYPE_TAG,
  SEND_SCOPE_MAP,
} from './data';
 
defineOptions({ name: 'OANoticeDetail' });
 
const route = useRoute();
const router = useRouter();
 
const loading = ref(false);
const formData = ref<OaNoticeApi.NoticeVO>();
 
function getStatusLabel(status: number) {
  return NOTICE_STATUS_OPTIONS.find((o) => o.value === status)?.label || '-';
}
 
function getTypeLabel(type: number) {
  return NOTICE_TYPE_OPTIONS.find((o) => o.value === type)?.label || '-';
}
 
const noticeId = computed(() => Number(route.query.id));
 
async function loadDetail() {
  if (!noticeId.value) {
    message.error('通知公告 ID 不存在');
    router.back();
    return;
  }
  loading.value = true;
  try {
    formData.value = await getNotice(noticeId.value);
  } finally {
    loading.value = false;
  }
}
 
onMounted(() => {
  loadDetail();
});
</script>
 
<template>
  <Page auto-content-height>
    <Spin :spinning="loading" tip="加载中...">
      <template v-if="formData">
        <div class="flex items-center gap-2 px-4 pt-3 pb-2">
          <a-button type="text" size="small" @click="router.back()">
            <template #icon>
              <IconifyIcon icon="ant-design:arrow-left-outlined" />
            </template>
          </a-button>
          <span class="text-lg font-bold">{{ formData.title }}</span>
          <Tag :color="NOTICE_TYPE_TAG[formData.type]">
            {{ getTypeLabel(formData.type) }}
          </Tag>
          <Tag :color="NOTICE_STATUS_TAG[formData.status]">
            {{ getStatusLabel(formData.status) }}
          </Tag>
        </div>
 
        <div class="px-4 pb-4">
          <Card size="small" class="mb-3">
            <Descriptions :column="2" bordered size="small">
              <Descriptions.Item label="发送范围">
                {{ SEND_SCOPE_MAP[formData.sendScope] || '-' }}
              </Descriptions.Item>
              <Descriptions.Item label="是否置顶">
                <Tag v-if="formData.isTop === 1" color="red">置顶</Tag>
                <span v-else>否</span>
              </Descriptions.Item>
              <Descriptions.Item label="发布时间">
                {{ formData.publishTime || '-' }}
              </Descriptions.Item>
              <Descriptions.Item label="创建时间">
                {{ formData.createTime || '-' }}
              </Descriptions.Item>
              <Descriptions.Item
                v-if="formData.sendScope === 2 && formData.userIds?.length"
                label="指定人员"
                :span="2"
              >
                {{ formData.userIds?.join(', ') }}
              </Descriptions.Item>
            </Descriptions>
          </Card>
 
          <Card size="small" title="内容">
            <div
              class="min-h-40 rounded bg-gray-50 p-4"
              v-dompurify-html="formData.content"
            />
          </Card>
        </div>
      </template>
    </Spin>
  </Page>
</template>