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

630 lines
26 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-pending { background: #fff7e6; color: #d46b08; }
.status-approved { background: #f6ffed; color: #52c41a; }
.status-rejected { background: #fff1f0; color: #ff4d4f; }
/* 审核流程时间线 */
.approval-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.pending { background: #d9d9d9; }
.timeline-dot.approved { background: #52c41a; }
.timeline-dot.rejected { background: #ff4d4f; }
.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;
}
/* 审核历史 */
.history-list {
margin-top: 16px;
}
.history-item {
padding: 12px;
background: #fafafa;
border-radius: 4px;
margin-bottom: 8px;
}
.history-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
}
.history-user {
font-size: 14px;
font-weight: 500;
color: #303133;
}
.history-time {
font-size: 12px;
color: #909399;
}
.history-comment {
font-size: 14px;
color: #606266;
line-height: 1.6;
}
/* 附件列表 */
.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;
}
/* 表单 */
.form-textarea {
width: 100%;
padding: 12px;
border: 1px solid #dcdfe6;
border-radius: 4px;
min-height: 100px;
font-size: 14px;
font-family: inherit;
resize: vertical;
}
.form-textarea:focus {
outline: none;
border-color: #409EFF;
}
/* 按钮 */
.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-success {
background: #67c23a;
color: white;
}
.btn-success:hover {
background: #85ce61;
}
.btn-danger {
background: #f56c6c;
color: white;
}
.btn-danger:hover {
background: #f78989;
}
.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;
text-align: right;
}
.action-buttons .btn {
margin-left: 12px;
}
</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>
<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 active">审核管理</div>
<div class="menu-item" onclick="window.location.href='project-bidding.html'">投标管理</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-approval.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">立项申请</div>
</div>
<div class="info-row">
<div class="info-label">项目编号</div>
<div class="info-value">25-1</div>
</div>
<div class="info-row">
<div class="info-label">项目名称</div>
<div class="info-value">XX工程项目</div>
</div>
<div class="info-row">
<div class="info-label">客户名称</div>
<div class="info-value">XX公司</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">¥500,000</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-10 14:30</div>
</div>
<div class="info-row">
<div class="info-label">当前状态</div>
<div class="info-value">
<span class="status-badge status-pending">待审核</span>
</div>
</div>
</div>
<!-- 多人提交状态(仅成果审核显示) -->
<div id="multiSubmitStatus" class="info-card" style="display: none;">
<div class="info-section-title">多人提交状态</div>
<div style="background: #f5f7fa; padding: 16px; border-radius: 4px;">
<div style="margin-bottom: 12px;">
<strong>已分配人员:</strong>
<span id="allStaffList">张三、李四、王五</span>
</div>
<div style="margin-bottom: 12px;">
<strong>已提交人员:</strong>
<span id="submittedStaffList" style="color: #52c41a;">张三、李四</span>
</div>
<div style="margin-bottom: 12px;">
<strong>待提交人员:</strong>
<span id="pendingStaffList" style="color: #ff4d4f;">王五</span>
</div>
<div style="background: #fff7e6; padding: 12px; border-radius: 4px; margin-top: 12px; font-size: 13px; color: #d46b08;">
💡 等待所有人员提交完成后,将自动进入组长审核环节
</div>
</div>
</div>
<!-- 审核流程 -->
<div class="info-card">
<div class="info-section-title">审核流程</div>
<div class="approval-timeline" id="approvalTimeline">
<div class="timeline-item">
<div class="timeline-dot approved"></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 approved"></div>
<div class="timeline-content">
<div class="timeline-title">部门负责人审核</div>
<div class="timeline-desc">审核人:李经理 | 审核通过</div>
<div class="timeline-time">2025-01-11 09:15</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="history-list">
<div class="history-item">
<div class="history-header">
<span class="history-user">李经理(部门负责人)</span>
<span class="history-time">2025-01-11 09:15</span>
</div>
<div class="history-comment">
审核通过:项目信息完整,符合立项要求。
</div>
</div>
<div class="history-item">
<div class="history-header">
<span class="history-user">张三(申请人)</span>
<span class="history-time">2025-01-10 14:30</span>
</div>
<div class="history-comment">
提交立项申请
</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">2.5 MB</div>
</div>
<div class="file-action" onclick="downloadFile('file1')">下载</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">156 KB</div>
</div>
<div class="file-action" onclick="downloadFile('file2')">下载</div>
</div>
</div>
</div>
<!-- 审核意见 -->
<div class="info-card">
<div class="info-section-title">审核意见</div>
<textarea class="form-textarea" placeholder="请输入审核意见(可选)" id="approvalComment"></textarea>
</div>
<!-- 操作按钮 -->
<div class="action-buttons">
<button class="btn btn-default" onclick="window.location.href='project-approval.html'">取消</button>
<button class="btn btn-danger" onclick="reject()">驳回</button>
<button class="btn btn-success" onclick="approve()">通过</button>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
// 页面加载时初始化
window.onload = function() {
// 从URL参数或数据中获取审核类型这里用模拟数据
const urlParams = new URLSearchParams(window.location.search);
const approvalType = urlParams.get('type') || 'initiation'; // initiation, start, output
// 如果是成果审核,显示多人提交状态
if (approvalType === 'output') {
showMultiSubmitStatus();
updateOutputApprovalTimeline();
}
};
// 显示多人提交状态
function showMultiSubmitStatus() {
const multiSubmitStatus = document.getElementById('multiSubmitStatus');
if (multiSubmitStatus) {
multiSubmitStatus.style.display = 'block';
// 模拟数据,实际应从后端获取
document.getElementById('allStaffList').textContent = '张三、李四、王五';
document.getElementById('submittedStaffList').textContent = '张三、李四';
document.getElementById('pendingStaffList').textContent = '王五';
}
}
// 更新成果审核流程(支持双领导审核)
function updateOutputApprovalTimeline() {
const timeline = document.getElementById('approvalTimeline');
if (!timeline) return;
// 检查是否是最终成果审核
const urlParams = new URLSearchParams(window.location.search);
const outputType = urlParams.get('outputType') || 'draft'; // draft, reconciliation, final
if (outputType === 'final') {
// 最终成果需要双领导审核
timeline.innerHTML = `
<div class="timeline-item">
<div class="timeline-dot approved">✓</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 approved">✓</div>
<div class="timeline-content">
<div class="timeline-title">组长审核</div>
<div class="timeline-desc">审核人:项目组长 | 审核通过</div>
<div class="timeline-time">2025-01-15 11: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>
`;
} else {
// 初稿/对账审核流程
timeline.innerHTML = `
<div class="timeline-item">
<div class="timeline-dot approved">✓</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 approved">✓</div>
<div class="timeline-content">
<div class="timeline-title">组长审核</div>
<div class="timeline-desc">审核人:项目组长 | 审核通过</div>
<div class="timeline-time">2025-01-15 11: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>
`;
}
}
function approve() {
const comment = document.getElementById('approvalComment').value;
CommonUtils.createModal('确认审核', '确认通过该审核?', () => {
CommonUtils.showMessage('审核通过!');
setTimeout(() => window.location.href = 'project-approval.html', 1000);
return true;
});
}
function reject() {
const comment = document.getElementById('approvalComment').value;
if (!comment.trim()) {
CommonUtils.showMessage('驳回时请输入驳回原因', 'error');
document.getElementById('approvalComment').focus();
return;
}
CommonUtils.createModal('确认驳回', `确认驳回该申请?驳回原因:${comment}`, () => {
CommonUtils.showMessage('已驳回:' + comment);
setTimeout(() => window.location.href = 'project-approval.html', 1000);
return true;
});
}
function downloadFile(fileId) {
const fileName = event.target.closest('.file-item').querySelector('.file-name').textContent;
CommonUtils.downloadFile(fileName, fileId);
}
</script>
<script src="unified-layout.js"></script>
<script>
initUnifiedLayout('approval');
</script>
</body>
</html>