You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
crmeb/app/pages/supply_chain/notice_detail/index.vue

305 lines
7.4 KiB

<template>
<view class="notice-detail-page">
<view class="content" v-if="!loading">
<view class="detail-card" v-if="notice && (notice.noticeTitle || notice.noticeId)">
<view class="title-section">
<text class="detail-title">{{ notice.noticeTitle || '未命名通知' }}</text>
<view class="tag-row">
<text class="tag kind" :class="typeClassMap[notice.type] || ''">{{ typeText(notice.type) }}</text>
<text class="tag status" :class="statusClassMap[notice.status] || statusClassMap['__default__']">{{ statusText(notice.status) }}</text>
<text class="tag sms" :class="smsClassMap[notice.smsStatus] || ''">{{ smsText(notice.smsStatus) }}</text>
</view>
</view>
<view class="info-list">
<view class="row" v-if="notice.noticeType">
<text class="label">通知类型:</text>
<text class="value">{{ notice.noticeType }}</text>
</view>
<view class="row" v-if="notice.noticeSource">
<text class="label">通知来源:</text>
<text class="value">{{ notice.noticeSource }}</text>
</view>
<view class="row" v-if="notice.draftDept">
<text class="label">拟稿单位:</text>
<text class="value">{{ notice.draftDept }}</text>
</view>
<view class="row" v-if="notice.noticeScope">
<text class="label">通知范围:</text>
<text class="value">{{ notice.noticeScope }}</text>
</view>
<view class="row" v-if="notice.bizType || notice.bizId">
<text class="label">业务信息:</text>
<text class="value">{{ bizText(notice.bizType, notice.bizId) }}</text>
</view>
<view class="row" v-if="notice.noticeTime">
<text class="label">通知时间:</text>
<text class="value">{{ formatDate(notice.noticeTime) }}</text>
</view>
<view class="row" v-if="notice.remark">
<text class="label">备注:</text>
<text class="value remark-value">{{ notice.remark }}</text>
</view>
</view>
<view class="content-box">
<jyf-parser
v-if="notice.noticeContent"
:html="notice.noticeContent"
ref="article"
:tag-style="tagStyle"
></jyf-parser>
<view class="empty" v-else>暂无通知内容</view>
</view>
</view>
<view class="empty-page" v-else>
<text class="iconfont icon-wushuju"></text>
<text class="text">暂无详情数据</text>
</view>
</view>
<view class="loading" v-else>
<text>加载中...</text>
</view>
</view>
</template>
<script>
import jyfParser from '@/components/jyf-parser/jyf-parser';
import { pubnoticeDetailApi } from '@/api/pubnotice.js';
export default {
components: {
'jyf-parser': jyfParser,
},
data() {
return {
loading: false,
noticeId: '',
notice: {},
tagStyle: {
img: 'max-width:100%;height:auto;display:block;',
table: 'width:100%;border-collapse:collapse;',
video: 'max-width:100%;',
},
typeClassMap: {
'1': 'tag-internal',
1: 'tag-internal',
'2': 'tag-external',
2: 'tag-external',
'__default__': ''
},
statusClassMap: {
'0': 'status-draft',
0: 'status-draft',
'1': 'status-submit',
1: 'status-submit',
'__default__': ''
},
smsClassMap: {
'0': 'sms-unsent',
0: 'sms-unsent',
'1': 'sms-sent',
1: 'sms-sent',
'__default__': ''
}
};
},
onLoad(options) {
this.noticeId = options.noticeId || options.id || '';
if (this.noticeId) this.fetchDetail();
},
methods: {
async fetchDetail() {
this.loading = true;
try {
const res = await pubnoticeDetailApi(this.noticeId);
this.notice = res?.data || {};
} catch (e) {
uni.showToast({
title: typeof e === 'string' ? e : '获取通知详情失败',
icon: 'none',
});
} finally {
this.loading = false;
}
},
bizText(bizType, bizId) {
const t = bizType ? String(bizType) : '';
const id = bizId ? String(bizId) : '';
if (!t && !id) return '—';
if (t && id) return `${t} #${id}`;
return t || id;
},
formatDate(val) {
if (!val) return '';
if (typeof val === 'string') {
return val.replace('T', ' ').slice(0, 19);
}
if (val instanceof Date) {
const pad = (n) => (n < 10 ? '0' + n : '' + n);
return `${val.getFullYear()}-${pad(val.getMonth() + 1)}-${pad(val.getDate())} ${pad(
val.getHours()
)}:${pad(val.getMinutes())}`;
}
return String(val);
},
typeText(type) {
if (type === 1 || type === '1') return '内部';
if (type === 2 || type === '2') return '外部';
return type || '—';
},
statusText(status) {
if (status === 0 || status === '0') return '草稿';
if (status === 1 || status === '1') return '提交';
return status ?? '—';
},
smsText(smsStatus) {
if (smsStatus === 0 || smsStatus === '0') return '未发';
if (smsStatus === 1 || smsStatus === '1') return '已发';
return smsStatus ?? '—';
},
},
};
</script>
<style lang="scss">
.notice-detail-page {
.content {
padding: 30rpx;
}
.detail-card {
background-color: #fff;
border-radius: 12rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.06);
padding: 24rpx 26rpx;
}
.title-section {
margin-bottom: 20rpx;
.detail-title {
font-size: 30rpx;
font-weight: 800;
color: #333;
display: block;
line-height: 1.4;
word-break: break-all;
}
.tag-row {
display: flex;
flex-wrap: wrap;
gap: 10rpx;
margin-top: 14rpx;
}
}
.tag {
padding: 6rpx 16rpx;
border-radius: 20rpx;
font-size: 20rpx;
line-height: 1;
}
.tag-internal {
background-color: #e6f7ff;
color: #409eff;
}
.tag-external {
background-color: #fff7e6;
color: #fa8c16;
}
.status-draft {
background-color: #f5f5f5;
color: #666;
}
.status-submit {
background-color: #f6ffed;
color: #52c41a;
}
.sms-unsent {
background-color: #f5f5f5;
color: #999;
}
.sms-sent {
background-color: #e6fffb;
color: #13c2c2;
}
.info-list {
.row {
display: flex;
margin-bottom: 14rpx;
.label {
width: 170rpx;
font-size: 24rpx;
color: #666;
flex-shrink: 0;
}
.value {
flex: 1;
font-size: 24rpx;
color: #333;
min-width: 0;
word-break: break-word;
}
}
.remark-value {
line-height: 1.5;
}
}
.content-box {
margin-top: 10rpx;
padding-top: 20rpx;
border-top: 1rpx solid #f5f5f5;
}
.empty-page {
margin-top: 120rpx;
display: flex;
flex-direction: column;
align-items: center;
color: #999;
.iconfont {
font-size: 80rpx;
margin-bottom: 16rpx;
}
.text {
font-size: 24rpx;
}
}
.empty {
font-size: 26rpx;
color: #999;
line-height: 2;
padding: 30rpx 0;
}
.loading {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
color: #999;
font-size: 26rpx;
}
}
</style>