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

422 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-contract { background: #f6ffed; color: #52c41a; }
/* 合同时间线 */
.contract-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-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;
}
</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" onclick="window.location.href='project-bidding.html'">投标管理</div>
<div class="menu-item active">合同管理</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-contract.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-3</div>
</div>
<div class="info-row">
<div class="info-label">项目名称</div>
<div class="info-value">ZZ工程项目</div>
</div>
<div class="info-row">
<div class="info-label">客户名称</div>
<div class="info-value">ZZ公司</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">王五</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">HT-2025-003</div>
</div>
<div class="info-row">
<div class="info-label">合同名称</div>
<div class="info-value">ZZ工程项目结算审计服务合同</div>
</div>
<div class="info-row">
<div class="info-label">合同金额</div>
<div class="info-value" style="color: #f56c6c; font-size: 16px; font-weight: 500;">¥600,000</div>
</div>
<div class="info-row">
<div class="info-label">签约日期</div>
<div class="info-value">2025-01-15</div>
</div>
<div class="info-row">
<div class="info-label">合同开始日期</div>
<div class="info-value">2025-01-20</div>
</div>
<div class="info-row">
<div class="info-label">合同结束日期</div>
<div class="info-value">2025-07-20</div>
</div>
<div class="info-row">
<div class="info-label">合同期限</div>
<div class="info-value">6个月</div>
</div>
<div class="info-row">
<div class="info-label">合同状态</div>
<div class="info-value">
<span class="status-badge status-contract">已签合同</span>
</div>
</div>
<div class="info-row">
<div class="info-label">付款方式</div>
<div class="info-value">分期付款签约30%中期40%验收30%</div>
</div>
<div class="info-row">
<div class="info-label">合同说明</div>
<div class="info-value">本合同为ZZ工程项目的结算审计服务合同包含完整的结算审计服务内容。</div>
</div>
</div>
<!-- 合同流程 -->
<div class="info-card">
<div class="info-section-title">合同流程</div>
<div class="contract-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-14 16:00</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-15 10:30</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>
</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">5.8 MB</div>
</div>
<div class="file-action" onclick="downloadFile('contract1')">下载</div>
<div class="file-action" onclick="previewFile('contract1')">预览</div>
</div>
<div class="file-item">
<div class="file-icon">📋</div>
<div class="file-info">
<div class="file-name">合同附件-服务清单.docx</div>
<div class="file-size">156 KB</div>
</div>
<div class="file-action" onclick="downloadFile('contract2')">下载</div>
<div class="file-action" onclick="previewFile('contract2')">预览</div>
</div>
</div>
<div style="margin-top: 12px;">
<button class="btn btn-primary" onclick="uploadFile()">+ 上传附件</button>
</div>
</div>
<!-- 操作按钮 -->
<div style="margin-top: 24px; padding-top: 24px; border-top: 1px solid #f0f0f0; text-align: right;">
<button class="btn btn-default" onclick="window.location.href='project-contract.html'">返回列表</button>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
function downloadFile(fileId) {
CommonUtils.downloadFile(event.target.closest('.file-item').querySelector('.file-name').textContent, arguments[0]);
}
function previewFile(fileId) {
const fileName = event.target.closest('.file-item').querySelector('.file-name').textContent;
CommonUtils.showMessage('预览文件:' + fileName);
}
function uploadFile() {
CommonUtils.uploadFile('*', (file) => {
CommonUtils.showMessage('文件上传成功:' + file.name);
}, 50);
}
</script>
<script src="unified-layout.js"></script>
<script>
initUnifiedLayout('project');
</script>
</body>
</html>