someone-oa/pc/bidding-detail.html
2025-12-11 19:04:46 +08:00

439 lines
17 KiB
HTML
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.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>投标详情 - OA系统</title>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<!-- 统一布局样式 -->
<link rel="stylesheet" href="unified-layout.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;
background: #f0f2f5;
overflow: hidden;
}
.layout-container {
height: 100vh;
display: flex;
flex-direction: column;
}
.main-container {
flex: 1;
display: flex;
overflow: hidden;
}
.app-main {
flex: 1;
overflow: hidden;
display: flex;
flex-direction: column;
background: #f0f2f5;
}
.sidebar {
width: 210px;
background: #fff;
border-right: 1px solid #e6e6e6;
overflow-y: auto;
}
.menu-item { padding: 12px 24px; cursor: pointer; transition: background 0.3s; color: #303133; }
.menu-item:hover {
background: #ecf5ff;
color: #409EFF;
}
.menu-item.active { background: #409EFF; color: #fff; }
.content {
flex: 1;
padding: 20px;
overflow-y: auto;
background: #fff;
margin: 10px;
border-radius: 4px;
}
.page-header {
margin-bottom: 24px;
padding-bottom: 16px;
border-bottom: 1px solid #f0f0f0;
display: flex;
justify-content: space-between;
align-items: center;
}
.page-title { font-size: 20px; font-weight: 500; color: #303133; }
.info-card {
background: #fff;
border: 1px solid #e6e6e6;
border-radius: 4px;
padding: 20px;
margin-bottom: 20px;
}
.info-section-title {
font-size: 16px;
font-weight: 500;
margin-bottom: 16px;
padding-bottom: 12px;
border-bottom: 1px solid #f0f0f0;
color: #303133;
}
.info-row {
display: flex;
padding: 12px 0;
border-bottom: 1px solid #f5f5f5;
}
.info-row:last-child { border-bottom: none; }
.info-label {
width: 120px;
color: #909399;
font-size: 14px;
}
.info-value {
flex: 1;
color: #303133;
font-size: 14px;
}
.status-badge {
padding: 4px 12px;
border-radius: 4px;
font-size: 12px;
display: inline-block;
}
.status-bidding { background: #fff7e6; color: #d46b08; }
.status-success { background: #f6ffed; color: #52c41a; }
.status-failed { background: #fff1f0; color: #ff4d4f; }
/* 投标时间线 */
.bidding-timeline {
margin: 20px 0;
}
.timeline-item {
display: flex;
padding: 16px 0;
position: relative;
}
.timeline-item:not(:last-child)::after {
content: '';
position: absolute;
left: 15px;
top: 40px;
bottom: -16px;
width: 2px;
background: #e6e6e6;
}
.timeline-dot {
width: 32px;
height: 32px;
border-radius: 50%;
background: #e6e6e6;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
color: #fff;
flex-shrink: 0;
position: relative;
z-index: 1;
}
.timeline-dot.completed { background: #52c41a; }
.timeline-dot.current { background: #409EFF; }
.timeline-dot.pending { background: #d9d9d9; }
.timeline-content {
flex: 1;
margin-left: 16px;
}
.timeline-title {
font-size: 14px;
font-weight: 500;
color: #303133;
margin-bottom: 4px;
}
.timeline-desc {
font-size: 12px;
color: #909399;
margin-bottom: 4px;
}
.timeline-time {
font-size: 12px;
color: #c0c4cc;
}
/* 附件列表 */
.file-list {
margin-top: 12px;
}
.file-item {
display: flex;
align-items: center;
padding: 8px 12px;
background: #fafafa;
border-radius: 4px;
margin-bottom: 8px;
}
.file-icon {
width: 32px;
height: 32px;
background: #409EFF;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
margin-right: 12px;
font-size: 14px;
}
.file-info {
flex: 1;
}
.file-name {
font-size: 14px;
color: #303133;
margin-bottom: 4px;
}
.file-size {
font-size: 12px;
color: #909399;
}
.file-action {
color: #409EFF;
cursor: pointer;
font-size: 14px;
margin-left: 12px;
}
/* 按钮 */
.btn {
padding: 10px 20px;
border: none;
border-radius: 4px;
font-size: 14px;
cursor: pointer;
transition: all 0.3s;
}
.btn-primary {
background: #409EFF;
color: white;
}
.btn-primary:hover {
background: #66b1ff;
}
.btn-default {
background: white;
color: #606266;
border: 1px solid #dcdfe6;
}
.btn-default:hover {
color: #409EFF;
border-color: #409EFF;
}
.action-buttons {
margin-top: 24px;
padding-top: 24px;
border-top: 1px solid #f0f0f0;
display: flex;
justify-content: space-between;
align-items: center;
}
</style>
<!-- Vue.js -->
<script src="https://unpkg.com/vue@2/dist/vue.js"></script>
<!-- Element UI JS -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script src="common.js"></script>
</head>
<body>
<div id="app">
<div class="layout-container">
<div class="main-container">
<div class="sidebar">
<div class="menu-item" onclick="window.location.href='project-initiation.html'">立项申请</div>
<div class="menu-item" onclick="window.location.href='project-list.html'">项目查询</div>
<div class="menu-item" onclick="window.location.href='project-approval.html'">审核管理</div>
<div class="menu-item active">投标管理</div>
<div class="menu-item" onclick="window.location.href='project-contract.html'">合同管理</div>
</div>
<div class="app-main">
<div class="content">
<div class="page-header">
<div class="page-title">投标详情</div>
<button class="btn btn-default" onclick="window.location.href='project-bidding.html'">返回列表</button>
</div>
<!-- 项目信息 -->
<div class="info-card">
<div class="info-section-title">项目信息</div>
<div class="info-row">
<div class="info-label">项目编号</div>
<div class="info-value">25-2</div>
</div>
<div class="info-row">
<div class="info-label">项目名称</div>
<div class="info-value">YY工程项目</div>
</div>
<div class="info-row">
<div class="info-label">客户名称</div>
<div class="info-value">YY公司</div>
</div>
<div class="info-row">
<div class="info-label">服务内容</div>
<div class="info-value">跟踪审计</div>
</div>
<div class="info-row">
<div class="info-label">预计金额</div>
<div class="info-value">¥800,000</div>
</div>
<div class="info-row">
<div class="info-label">投标状态</div>
<div class="info-value">
<span class="status-badge status-bidding">投标中</span>
</div>
</div>
<div class="info-row">
<div class="info-label">负责人</div>
<div class="info-value">李四</div>
</div>
<div class="info-row">
<div class="info-label">投标开始时间</div>
<div class="info-value">2025-01-12 10:00</div>
</div>
</div>
<!-- 投标流程 -->
<div class="info-card">
<div class="info-section-title">投标流程</div>
<div class="bidding-timeline">
<div class="timeline-item">
<div class="timeline-dot completed"></div>
<div class="timeline-content">
<div class="timeline-title">项目立项</div>
<div class="timeline-desc">项目已通过立项审核</div>
<div class="timeline-time">2025-01-10 14:30</div>
</div>
</div>
<div class="timeline-item">
<div class="timeline-dot completed"></div>
<div class="timeline-content">
<div class="timeline-title">进入投标阶段</div>
<div class="timeline-desc">项目状态更新为"投标中"</div>
<div class="timeline-time">2025-01-12 10:00</div>
</div>
</div>
<div class="timeline-item">
<div class="timeline-dot current"></div>
<div class="timeline-content">
<div class="timeline-title">投标进行中</div>
<div class="timeline-desc">等待投标结果</div>
<div class="timeline-time">进行中</div>
</div>
</div>
<div class="timeline-item">
<div class="timeline-dot pending"></div>
<div class="timeline-content">
<div class="timeline-title">投标结果</div>
<div class="timeline-desc">等待开标结果</div>
<div class="timeline-time">-</div>
</div>
</div>
</div>
</div>
<!-- 投标信息 -->
<div class="info-card">
<div class="info-section-title">投标信息</div>
<div class="info-row">
<div class="info-label">投标日期</div>
<div class="info-value">2025-01-12</div>
</div>
<div class="info-row">
<div class="info-label">投标截止日期</div>
<div class="info-value">2025-02-15</div>
</div>
<div class="info-row">
<div class="info-label">开标日期</div>
<div class="info-value">2025-02-20</div>
</div>
<div class="info-row">
<div class="info-label">投标说明</div>
<div class="info-value">本项目为跟踪审计服务预计周期6个月。</div>
</div>
</div>
<!-- 投标附件 -->
<div class="info-card">
<div class="info-section-title">投标附件</div>
<div class="file-list">
<div class="file-item">
<div class="file-icon">📄</div>
<div class="file-info">
<div class="file-name">投标文件.pdf</div>
<div class="file-size">3.2 MB</div>
</div>
<div class="file-action" onclick="downloadFile('bid1')">下载</div>
<div class="file-action" onclick="deleteFile('bid1')" style="color: #f56c6c;">删除</div>
</div>
<div class="file-item">
<div class="file-icon">📊</div>
<div class="file-info">
<div class="file-name">投标报价单.xlsx</div>
<div class="file-size">245 KB</div>
</div>
<div class="file-action" onclick="downloadFile('bid2')">下载</div>
<div class="file-action" onclick="deleteFile('bid2')" style="color: #f56c6c;">删除</div>
</div>
</div>
<div style="margin-top: 12px;">
<button class="btn btn-primary" onclick="uploadFile()">+ 上传附件</button>
</div>
</div>
<!-- 操作按钮 -->
<div class="action-buttons">
<div>
<button class="btn btn-primary" onclick="updateStatus('success')">更新为中标</button>
<button class="btn btn-default" onclick="updateStatus('failed')" style="margin-left: 12px;">更新为未中标</button>
</div>
<div>
<button class="btn btn-default" onclick="window.location.href='project-bidding.html'">返回列表</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
function downloadFile(fileId) {
const fileName = event.target.closest('.file-item').querySelector('.file-name').textContent;
CommonUtils.downloadFile(fileName, fileId);
}
function deleteFile(fileId) {
const fileName = event.target.closest('.file-item').querySelector('.file-name').textContent;
CommonUtils.deleteFile(fileId, fileName, () => {
event.target.closest('.file-item').remove();
});
}
function uploadFile() {
CommonUtils.uploadFile('*', (file) => {
CommonUtils.showMessage('文件上传成功:' + file.name);
}, 50);
}
function updateStatus(status) {
const statusText = status === 'success' ? '中标' : '未中标';
CommonUtils.createModal('确认更新', `确认更新投标状态为"${statusText}"`, () => {
CommonUtils.showMessage('状态已更新为:' + statusText);
setTimeout(() => window.location.href = 'project-bidding.html', 1000);
return true;
});
}
</script>
<script src="unified-layout.js"></script>
<script>
initUnifiedLayout('project');
</script>
</body>
</html>