198 lines
5.2 KiB
Vue
198 lines
5.2 KiB
Vue
<template>
|
||
<a-modal
|
||
:visible="visible"
|
||
title="招标详情"
|
||
width="800px"
|
||
:footer="false"
|
||
:mask-closable="false"
|
||
@update:visible="(val) => $emit('update:visible', val)"
|
||
>
|
||
<a-descriptions
|
||
:column="2"
|
||
bordered
|
||
:label-style="{ width: '120px', fontWeight: 'bold' }"
|
||
>
|
||
<a-descriptions-item label="项目名称">{{ detail.projectName }}</a-descriptions-item>
|
||
<a-descriptions-item label="招标单位">{{ detail.biddingUnit }}</a-descriptions-item>
|
||
<a-descriptions-item label="预算金额">{{ detail.budgetAmount }}万元</a-descriptions-item>
|
||
<a-descriptions-item label="截止时间">{{ detail.deadline }}</a-descriptions-item>
|
||
<a-descriptions-item label="爬取时间">{{ detail.crawlingTime }}</a-descriptions-item>
|
||
<a-descriptions-item label="项目地点">{{ detail.projectLocation }}</a-descriptions-item>
|
||
<a-descriptions-item label="项目周期">{{ detail.projectDuration }}</a-descriptions-item>
|
||
<a-descriptions-item label="招标范围">{{ detail.biddingScope }}</a-descriptions-item>
|
||
<a-descriptions-item label="资质要求">{{ detail.qualificationRequirements }}</a-descriptions-item>
|
||
<a-descriptions-item label="来源平台">
|
||
<a
|
||
:href="getPlatformUrl(detail.sourcePlatform)"
|
||
target="_blank"
|
||
class="platform-link"
|
||
>
|
||
{{ detail.sourcePlatform }}
|
||
</a>
|
||
</a-descriptions-item>
|
||
<a-descriptions-item label="招标文件">
|
||
<div class="file-display">
|
||
<a-link
|
||
v-if="detail.biddingDocuments"
|
||
:href="detail.biddingDocuments"
|
||
target="_blank"
|
||
class="file-link"
|
||
>
|
||
{{ displayedFileName }}
|
||
</a-link>
|
||
<span v-else class="no-file">暂无文件</span>
|
||
|
||
<a-upload
|
||
:show-file-list="false"
|
||
:before-upload="beforeUpload"
|
||
accept=".pdf,.doc,.docx"
|
||
style="margin-left: 10px"
|
||
>
|
||
<a-button
|
||
type="outline"
|
||
size="mini"
|
||
:loading="uploading"
|
||
>
|
||
<template #icon><icon-upload /></template>
|
||
{{ detail.biddingDocuments ? '重新上传' : '上传文件' }}
|
||
</a-button>
|
||
</a-upload>
|
||
</div>
|
||
</a-descriptions-item>
|
||
</a-descriptions>
|
||
|
||
<div class="content-section">
|
||
<h3>招标内容</h3>
|
||
<div class="content-text">{{ detail.biddingContent }}</div>
|
||
<ul v-if="detail.contentItems && detail.contentItems.length">
|
||
<li v-for="(item, index) in detail.contentItems" :key="index">{{ item }}</li>
|
||
</ul>
|
||
</div>
|
||
</a-modal>
|
||
</template>
|
||
|
||
<script setup lang="ts">
|
||
import { ref } from 'vue'
|
||
import type { BiddingDetail } from './types'
|
||
|
||
const props = defineProps<{
|
||
visible: boolean
|
||
detail: BiddingDetail
|
||
uploading?: boolean
|
||
}>()
|
||
|
||
const emit = defineEmits(['update:visible', 'upload'])
|
||
|
||
const displayedFileName = computed(() => {
|
||
if (!props.detail?.biddingDocuments) return ''
|
||
const url = props.detail.biddingDocuments
|
||
return url.split('/').pop() || '招标文件'
|
||
})
|
||
|
||
// 平台URL映射
|
||
const platformUrls: Record<string, string> = {
|
||
'中国招标投标网': 'https://www.cebpubservice.com/',
|
||
'国能e招': 'https://www.negc.cn/',
|
||
'中国节能': 'https://www.cecec.cn/',
|
||
'三峡招标': 'https://epp.ctg.com.cn/'
|
||
}
|
||
|
||
const getPlatformUrl = (platformName: string): string => {
|
||
return platformUrls[platformName] || '#'
|
||
}
|
||
|
||
const handleUpload = () => {
|
||
emit('upload')
|
||
}
|
||
|
||
const beforeUpload = (file: File) => {
|
||
// 检查文件类型
|
||
const isValidType = [
|
||
'application/pdf',
|
||
'application/msword',
|
||
'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
|
||
].includes(file.type)
|
||
|
||
// 检查文件大小 (限制10MB)
|
||
const isLt10M = file.size / 1024 / 1024 < 10
|
||
|
||
if (!isValidType) {
|
||
Message.error('只能上传PDF或Word文件!')
|
||
return false
|
||
}
|
||
|
||
if (!isLt10M) {
|
||
Message.error('文件大小不能超过10MB!')
|
||
return false
|
||
}
|
||
|
||
// 触发上传事件
|
||
emit('upload', file)
|
||
|
||
// 返回false阻止默认上传行为,由父组件处理
|
||
return false
|
||
}
|
||
</script>
|
||
|
||
<style scoped lang="less">
|
||
.file-display {
|
||
display: flex;
|
||
align-items: center;
|
||
}
|
||
|
||
.file-link {
|
||
color: #1890ff;
|
||
text-decoration: underline;
|
||
cursor: pointer;
|
||
max-width: 200px;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
white-space: nowrap;
|
||
display: inline-block;
|
||
|
||
&:hover {
|
||
color: #40a9ff;
|
||
}
|
||
}
|
||
|
||
.no-file {
|
||
color: var(--color-text-3);
|
||
}
|
||
.platform-link {
|
||
color: #1890ff; /* 蓝色 */
|
||
text-decoration: underline; /* 下划线 */
|
||
cursor: pointer;
|
||
|
||
&:hover {
|
||
color: #40a9ff; /* 悬停时变浅蓝色 */
|
||
text-decoration: underline;
|
||
}
|
||
}
|
||
.content-section {
|
||
margin-top: 20px;
|
||
padding: 16px;
|
||
background-color: var(--color-fill-2);
|
||
border-radius: 4px;
|
||
|
||
h3 {
|
||
margin-bottom: 12px;
|
||
color: var(--color-text-1);
|
||
}
|
||
|
||
.content-text {
|
||
margin-bottom: 12px;
|
||
line-height: 1.6;
|
||
color: var(--color-text-2);
|
||
}
|
||
|
||
ul {
|
||
padding-left: 20px;
|
||
color: var(--color-text-2);
|
||
|
||
li {
|
||
margin-bottom: 8px;
|
||
line-height: 1.6;
|
||
}
|
||
}
|
||
}
|
||
</style> |