Files
leaudit-platform-frontend/html/评查-详情_副本.html
T

2186 lines
111 KiB
HTML

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>中国烟草AI合同及卷宗审核系统 - 评查详情</title>
<link href="https://cdn.jsdelivr.net/npm/remixicon@2.5.0/fonts/remixicon.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<style>
:root {
--primary-color: #00684a;
--primary-hover: #005a40;
--primary-light: rgba(0, 104, 74, 0.1);
--success-color: #52c41a;
--warning-color: #faad14;
--error-color: #ff4d4f;
--text-color: rgba(0, 0, 0, 0.85);
--text-secondary: rgba(0, 0, 0, 0.45);
--border-color: #f0f0f0;
--bg-gray: #f5f5f5;
}
body {
font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
line-height: 1.5;
color: var(--text-color);
background-color: var(--bg-gray);
}
.layout-container {
display: flex;
min-height: 100vh;
}
.sidebar {
width: 240px;
background-color: white;
border-right: 1px solid var(--border-color);
position: fixed;
top: 0;
left: 0;
bottom: 0;
overflow-y: auto;
z-index: 10;
}
.main-content {
margin-left: 240px;
width: calc(100% - 240px);
padding: 24px;
background-color: var(--bg-gray);
}
.sidebar-menu-item a {
display: flex;
align-items: center;
padding: 12px 16px;
border-radius: 4px;
margin: 0 8px;
color: var(--text-color);
transition: all 0.3s;
}
.sidebar-menu-item:hover a {
background-color: var(--primary-light);
color: var(--primary-color);
}
.sidebar-menu-item.active a {
background-color: var(--primary-light);
color: var(--primary-color);
font-weight: 500;
}
.ant-card {
border-radius: 6px;
border: 1px solid var(--border-color);
background-color: white;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03);
margin-bottom: 16px;
}
.ant-card-header {
padding: 16px;
border-bottom: 1px solid var(--border-color);
font-weight: 500;
}
.ant-card-body {
padding: 24px;
}
.ant-btn {
border-radius: 4px;
padding: 8px 16px;
font-size: 14px;
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.3s;
}
.ant-btn-primary {
background-color: var(--primary-color);
border: 1px solid var(--primary-color);
color: white;
}
.ant-btn-primary:hover {
background-color: var(--primary-hover);
border-color: var(--primary-hover);
}
.ant-btn-default {
background-color: white;
border: 1px solid #d9d9d9;
color: var(--text-color);
}
.ant-btn-default:hover {
border-color: var(--primary-color);
color: var(--primary-color);
}
.ant-btn i {
margin-right: 6px;
}
.breadcrumb {
display: flex;
margin-bottom: 16px;
}
.breadcrumb-item {
font-size: 14px;
color: var(--text-secondary);
}
.breadcrumb-item:last-child {
color: var(--text-color);
}
.breadcrumb-item:not(:last-child)::after {
content: '/';
margin: 0 8px;
color: #d9d9d9;
}
.text-primary { color: var(--primary-color); }
.text-success { color: var(--success-color); }
.text-warning { color: var(--warning-color); }
.text-error { color: var(--error-color); }
.text-secondary { color: var(--text-secondary); }
.bg-primary { background-color: var(--primary-color); }
.bg-primary-light { background-color: var(--primary-light); }
.bg-success { background-color: #f6ffed; }
.bg-warning { background-color: #fffbe6; }
.bg-error { background-color: #fff2f0; }
/* Status badge */
.status-badge {
display: inline-flex;
align-items: center;
padding: 2px 8px;
border-radius: 4px;
font-size: 12px;
font-weight: 500;
}
.status-waiting {
background-color: #f9f0ff;
color: #722ed1;
}
.status-processing {
background-color: #e6f7ff;
color: #1890ff;
}
.status-success {
background-color: #f6ffed;
color: #52c41a;
}
.status-error {
background-color: #fff1f0;
color: #f5222d;
}
.status-warning {
background-color: #fffbe6;
color: #faad14;
}
/* Severity indicator */
.severity-indicator {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 50%;
margin-right: 8px;
vertical-align: middle;
}
.severity-info {
background-color: #1890ff;
}
.severity-warning {
background-color: #faad14;
}
.severity-error {
background-color: #ff4d4f;
}
.severity-critical {
background-color: #722ed1;
}
/* File preview */
.file-preview {
background-color: white;
border: 1px solid var(--border-color);
border-radius: 6px;
height: calc(100vh - 220px);
min-height: 500px;
overflow: hidden;
display: flex;
flex-direction: column;
}
.file-preview-header {
padding: 12px 16px;
border-bottom: 1px solid var(--border-color);
display: flex;
justify-content: space-between;
align-items: center;
background-color: #fafafa;
}
.file-preview-content {
flex: 1;
overflow-y: auto;
position: relative;
}
.file-preview-image {
width: 100%;
height: 100%;
object-fit: contain;
}
.file-preview-actions {
display: flex;
gap: 8px;
}
/* PDF viewer */
.pdf-container {
height: 100%;
display: flex;
flex-direction: column;
}
.pdf-controls {
display: flex;
justify-content: center;
align-items: center;
padding: 8px;
border-bottom: 1px solid var(--border-color);
gap: 16px;
background-color: #fafafa;
}
.pdf-viewer {
flex: 1;
overflow-y: auto;
}
.pdf-page {
margin: 10px auto;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
position: relative;
}
/* Review points panel */
.review-points-panel {
background-color: white;
border: 1px solid var(--border-color);
border-radius: 6px;
height: calc(100vh - 220px);
min-height: 500px;
display: flex;
flex-direction: column;
overflow: hidden;
}
.review-panel-header {
padding: 12px 16px;
border-bottom: 1px solid var(--border-color);
background-color: #fafafa;
font-weight: 500;
}
.review-statistics {
padding: 16px;
border-bottom: 1px solid var(--border-color);
background-color: #fafafa;
}
.review-points-list {
flex: 1;
overflow-y: auto;
padding: 0;
}
.review-point-item {
padding: 16px;
border-bottom: 1px solid var(--border-color);
cursor: pointer;
transition: background-color 0.3s;
}
.review-point-item:hover {
background-color: #f5f5f5;
}
.review-point-item.active {
background-color: var(--primary-light);
}
.review-point-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
}
.review-point-title {
font-weight: 500;
}
.review-point-desc {
font-size: 13px;
color: var(--text-secondary);
margin-bottom: 8px;
}
.review-point-location {
display: inline-flex;
align-items: center;
font-size: 12px;
color: var(--text-secondary);
background-color: #f5f5f5;
border-radius: 4px;
padding: 2px 8px;
}
/* Review point detail panel */
.review-detail-panel {
padding: 16px;
border-top: 1px solid var(--border-color);
background-color: #fafafa;
max-height: 40%;
overflow-y: auto;
display: none;
}
.review-detail-panel.visible {
display: block;
}
.review-detail-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
}
.review-detail-title {
font-weight: 500;
font-size: 16px;
}
.review-detail-close {
color: var(--text-secondary);
cursor: pointer;
}
.review-detail-section {
margin-bottom: 16px;
}
.review-detail-section-title {
font-weight: 500;
margin-bottom: 8px;
}
.review-detail-content {
background-color: white;
border: 1px solid var(--border-color);
border-radius: 4px;
padding: 12px;
font-size: 13px;
margin-bottom: 8px;
}
.review-detail-actions {
display: flex;
gap: 8px;
justify-content: flex-end;
margin-top: 16px;
}
/* Highlighted sections on PDF */
.highlight-area {
position: absolute;
background-color: rgba(250, 173, 20, 0.2);
border: 2px solid var(--warning-color);
cursor: pointer;
z-index: 10;
}
.highlight-area.error {
background-color: rgba(255, 77, 79, 0.2);
border-color: var(--error-color);
}
.highlight-area.success {
background-color: rgba(82, 196, 26, 0.2);
border-color: var(--success-color);
}
/* Tooltip */
.tooltip {
position: absolute;
background-color: white;
border: 1px solid var(--border-color);
border-radius: 4px;
padding: 8px 12px;
font-size: 12px;
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
z-index: 100;
max-width: 250px;
display: none;
}
.tooltip-title {
font-weight: 500;
margin-bottom: 4px;
}
/* Result count summary */
.result-summary {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 16px;
margin-bottom: 16px;
}
.result-tag {
display: inline-flex;
align-items: center;
font-size: 13px;
color: var(--text-secondary);
}
.result-tag-count {
font-weight: 500;
margin-left: 4px;
color: var(--text-color);
}
/* Form styles */
.form-label {
display: block;
font-size: 14px;
color: var(--text-color);
margin-bottom: 8px;
}
.form-input {
width: 100%;
border: 1px solid #d9d9d9;
border-radius: 4px;
padding: 8px 12px;
font-size: 14px;
transition: all 0.3s;
}
.form-textarea {
width: 100%;
border: 1px solid #d9d9d9;
border-radius: 4px;
padding: 8px 12px;
font-size: 14px;
min-height: 80px;
max-height: 160px;
transition: all 0.3s;
}
.form-input:focus,
.form-textarea:focus {
outline: none;
border-color: var(--primary-color);
box-shadow: 0 0 0 2px rgba(0, 104, 74, 0.2);
}
/* File info list */
.file-info-list {
list-style: none;
padding: 0;
margin: 0;
}
.file-info-item {
display: flex;
margin-bottom: 8px;
}
.file-info-label {
flex: 0 0 80px;
color: var(--text-secondary);
}
.file-info-value {
flex: 1;
}
/* 页面选项卡样式 */
.tab-container {
margin-bottom: 16px;
}
.tab-nav {
display: flex;
border-bottom: 1px solid var(--border-color);
background-color: white;
border-top-left-radius: 6px;
border-top-right-radius: 6px;
overflow: hidden;
}
.tab-nav-item {
padding: 12px 20px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
border-bottom: 2px solid transparent;
transition: all 0.3s;
display: flex;
align-items: center;
}
.tab-nav-item i {
margin-right: 6px;
font-size: 16px;
}
.tab-nav-item:hover {
color: var(--primary-color);
}
.tab-nav-item.active {
color: var(--primary-color);
border-bottom-color: var(--primary-color);
}
.tab-content {
background-color: white;
border: 1px solid var(--border-color);
border-top: none;
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
padding: 20px;
}
.tab-pane {
display: none;
}
.tab-pane.active {
display: block;
}
/* 新增:文档内容样式 */
.word-document {
padding: 40px;
background-color: white;
font-family: 'SimSun', serif;
line-height: 1.8;
}
.word-document h1 {
font-size: 18px;
text-align: center;
font-weight: bold;
margin-bottom: 20px;
}
.word-document h2 {
font-size: 16px;
font-weight: bold;
margin-top: 16px;
margin-bottom: 8px;
}
.word-document p {
text-indent: 2em;
margin-bottom: 10px;
}
/* 高亮区域增加交互提示 */
.highlight-area {
cursor: pointer;
transition: all 0.2s;
}
.highlight-area:hover {
box-shadow: 0 0 0 3px rgba(250, 173, 20, 0.6);
}
/* 替换动作按钮 */
.replace-action {
background-color: #1890ff;
color: white;
border: none;
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
cursor: pointer;
margin-top: 6px;
display: inline-flex;
align-items: center;
}
.replace-action i {
margin-right: 4px;
}
.replace-action:hover {
background-color: #40a9ff;
}
/* 评查标签增强 */
.review-tag {
display: inline-flex;
align-items: center;
padding: 2px 6px;
border-radius: 4px;
font-size: 12px;
margin-right: 6px;
}
.review-tag-warning {
background-color: #fffbe6;
color: #faad14;
border: 1px solid #ffe58f;
}
.review-tag-error {
background-color: #fff2f0;
color: #ff4d4f;
border: 1px solid #ffccc7;
}
.review-tag-success {
background-color: #f6ffed;
color: #52c41a;
border: 1px solid #b7eb8f;
}
.human-review-note {
background-color: #e6f7ff;
border-left: 3px solid #1890ff;
padding: 6px 10px;
margin-top: 6px;
font-size: 12px;
color: #333;
}
.human-review-badge {
display: inline-flex;
align-items: center;
background-color: #e6f7ff;
color: #1890ff;
padding: 1px 4px;
border-radius: 4px;
font-size: 11px;
margin-left: 4px;
line-height: 1.2;
}
.human-review-request {
display: flex;
align-items: center;
justify-content: center;
margin-top: 6px;
background-color: #f9f0ff;
color: #722ed1;
padding: 4px;
border-radius: 4px;
cursor: pointer;
font-size: 12px;
}
.human-review-request i {
margin-right: 4px;
}
/* 调整评查点样式以适应窄空间 */
.review-point-header {
align-items: flex-start;
flex-wrap: wrap;
}
.review-point-title {
font-size: 13px;
line-height: 1.3;
margin-right: 8px;
margin-bottom: 3px;
}
.review-point-desc {
font-size: 12px;
line-height: 1.4;
}
.status-badge {
font-size: 11px;
padding: 1px 4px;
white-space: nowrap;
}
.replace-action {
font-size: 11px;
padding: 2px 8px;
height: auto;
line-height: 1.5;
}
/* 处理中状态 */
.status-processing {
background-color: #e6f7ff;
color: #1890ff;
}
/* 人工审核相关样式 */
.manual-review-container {
margin-top: 10px;
padding: 10px;
background-color: #f8f9fa;
border-radius: 4px;
border-left: 3px solid #1890ff;
}
.manual-review-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
}
.manual-review-title {
font-weight: 500;
color: #1890ff;
display: flex;
align-items: center;
}
.manual-review-title i {
margin-right: 4px;
}
.manual-review-textarea {
width: 100%;
padding: 8px;
border: 1px solid #e8e8e8;
border-radius: 4px;
min-height: 80px;
margin-bottom: 8px;
resize: vertical;
}
.manual-review-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
}
.manual-review-status {
display: inline-flex;
align-items: center;
padding: 2px 8px;
border-radius: 12px;
font-size: 12px;
margin-left: 8px;
}
.status-processing {
background-color: #e6f7ff;
color: #1890ff;
}
.status-approved {
background-color: #f6ffed;
color: #52c41a;
}
.status-rejected {
background-color: #fff2f0;
color: #ff4d4f;
}
/* 历史意见样式 */
.history-opinions {
margin-top: 8px;
padding-top: 8px;
border-top: 1px dashed #e8e8e8;
}
.history-opinion-item {
padding: 8px;
background-color: #ffffff;
border-radius: 4px;
margin-bottom: 6px;
font-size: 13px;
}
.opinion-meta {
display: flex;
justify-content: space-between;
font-size: 12px;
color: #999;
margin-bottom: 4px;
}
.opinion-content {
color: #333;
}
</style>
</head>
<body>
<div class="layout-container">
<!-- 侧边栏 -->
<div class="sidebar">
<div class="py-6 px-4 border-b border-gray-100">
<div class="flex items-center">
<i class="ri-file-search-line text-primary text-xl mr-2"></i>
<h2 class="text-lg font-medium">AI审核系统</h2>
</div>
</div>
<div class="py-4">
<div class="sidebar-menu-item">
<a href="#" class="flex items-center text-sm font-medium">
<i class="ri-dashboard-line mr-3"></i>
<span>首页</span>
</a>
</div>
<div class="sidebar-menu-item">
<a href="#" class="flex items-center text-sm font-medium">
<i class="ri-file-upload-line mr-3"></i>
<span>文件上传</span>
</a>
</div>
<div class="sidebar-menu-item active">
<a href="#" class="flex items-center text-sm font-medium">
<i class="ri-list-check-2 mr-3"></i>
<span>评查文件列表</span>
</a>
</div>
<div class="sidebar-menu-item">
<a href="#" class="flex items-center text-sm font-medium">
<i class="ri-history-line mr-3"></i>
<span>审核历史</span>
</a>
</div>
<div class="sidebar-menu-item">
<a href="#" class="flex items-center text-sm font-medium">
<i class="ri-settings-3-line mr-3"></i>
<span>系统设置</span>
</a>
</div>
</div>
</div>
<!-- 主内容区 -->
<div class="main-content">
<!-- 面包屑导航 -->
<div class="breadcrumb">
<span class="breadcrumb-item">首页</span>
<span class="breadcrumb-item">评查文件列表</span>
<span class="breadcrumb-item">评查详情</span>
</div>
<!-- 文件信息和操作 -->
<div class="mb-4">
<div class="flex justify-between items-center">
<div>
<h2 class="text-xl font-medium">烟草产品销售合同(2023版).docx <span class="text-sm text-secondary font-normal">合同编号:XS-2023-1025-001</span></h2>
</div>
<div class="flex space-x-3">
<button class="ant-btn ant-btn-default">
<i class="ri-file-download-line"></i> 下载原文件
</button>
<button class="ant-btn ant-btn-default">
<i class="ri-file-copy-line"></i> 导出评查报告
</button>
<button class="ant-btn ant-btn-primary">
<i class="ri-check-double-line"></i> 确认评查结果
</button>
</div>
</div>
</div>
<!-- 选项卡导航 -->
<div class="tab-container">
<div class="tab-nav">
<div class="tab-nav-item active" data-tab="tab-preview">
<i class="ri-file-text-line"></i> 评查结果
</div>
<div class="tab-nav-item" data-tab="tab-suggestion">
<i class="ri-lightbulb-line"></i> AI智能分析
</div>
<div class="tab-nav-item" data-tab="tab-fileinfo">
<i class="ri-information-line"></i> 文件信息
</div>
</div>
<!-- 选项卡内容 -->
<div class="tab-content">
<!-- 预览选项卡内容 - 修复左右布局问题 -->
<div class="tab-pane active" id="tab-preview">
<!-- 文件内容和评查点 - 确保左右布局 -->
<div class="flex flex-col lg:flex-row space-y-4 lg:space-y-0 lg:space-x-4">
<!-- 左侧:文件预览 -->
<div class="w-full lg:w-2/3">
<div class="file-preview">
<div class="file-preview-header py-2 px-4 flex items-center justify-between bg-primary-light" style="height: 36px;">
<div class="flex items-center">
<i class="ri-file-text-line text-primary mr-2"></i>
<span class="font-medium text-primary">文件预览</span>
</div>
<div class="file-preview-actions">
<button class="ant-btn ant-btn-sm ant-btn-default py-0 px-1 text-xs h-5 leading-5" id="zoomIn">
<i class="ri-zoom-in-line"></i>
</button>
<button class="ant-btn ant-btn-sm ant-btn-default py-0 px-1 text-xs h-5 leading-5" id="zoomOut">
<i class="ri-zoom-out-line"></i>
</button>
<button class="ant-btn ant-btn-sm ant-btn-default py-0 px-1 text-xs h-5 leading-5" id="toggleHighlights">
<i class="ri-mark-pen-line"></i> 高亮问题
</button>
</div>
</div>
<div class="file-preview-content">
<div class="pdf-container">
<!-- 移除页面控制部分 -->
<div class="pdf-viewer">
<!-- 模拟Word文档内容 -->
<div class="word-document" style="position: relative; min-height: 800px;">
<h1>烟草产品销售合同</h1>
<p style="text-align: right;">合同编号:XS-2023-1025-001</p>
<div style="margin: 20px 0;">
<p><strong>甲方(供方):</strong>XX烟草公司</p>
<p>地址:XX省XX市XX区XX路XX号</p>
<p>法定代表人:张XX</p>
<p>联系电话:123-4567-8901</p>
<p>&nbsp;</p>
<p><strong>乙方(需方):</strong>YY贸易有限公司</p>
<p>地址:XX省XX市XX区YY路YY号</p>
<p>法定代表人:李YY</p>
<p>联系电话:123-4567-8902</p>
</div>
<p>根据《中华人民共和国合同法》及有关法律法规的规定,经双方协商一致,签订本合同,共同遵守。</p>
<h2>第一条 总则</h2>
<p>1.1 本合同适用于甲乙双方之间的烟草制品买卖事宜。</p>
<p>1.2 双方应本着平等互利、诚实信用的原则履行本合同。</p>
<h2>第二条 合同标的物</h2>
<p>2.1 产品名称:烟草制品</p>
<p>2.2 规格型号:如附件所列</p>
<div class="highlight-area warning" style="display: inline-block; position: relative; padding: 2px; margin: -2px;" data-review-id="12">
<p>2.3 数量:5000箱</p>
</div>
<div class="highlight-area warning" style="display: inline-block; position: relative; padding: 2px; margin: -2px;" data-review-id="11">
<p>2.4 质量要求:符合国家标准GB/T XXXXX-XXXX</p>
</div>
<h2>第三条 交货与付款</h2>
<p>3.1 交货时间:自合同签订之日起30日内。</p>
<div class="highlight-area error" style="display: inline-block; position: relative; padding: 2px; margin: -2px;" data-review-id="1">
<p>3.2 乙方应在收到货物之日起5个工作日内支付合同款项,甲方应在收到乙方全部付款后开具增值税专用发票,乙方应在收到发票后支付剩余款项。</p>
</div>
<p>3.3 交货地点:乙方指定的仓库。</p>
<div class="highlight-area warning" style="display: inline-block; position: relative; padding: 2px; margin: -2px;" data-review-id="9">
<p>3.4 运输方式:陆运,运费由甲方承担。</p>
</div>
<h2>第八条 争议解决</h2>
<div class="highlight-area warning" style="display: inline-block; position: relative; padding: 2px; margin: -2px;" data-review-id="2">
<p>如合同发生纠纷,双方应协商解决。</p>
</div>
<h2>第九条 不可抗力</h2>
<div class="highlight-area warning" style="display: inline-block; position: relative; padding: 2px; margin: -2px;" data-review-id="6">
<p>任何一方因不可抗力而未能履行其在本合同项下的义务,不应被视为违约。</p>
</div>
<h2>第十条 保密条款</h2>
<div class="highlight-area warning" style="display: inline-block; position: relative; padding: 2px; margin: -2px;" data-review-id="7">
<p>双方同意对本合同内容保密。</p>
</div>
<h2>第十一条 合同有效期</h2>
<div class="highlight-area success" style="display: inline-block; position: relative; padding: 2px; margin: -2px;" data-review-id="14">
<p>本合同自签订之日起生效,至双方义务全部履行完毕时终止。任何一方解除合同应提前30日书面通知另一方。</p>
</div>
<h2>第十二条 合同文本</h2>
<p>本合同一式两份,甲乙双方各执一份,具有同等法律效力。</p>
<!-- 缺少法律适用条款 -->
<div class="highlight-area error" style="display: inline-block; position: relative; padding: 2px; margin: -2px; background-color: rgba(255, 77, 79, 0.2); border: 2px dashed #ff4d4f;" data-review-id="10">
<p style="font-style: italic; color: #999;">【法律适用条款缺失】</p>
</div>
<!-- 缺少免责条款 -->
<div class="highlight-area warning" style="display: inline-block; position: relative; padding: 2px; margin: -2px; background-color: rgba(250, 173, 20, 0.2); border: 2px dashed #faad14;" data-review-id="13">
<p style="font-style: italic; color: #999;">【免责条款缺失】</p>
</div>
<div style="margin-top: 40px;">
<p>甲方(盖章):</p>
<p>代表人签字:</p>
<p>日期:2023年10月20日</p>
<p>&nbsp;</p>
<div class="highlight-area warning" style="display: inline-block; position: relative; padding: 2px; margin: -2px;" data-review-id="3">
<p>乙方(盖章):YY贸易有限公司</p>
<p>代表人签字:李YY</p>
<p>日期:2023年10月20日</p>
</div>
</div>
</div>
<!-- 工具提示 -->
<div class="tooltip" id="reviewTooltip">
<div class="tooltip-title">付款条件描述不明确</div>
<div class="tooltip-content">合同中关于付款条件的描述存在歧义,无法明确确定付款时间和条件。</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 右侧:评查结果 - 增加宽度 -->
<div class="w-full lg:w-1/3">
<div class="review-points-panel">
<div class="review-panel-header py-2 px-4 flex items-center bg-primary-light" style="height: 36px;">
<i class="ri-file-list-check-line text-primary mr-2"></i>
<span class="font-medium text-primary">评查结果</span>
</div>
<!-- 评查统计 - 改为单行显示 -->
<div class="review-statistics bg-white border-b border-gray-100 py-3 px-4">
<div class="flex justify-between items-center">
<div class="flex items-center">
<div class="w-7 h-7 bg-gray-100 rounded-md flex items-center justify-center">
<span class="text-sm font-semibold text-gray-600">15</span>
</div>
<span class="text-xs text-gray-500 ml-1">总计</span>
</div>
<div class="h-8 border-r border-gray-200"></div>
<div class="flex items-center">
<div class="w-7 h-7 bg-green-50 rounded-md flex items-center justify-center">
<span class="text-sm font-semibold text-success">6</span>
</div>
<span class="text-xs text-gray-500 ml-1">通过</span>
</div>
<div class="h-8 border-r border-gray-200"></div>
<div class="flex items-center">
<div class="w-7 h-7 bg-yellow-50 rounded-md flex items-center justify-center">
<span class="text-sm font-semibold text-warning">7</span>
</div>
<span class="text-xs text-gray-500 ml-1">警告</span>
</div>
<div class="h-8 border-r border-gray-200"></div>
<div class="flex items-center">
<div class="w-7 h-7 bg-red-50 rounded-md flex items-center justify-center">
<span class="text-sm font-semibold text-error">2</span>
</div>
<span class="text-xs text-gray-500 ml-1">错误</span>
</div>
</div>
</div>
<!-- 评查点列表 - 添加一键替换和人工介入 -->
<div class="review-points-list">
<!-- 评查点1:付款条件描述不明确 - 错误状态 -->
<div class="review-point-item active" data-review-id="1">
<div class="review-point-header">
<div class="review-point-title">付款条件描述不明确</div>
<span class="status-badge status-error">
<i class="ri-close-circle-line mr-1"></i>不通过
</span>
</div>
<div class="review-point-location">
<i class="ri-file-list-line mr-1"></i>
<span>付款条款清晰性</span>
</div>
<div class="mt-2">
<div class="p-2 bg-white rounded border border-gray-200 text-xs">
<div class="flex justify-between items-center mb-1">
<span class="text-xs">当前值</span>
<span class="text-xs text-error">不符合规范</span>
</div>
<p class="text-xs">乙方应在收到货物之日起5个工作日内支付合同款项,甲方应在收到乙方全部付款后开具增值税专用发票,乙方应在收到发票后支付剩余款项。</p>
</div>
<div class="p-2 bg-white rounded border border-gray-200 text-xs mt-2">
<div class="flex justify-between items-center mb-1">
<span class="text-xs">建议修改为</span>
<span class="text-xs text-success">符合规范</span>
</div>
<div class="mt-2">
<textarea class="w-full border border-gray-200 rounded-md text-xs p-2" placeholder="输入自定义内容..." rows="3">乙方应在收到货物验收合格之日起5个工作日内支付合同总额的70%,甲方收到该部分款项后3个工作日内向乙方开具等额增值税专用发票;乙方应在收到发票之日起5个工作日内支付剩余30%款项。</textarea>
</div>
</div>
<button class="replace-action w-full justify-center mt-2">
<i class="ri-replace-line"></i> 一键替换
</button>
</div>
</div>
<!-- 评查点2:违约责任条款缺失 - 警告状态 -->
<div class="review-point-item" data-review-id="2">
<div class="review-point-header">
<div class="review-point-title">违约责任条款缺失</div>
<span class="status-badge status-warning">
<i class="ri-alert-line mr-1"></i>警告
</span>
</div>
<div class="review-point-location">
<i class="ri-file-list-line mr-1"></i>
<span>合同权利义务对等性</span>
</div>
<div class="mt-2">
<div class="p-2 bg-white rounded border border-gray-200 text-xs">
<div class="flex justify-between items-center mb-1">
<span class="text-xs">当前值</span>
<span class="text-xs text-warning">不符合规范</span>
</div>
<p class="text-xs">如合同发生纠纷,双方应协商解决。</p>
</div>
<div class="p-2 bg-white rounded border border-gray-200 text-xs mt-2">
<div class="flex justify-between items-center mb-1">
<span class="text-xs">建议修改为</span>
<span class="text-xs text-success">符合规范</span>
</div>
<div class="mt-2">
<textarea class="w-full border border-gray-200 rounded-md text-xs p-2" placeholder="输入自定义内容..." rows="3">如合同发生纠纷,双方应友好协商解决;协商不成的,任何一方均有权向甲方所在地人民法院提起诉讼。任何一方未能履行本合同约定义务,应向守约方支付合同总金额的10%作为违约金;给对方造成损失的,还应赔偿由此产生的全部损失。</textarea>
</div>
</div>
<button class="replace-action w-full justify-center mt-2">
<i class="ri-replace-line"></i> 一键替换
</button>
</div>
</div>
<!-- 修改评查点3:签章不完整 - 添加人工审核操作界面 (待处理状态) -->
<div class="review-point-item" data-review-id="3">
<div class="review-point-header">
<div class="review-point-title">签章不完整</div>
<span class="status-badge status-warning">
<i class="ri-alert-line mr-1"></i>警告
</span>
<span class="human-review-badge">
<i class="ri-user-line mr-1"></i>需人工
</span>
</div>
<div class="review-point-location">
<i class="ri-file-list-line mr-1"></i>
<span>合同签署规范性</span>
</div>
<div class="human-review-note">
<i class="ri-information-line mr-1"></i> 需要联系甲方补充公章
</div>
<!-- 人工审核操作区域 -->
<div class="mt-2">
<textarea class="w-full border border-gray-200 rounded-md text-xs p-2" placeholder="请输入审核意见(可选)..." rows="2"></textarea>
<div class="flex justify-end mt-2 space-x-2">
<button class="replace-action" style="background-color: #1890ff;" onclick="approveReviewItem(3)">
<i class="ri-check-line"></i> 通过
</button>
<button class="replace-action" style="background-color: #ff4d4f;" onclick="rejectReviewItem(3)">
<i class="ri-close-line"></i> 不通过
</button>
</div>
</div>
</div>
<!-- 评查点9:交货方式模糊 - 新增人工介入项 -->
<div class="review-point-item" data-review-id="9">
<div class="review-point-header">
<div class="review-point-title">交货方式描述模糊</div>
<span class="status-badge status-success">
<i class="ri-checkbox-circle-line mr-1"></i>已通过
</span>
<span class="human-review-badge">
<i class="ri-user-line mr-1"></i>需人工
</span>
</div>
<div class="review-point-location">
<i class="ri-file-list-line mr-1"></i>
<span>履行条款明确性</span>
</div>
<!-- 人工审核已完成区域 -->
<div class="mt-2">
<div class="p-2 bg-white rounded border border-gray-200 text-xs">
<div class="flex justify-between items-center mb-1">
<span class="text-xs">人工审核意见</span>
<span class="text-xs text-success">已通过</span>
</div>
<p class="text-xs">经核实,该交货方式虽然描述不够详细,但符合行业惯例且双方已经多次合作,不会造成实际履行障碍。</p>
<div class="text-right text-xs text-gray-500 mt-1">
审核人:王法务 | 时间:2023-11-05 14:30:22
</div>
</div>
<div class="flex justify-end mt-2">
<button class="replace-action" style="background-color: #722ed1;" onclick="reopenReviewItem(9)">
<i class="ri-restart-line"></i> 重新审核
</button>
</div>
</div>
</div>
<!-- 评查点10:未明确法律适用条款 - 错误状态 -->
<div class="review-point-item" data-review-id="10">
<div class="review-point-header">
<div class="review-point-title">法律适用条款缺失</div>
<span class="status-badge status-error">
<i class="ri-close-circle-line mr-1"></i>不通过
</span>
</div>
<div class="review-point-location">
<i class="ri-file-list-line mr-1"></i>
<span>争议解决条款完整性</span>
</div>
<div class="mt-2">
<div class="p-2 bg-white rounded border border-gray-200 text-xs">
<div class="flex justify-between items-center mb-1">
<span class="text-xs">当前问题</span>
<span class="text-xs text-error">缺失</span>
</div>
<p class="text-xs">合同未明确约定适用法律和纠纷解决方式</p>
</div>
<div class="p-2 bg-white rounded border border-gray-200 text-xs mt-2">
<div class="flex justify-between items-center mb-1">
<span class="text-xs">建议添加</span>
<span class="text-xs text-success">符合规范</span>
</div>
<div class="mt-2">
<textarea class="w-full border border-gray-200 rounded-md text-xs p-2" placeholder="输入自定义内容..." rows="3">第十三条 法律适用
本合同的订立、效力、解释、履行及争议的解决均适用中华人民共和国法律。因本合同引起的或与本合同有关的任何争议,双方应友好协商解决。协商不成的,提交甲方所在地人民法院诉讼解决。</textarea>
</div>
</div>
<button class="replace-action w-full justify-center mt-2">
<i class="ri-add-line"></i> 一键添加条款
</button>
</div>
</div>
<!-- 评查点11:履行义务不明确 - 错误状态 -->
<div class="review-point-item" data-review-id="11">
<div class="review-point-header">
<div class="review-point-title">履行义务不明确</div>
<span class="status-badge status-error">
<i class="ri-close-circle-line mr-1"></i>不通过
</span>
</div>
<div class="review-point-location">
<i class="ri-file-list-line mr-1"></i>
<span>合同履行义务规范性</span>
</div>
<div class="mt-2">
<div class="p-2 bg-white rounded border border-gray-200 text-xs">
<div class="flex justify-between items-center mb-1">
<span class="text-xs">当前问题</span>
<span class="text-xs text-error">不符合规范</span>
</div>
<p class="text-xs">合同对当事人履行义务的描述不明确,缺乏具体履行标准</p>
</div>
<div class="p-2 bg-white rounded border border-gray-200 text-xs mt-2">
<div class="flex justify-between items-center mb-1">
<span class="text-xs">法律依据</span>
</div>
<div class="bg-gray-50 p-2 rounded">
<div class="font-medium text-sm mb-1">《中华人民共和国民法典》</div>
<div class="text-xs">
<div class="mb-1">第五百八十五条</div>
<div class="mb-1">第五百八十六条</div>
<div class="mb-1 text-gray-600">当事人应当按照约定全面履行自己的义务。</div>
</div>
</div>
</div>
<div class="p-2 bg-white rounded border border-gray-200 text-xs mt-2">
<div class="flex justify-between items-center mb-1">
<span class="text-xs">建议修改为</span>
<span class="text-xs text-success">符合规范</span>
</div>
<div class="mt-2">
<textarea class="w-full border border-gray-200 rounded-md text-xs p-2" placeholder="输入自定义内容..." rows="3">第五条 履行义务
甲方应按照本合同约定的时间、地点交付符合合同约定数量、质量的商品,并提供相应的技术资料和售后服务。乙方应按照本合同约定的时间、方式支付货款。双方均应诚实守信,全面履行合同义务。</textarea>
</div>
</div>
<button class="replace-action w-full justify-center mt-2">
<i class="ri-replace-line"></i> 一键替换
</button>
</div>
</div>
<!-- 新增:评查通过的记录1 -->
<div class="review-point-item" data-review-id="15">
<div class="review-point-header">
<div class="review-point-title">合同基本要素齐全</div>
<span class="status-badge status-success">
<i class="ri-checkbox-circle-line mr-1"></i>通过
</span>
</div>
<div class="review-point-location">
<i class="ri-file-list-line mr-1"></i>
<span>合同基本要素完整性</span>
</div>
</div>
<!-- 新增:评查通过的记录2 -->
<div class="review-point-item" data-review-id="16">
<div class="review-point-header">
<div class="review-point-title">当事人信息完整</div>
<span class="status-badge status-success">
<i class="ri-checkbox-circle-line mr-1"></i>通过
</span>
</div>
<div class="review-point-location">
<i class="ri-file-list-line mr-1"></i>
<span>合同当事人信息规范性</span>
</div>
</div>
<!-- 新增:评查通过的记录3 -->
<div class="review-point-item" data-review-id="17">
<div class="review-point-header">
<div class="review-point-title">合同标的明确</div>
<span class="status-badge status-success">
<i class="ri-checkbox-circle-line mr-1"></i>通过
</span>
</div>
<div class="review-point-location">
<i class="ri-file-list-line mr-1"></i>
<span>合同标的界定清晰性</span>
</div>
</div>
<!-- 评查点14:合同终止通知时限 - 已解决状态 -->
<div class="review-point-item" data-review-id="14">
<div class="review-point-header">
<div class="review-point-title">合同终止通知时限</div>
<span class="status-badge status-success">
<i class="ri-checkbox-circle-line mr-1"></i>通过
</span>
</div>
<div class="review-point-location">
<i class="ri-file-list-line mr-1"></i>
<span>合同终止条款合规性</span>
</div>
</div>
<!-- 新增:评查通过的记录4 -->
<div class="review-point-item" data-review-id="18">
<div class="review-point-header">
<div class="review-point-title">交货地点明确</div>
<span class="status-badge status-success">
<i class="ri-checkbox-circle-line mr-1"></i>通过
</span>
</div>
<div class="review-point-location">
<i class="ri-file-list-line mr-1"></i>
<span>交付条款明确性</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- AI智能分析选项卡内容 (原评查建议) -->
<div class="tab-pane" id="tab-suggestion">
<!-- AI智能分析部分 -->
<div class="ant-card">
<div class="ant-card-header">
<h3 class="font-medium">AI智能分析</h3>
</div>
<div class="ant-card-body">
<div class="bg-gray-50 rounded-md p-4 mb-4">
<div class="flex items-start">
<i class="ri-lightbulb-line text-warning text-lg mr-2"></i>
<div>
<p class="text-sm mb-2"><span class="font-medium">风险提示:</span>本合同缺少违约责任条款,可能导致权责不明。</p>
<p class="text-xs text-secondary">根据《中华人民共和国民法典》第五百七十七条规定,建议增加违约责任条款,明确双方违约责任及赔偿方式。</p>
</div>
</div>
</div>
<div class="bg-gray-50 rounded-md p-4 mb-4">
<div class="flex items-start">
<i class="ri-lightbulb-line text-warning text-lg mr-2"></i>
<div>
<p class="text-sm mb-2"><span class="font-medium">完整性检查:</span>本合同缺少法律适用条款。</p>
<p class="text-xs text-secondary">根据行业惯例,销售合同应明确约定适用法律和纠纷解决方式,以避免后续争议解决时的不确定性。</p>
</div>
</div>
</div>
<div class="bg-gray-50 rounded-md p-4">
<div class="flex items-start">
<i class="ri-lightbulb-line text-primary text-lg mr-2"></i>
<div>
<p class="text-sm mb-2"><span class="font-medium">优化建议:</span>建议完善付款条件描述。</p>
<p class="text-xs text-secondary">目前合同中关于付款条件的描述存在歧义,可能导致付款时间和条件不明确。建议按系统修改建议优化。</p>
</div>
</div>
</div>
</div>
</div>
<div class="mt-8">
<h3 class="text-lg font-medium mb-4">综合评价</h3>
<div class="bg-white border border-gray-200 p-4 rounded-md">
<p class="text-sm">本合同基本结构完整,主体内容清晰,但存在多处条款描述不完善的问题,主要体现在支付条件、违约责任、不可抗力、保密条款、合同终止条件等方面。这些问题虽不影响合同的基本合规性,但可能在合同履行过程中引发争议和纠纷。同时,合同签章不完整,也影响了合同的法律效力。建议对上述问题进行修改完善后再行签署。</p>
<div class="mt-4">
<p class="text-sm font-medium">合规性评分:<span class="text-warning font-medium">75分</span></p>
<div class="mt-2 bg-gray-200 rounded-full h-2.5 w-full">
<div class="bg-warning h-2.5 rounded-full" style="width: 75%"></div>
</div>
</div>
<div class="mt-4 flex space-x-4">
<button class="ant-btn ant-btn-default">
<i class="ri-file-download-line"></i> 导出评查报告
</button>
<button class="ant-btn ant-btn-primary">
<i class="ri-check-double-line"></i> 确认评查结果
</button>
</div>
</div>
</div>
</div>
<!-- 文件信息选项卡内容 -->
<div class="tab-pane" id="tab-fileinfo">
<div class="bg-white rounded-lg shadow-sm overflow-hidden">
<!-- 文件基本信息卡片 -->
<div class="border-b border-gray-100">
<div class="py-3 px-4 bg-blue-50 flex items-center">
<i class="ri-file-info-line text-blue-500 text-lg mr-2"></i>
<h3 class="font-medium text-blue-700">文件基本信息</h3>
</div>
<div class="p-4">
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">文件名称:</div>
<div class="text-sm font-medium flex-1">烟草产品销售合同(2023版).docx</div>
</div>
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">合同编号:</div>
<div class="text-sm font-medium flex-1">XS-2023-1025-001</div>
</div>
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">文件大小:</div>
<div class="text-sm font-medium flex-1">5.2MB</div>
</div>
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">文件格式:</div>
<div class="text-sm font-medium flex-1">DOCX</div>
</div>
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">页数:</div>
<div class="text-sm font-medium flex-1">5页</div>
</div>
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">上传时间:</div>
<div class="text-sm font-medium flex-1">2023-10-25 14:30:45</div>
</div>
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">上传用户:</div>
<div class="text-sm font-medium flex-1">张三</div>
</div>
</div>
</div>
</div>
<!-- 合同信息卡片 -->
<div class="border-b border-gray-100">
<div class="py-3 px-4 bg-green-50 flex items-center">
<i class="ri-file-paper-2-line text-green-500 text-lg mr-2"></i>
<h3 class="font-medium text-green-700">合同信息</h3>
</div>
<div class="p-4">
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">合同类型:</div>
<div class="text-sm font-medium flex-1">销售合同</div>
</div>
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">签约日期:</div>
<div class="text-sm font-medium flex-1">2023年10月20日</div>
</div>
<div class="col-span-1 md:col-span-2 flex items-start">
<div class="w-24 text-gray-500 text-sm flex-shrink-0 pt-0.5">合同当事人:</div>
<div class="text-sm font-medium flex-1">
<div>甲方:XX烟草公司</div>
<div>乙方:YY贸易有限公司</div>
</div>
</div>
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">合同金额:</div>
<div class="text-sm font-medium flex-1">¥ 1,580,000.00</div>
</div>
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">履行期限:</div>
<div class="text-sm font-medium flex-1">2023年11月1日至2024年10月31日</div>
</div>
</div>
</div>
</div>
<!-- 评查信息卡片 -->
<div>
<div class="py-3 px-4 bg-purple-50 flex items-center">
<i class="ri-search-eye-line text-purple-500 text-lg mr-2"></i>
<h3 class="font-medium text-purple-700">评查信息</h3>
</div>
<div class="p-4">
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">评查时间:</div>
<div class="text-sm font-medium flex-1">2023-10-25 14:35:12</div>
</div>
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">评查模型:</div>
<div class="text-sm font-medium flex-1">DeepSeek</div>
</div>
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">评查规则组:</div>
<div class="text-sm font-medium flex-1">合同标准规则组</div>
</div>
<div class="flex items-center">
<div class="w-24 text-gray-500 text-sm flex-shrink-0">评查结果:</div>
<div class="flex items-center">
<span class="status-badge status-warning text-xs">
<i class="ri-alert-line mr-1"></i>警告
</span>
<span class="text-sm ml-2">(共发现9个问题)</span>
</div>
</div>
</div>
<!-- 评查结果概览 -->
<div class="mt-4 pt-4 border-t border-gray-100">
<div class="flex items-center justify-between mb-2">
<div class="text-sm font-medium">评查得分:</div>
<div class="text-warning font-medium">75分</div>
</div>
<div class="w-full bg-gray-200 rounded-full h-2">
<div class="bg-warning h-2 rounded-full" style="width: 75%"></div>
</div>
<div class="flex justify-between mt-2">
<div class="flex items-center">
<span class="w-2 h-2 rounded-full bg-success mr-1 inline-block"></span>
<span class="text-xs text-gray-500">通过: 6</span>
</div>
<div class="flex items-center">
<span class="w-2 h-2 rounded-full bg-warning mr-1 inline-block"></span>
<span class="text-xs text-gray-500">警告: 7</span>
</div>
<div class="flex items-center">
<span class="w-2 h-2 rounded-full bg-error mr-1 inline-block"></span>
<span class="text-xs text-gray-500">错误: 2</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
// 选项卡切换功能
const tabNavItems = document.querySelectorAll('.tab-nav-item');
const tabPanes = document.querySelectorAll('.tab-pane');
tabNavItems.forEach(item => {
item.addEventListener('click', function() {
// 移除所有选项卡的活动状态
tabNavItems.forEach(navItem => {
navItem.classList.remove('active');
});
// 添加当前选项卡的活动状态
this.classList.add('active');
// 隐藏所有选项卡内容
tabPanes.forEach(pane => {
pane.classList.remove('active');
});
// 显示当前选项卡内容
const targetTab = this.getAttribute('data-tab');
document.getElementById(targetTab).classList.add('active');
});
});
// 高亮区域与评查点关联
const highlightAreas = document.querySelectorAll('.highlight-area');
const reviewItems = document.querySelectorAll('.review-point-item');
const reviewTooltip = document.getElementById('reviewTooltip');
const reviewDetailPanel = document.getElementById('reviewDetailPanel');
const closeDetailBtn = document.getElementById('closeDetailPanel');
// 高亮区域鼠标悬停显示提示
highlightAreas.forEach(area => {
area.addEventListener('mouseenter', function(e) {
const reviewId = this.getAttribute('data-review-id');
const reviewItem = document.querySelector(`.review-point-item[data-review-id="${reviewId}"]`);
if (reviewItem) {
const title = reviewItem.querySelector('.review-point-title').textContent;
const desc = reviewItem.querySelector('.review-point-desc').textContent;
reviewTooltip.querySelector('.tooltip-title').textContent = title;
reviewTooltip.querySelector('.tooltip-content').textContent = desc;
// 计算并设置tooltip位置
const rect = this.getBoundingClientRect();
const containerRect = document.querySelector('.pdf-viewer').getBoundingClientRect();
reviewTooltip.style.left = `${rect.left + rect.width/2 - containerRect.left}px`;
reviewTooltip.style.top = `${rect.bottom + 10 - containerRect.top + document.querySelector('.pdf-viewer').scrollTop}px`;
reviewTooltip.style.display = 'block';
}
});
area.addEventListener('mouseleave', function() {
reviewTooltip.style.display = 'none';
});
// 点击高亮区域显示对应评查点详情
area.addEventListener('click', function() {
// 先切换到预览选项卡
document.querySelector('.tab-nav-item[data-tab="tab-preview"]').click();
const reviewId = this.getAttribute('data-review-id');
selectReviewPoint(reviewId);
});
});
// 选择评查点
function selectReviewPoint(reviewId) {
// 移除所有评查点的选中状态
reviewItems.forEach(item => {
item.classList.remove('active');
});
// 添加选中状态到目标评查点
const targetItem = document.querySelector(`.review-point-item[data-review-id="${reviewId}"]`);
if (targetItem) {
targetItem.classList.add('active');
// 确保选中的评查点在可视区域内
targetItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
// 更新详情面板
updateDetailPanel(targetItem);
// 显示详情面板
reviewDetailPanel.classList.add('visible');
}
}
// 更新详情面板内容
function updateDetailPanel(reviewItem) {
const title = reviewItem.querySelector('.review-point-title').textContent;
const desc = reviewItem.querySelector('.review-point-desc').textContent;
const status = reviewItem.querySelector('.status-badge').innerHTML;
const location = reviewItem.querySelector('.review-point-location span').textContent;
// 更新详情面板标题
document.querySelector('.review-detail-title').textContent = title;
// 根据不同评查点ID更新不同内容
const reviewId = reviewItem.getAttribute('data-review-id');
// 此处可以根据实际需求从后端获取更详细的评查点信息
// 这里使用硬编码的示例数据
let originalText = "";
let suggestedChange = "";
switch(reviewId) {
case "1":
originalText = "乙方应在收到货物之日起5个工作日内支付合同款项,甲方应在收到乙方全部付款后开具增值税专用发票,乙方应在收到发票后支付剩余款项。";
suggestedChange = "建议明确付款条件和时间节点,例如:<br>\"乙方应在收到货物验收合格之日起5个工作日内支付合同总额的70%,甲方收到该部分款项后3个工作日内向乙方开具等额增值税专用发票;乙方应在收到发票之日起5个工作日内支付剩余30%款项。\"";
break;
case "2":
originalText = "如合同发生纠纷,双方应协商解决。";
suggestedChange = "建议增加明确的违约责任条款,例如:<br>\"任何一方未能履行本合同约定义务,应向守约方支付合同总金额的10%作为违约金;给对方造成损失的,还应赔偿由此产生的全部损失。\"";
break;
case "3":
originalText = "乙方(盖章):YY贸易有限公司<br>代表人签字:李YY<br>日期:2023年10月20日";
suggestedChange = "需补充甲方公章,确保合同签署的完整性和法律效力。";
break;
case "6":
originalText = "任何一方因不可抗力而未能履行其在本合同项下的义务,不应被视为违约。";
suggestedChange = "建议修改为:\"不可抗力是指不能预见、不能避免并不能克服的客观情况,包括但不限于自然灾害、战争、政府行为等。遇有不可抗力的一方应在72小时内通知另一方,并在15日内提供相关证明文件。因不可抗力导致无法履行合同的,双方可协商变更或解除合同,互不承担违约责任。\"";
break;
case "7":
originalText = "双方同意对本合同内容保密。";
suggestedChange = "建议修改为:\"双方应对在合同签订和履行过程中获知的对方的商业秘密(包括但不限于技术信息、经营信息、客户资料等)予以保密。\"";
break;
case "8":
originalText = "本合同自签订之日起生效,至双方义务全部履行完毕时终止。";
suggestedChange = "建议修改为:\"本合同自签订之日起生效,至双方义务全部履行完毕时终止。\"";
break;
default:
originalText = "[原文内容加载中...]";
suggestedChange = "[建议加载中...]";
}
// 更新面板内容
document.querySelector('.review-detail-panel .review-detail-content:nth-of-type(1)').innerHTML = desc;
document.querySelector('.review-detail-panel .review-detail-content:nth-of-type(2)').innerHTML = originalText;
document.querySelector('.review-detail-panel .review-detail-content:nth-of-type(3)').innerHTML = suggestedChange;
// 绑定替换按钮事件
const replaceBtn = document.querySelector('.review-detail-panel .replace-action');
if (replaceBtn) {
replaceBtn.addEventListener('click', function() {
handleContentReplace(reviewId);
});
}
// 根据评查点状态调整按钮显示
const actionButtons = document.querySelector('.review-detail-actions');
if (reviewItem.querySelector('.status-badge').classList.contains('status-success')) {
// 如果是通过状态,隐藏"标记为已解决"按钮
actionButtons.querySelector('button:first-child').style.display = 'none';
} else {
actionButtons.querySelector('button:first-child').style.display = 'inline-flex';
}
}
// 内容替换处理函数
function handleContentReplace(reviewId) {
// 根据不同评查点ID执行不同的替换操作
let newContent = "";
let highlightArea = document.querySelector(`.highlight-area[data-review-id="${reviewId}"]`);
switch(reviewId) {
case "1":
newContent = "乙方应在收到货物验收合格之日起5个工作日内支付合同总额的70%,甲方收到该部分款项后3个工作日内向乙方开具等额增值税专用发票;乙方应在收到发票之日起5个工作日内支付剩余30%款项。";
break;
case "2":
newContent = "任何一方未能履行本合同约定义务,应向守约方支付合同总金额的10%作为违约金;给对方造成损失的,还应赔偿由此产生的全部损失。";
break;
case "6":
newContent = "不可抗力是指不能预见、不能避免并不能克服的客观情况,包括但不限于自然灾害、战争、政府行为等。遇有不可抗力的一方应在72小时内通知另一方,并在15日内提供相关证明文件。因不可抗力导致无法履行合同的,双方可协商变更或解除合同,互不承担违约责任。";
break;
case "7":
newContent = "双方应对在合同签订和履行过程中获知的对方的商业秘密(包括但不限于技术信息、经营信息、客户资料等)予以保密。\"";
break;
case "8":
newContent = "本合同自签订之日起生效,至双方义务全部履行完毕时终止。\"";
break;
default:
alert("未找到对应的替换内容");
return;
}
// 模拟替换文档内容
if (highlightArea && highlightArea.querySelector('p')) {
highlightArea.querySelector('p').innerHTML = newContent;
// 更改高亮区域样式,表示已修改
highlightArea.classList.remove('warning');
highlightArea.classList.add('success');
// 更新评查点状态
const reviewItem = document.querySelector(`.review-point-item[data-review-id="${reviewId}"]`);
if (reviewItem) {
const statusBadge = reviewItem.querySelector('.status-badge');
statusBadge.className = 'status-badge status-success';
statusBadge.innerHTML = '<i class="ri-checkbox-circle-line mr-1"></i>已解决';
}
// 更新详情面板显示
document.querySelector('.review-detail-panel .review-detail-content:nth-of-type(2)').innerHTML = newContent;
document.querySelector('.review-detail-panel .review-detail-content:nth-of-type(3)').innerHTML = "<span class='text-success'><i class='ri-check-double-line'></i> 内容已更新</span>";
alert("内容已成功替换!");
} else if (reviewId === "3") {
// 特殊处理签章问题
alert("已通知相关人员完善合同签章!");
// 更新评查点状态为"处理中"
const reviewItem = document.querySelector(`.review-point-item[data-review-id="${reviewId}"]`);
if (reviewItem) {
const statusBadge = reviewItem.querySelector('.status-badge');
statusBadge.className = 'status-badge status-processing';
statusBadge.innerHTML = '<i class="ri-time-line mr-1"></i>处理中';
}
} else {
alert("替换失败:未找到对应内容区域");
}
}
// 绑定评查建议选项卡中的替换按钮事件
document.querySelectorAll('#tab-suggestion .replace-action').forEach(btn => {
btn.addEventListener('click', function() {
// 获取当前评查点ID
const reviewItem = this.closest('.bg-warning');
const title = reviewItem.querySelector('.font-medium').textContent;
// 通过标题查找对应的评查点ID
let reviewId;
document.querySelectorAll('.review-point-item').forEach(item => {
if (item.querySelector('.review-point-title').textContent === title) {
reviewId = item.getAttribute('data-review-id');
}
});
if (reviewId) {
handleContentReplace(reviewId);
} else {
alert("未找到对应的评查点");
}
});
});
// 点击评查点项显示详情
reviewItems.forEach(item => {
item.addEventListener('click', function() {
const reviewId = this.getAttribute('data-review-id');
selectReviewPoint(reviewId);
// 找到对应的高亮区域并突出显示
const highlightArea = document.querySelector(`.highlight-area[data-review-id="${reviewId}"]`);
if (highlightArea) {
// 移除所有高亮区域的突出显示
highlightAreas.forEach(area => {
area.style.zIndex = '10';
area.style.boxShadow = 'none';
});
// 添加突出显示到目标区域
highlightArea.style.zIndex = '20';
highlightArea.style.boxShadow = '0 0 0 2px yellow, 0 0 10px rgba(0,0,0,0.3)';
// 确保高亮区域在可视范围内
highlightArea.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
});
});
// 关闭详情面板
closeDetailBtn.addEventListener('click', function() {
reviewDetailPanel.classList.remove('visible');
});
// PDF控制功能
const zoomInBtn = document.getElementById('zoomIn');
const zoomOut = document.getElementById('zoomOut');
const prevPage = document.getElementById('prevPage');
const nextPage = document.getElementById('nextPage');
const currentPageEl = document.getElementById('currentPage');
const totalPagesEl = document.getElementById('totalPages');
const toggleHighlightsBtn = document.getElementById('toggleHighlights');
let currentPage = 1;
const totalPages = 5; // 示例总页数
let zoomLevel = 100;
let highlightsVisible = true;
// 更新当前页码
currentPageEl.textContent = currentPage;
totalPagesEl.textContent = totalPages;
// 页面切换
prevPage.addEventListener('click', function() {
if (currentPage > 1) {
currentPage--;
currentPageEl.textContent = currentPage;
// 在实际应用中,这里应该加载不同页面的内容
alert(`显示第 ${currentPage}`);
}
});
nextPage.addEventListener('click', function() {
if (currentPage < totalPages) {
currentPage++;
currentPageEl.textContent = currentPage;
// 在实际应用中,这里应该加载不同页面的内容
alert(`显示第 ${currentPage}`);
}
});
// 缩放控制
zoomInBtn.addEventListener('click', function() {
if (zoomLevel < 200) {
zoomLevel += 10;
updateZoom();
}
});
zoomOut.addEventListener('click', function() {
if (zoomLevel > 50) {
zoomLevel -= 10;
updateZoom();
}
});
function updateZoom() {
document.querySelector('.word-document').style.transform = `scale(${zoomLevel / 100})`;
document.querySelector('.word-document').style.transformOrigin = 'center top';
}
// 切换高亮显示
toggleHighlightsBtn.addEventListener('click', function() {
highlightsVisible = !highlightsVisible;
highlightAreas.forEach(area => {
area.style.display = highlightsVisible ? 'block' : 'none';
});
toggleHighlightsBtn.innerHTML = highlightsVisible ?
'<i class="ri-mark-pen-line"></i> 隐藏高亮' :
'<i class="ri-mark-pen-line"></i> 显示高亮';
});
// 保存审核意见按钮
const saveOpinionBtn = document.querySelector('.review-detail-actions .ant-btn-primary');
saveOpinionBtn.addEventListener('click', function() {
const opinionText = document.querySelector('.form-textarea').value;
const activeReviewId = document.querySelector('.review-point-item.active').getAttribute('data-review-id');
if (opinionText.trim()) {
alert(`已保存对评查点#${activeReviewId}的审核意见: ${opinionText}`);
// 在实际应用中,这里应该调用API保存审核意见
} else {
alert('请输入审核意见');
}
});
// 标记为已解决按钮
const resolveBtn = document.querySelector('.review-detail-actions button:first-child');
resolveBtn.addEventListener('click', function() {
const activeItem = document.querySelector('.review-point-item.active');
const reviewId = activeItem.getAttribute('data-review-id');
// 更新状态标签
const statusBadge = activeItem.querySelector('.status-badge');
statusBadge.className = 'status-badge status-success';
statusBadge.innerHTML = '<i class="ri-checkbox-circle-line mr-1"></i>已解决';
// 更新高亮区域样式
const highlightArea = document.querySelector(`.highlight-area[data-review-id="${reviewId}"]`);
if (highlightArea) {
highlightArea.className = highlightArea.className.replace('warning', 'success').replace('error', 'success');
}
alert(`评查点#${reviewId}已标记为已解决`);
});
// 忽略此问题按钮
const ignoreBtn = document.querySelector('.review-detail-actions button:nth-child(2)');
ignoreBtn.addEventListener('click', function() {
const activeItem = document.querySelector('.review-point-item.active');
const reviewId = activeItem.getAttribute('data-review-id');
// 添加忽略标记
const statusBadge = activeItem.querySelector('.status-badge');
statusBadge.innerHTML += ' <small>(已忽略)</small>';
// 淡化显示
activeItem.style.opacity = '0.6';
// 隐藏对应的高亮区域
const highlightArea = document.querySelector(`.highlight-area[data-review-id="${reviewId}"]`);
if (highlightArea) {
highlightArea.style.display = 'none';
}
alert(`评查点#${reviewId}已被忽略`);
});
// 确认评查结果按钮
const confirmResultBtn = document.querySelector('.ant-btn-primary i.ri-check-double-line').closest('button');
confirmResultBtn.addEventListener('click', function() {
// 检查是否有未处理的警告或错误
const unresolvedItems = document.querySelectorAll('.status-badge.status-warning, .status-badge.status-error');
if (unresolvedItems.length > 0) {
if (confirm(`还有 ${unresolvedItems.length} 个问题未解决,确定要提交确认吗?`)) {
alert('评查结果已确认');
window.location.href = '评查文件列表.html';
}
} else {
alert('所有问题已解决,评查结果已确认');
window.location.href = '评查文件列表.html';
}
});
// 初始化选中第一个评查点
selectReviewPoint("1");
});
// 保存人工审核草稿
function saveReviewDraft(reviewId) {
const reviewItem = document.querySelector(`.review-point-item[data-review-id="${reviewId}"]`);
const textarea = reviewItem.querySelector('.manual-review-textarea');
const opinion = textarea.value.trim();
if (!opinion) {
alert('请输入审核意见');
return;
}
// 在实际应用中应调用API保存草稿
// console.log('保存人工审核草稿:', {
reviewId: reviewId,
opinion: opinion
});
alert(`评查点#${reviewId}的审核意见已保存为草稿`);
}
// 通过人工审核
function approveReviewItem(reviewId) {
const reviewItem = document.querySelector(`.review-point-item[data-review-id="${reviewId}"]`);
const textarea = reviewItem.querySelector('.manual-review-textarea');
const opinion = textarea.value.trim();
if (!opinion) {
alert('请输入审核意见');
return;
}
// 在实际应用中应调用API提交审核结果
// console.log('通过人工审核:', {
reviewId: reviewId,
opinion: opinion,
result: 'approved'
});
// 更新状态标签
const statusBadge = reviewItem.querySelector('.status-badge');
statusBadge.className = 'status-badge status-success';
statusBadge.innerHTML = '<i class="ri-checkbox-circle-line mr-1"></i>已通过';
// 更新人工审核区域为只读状态
const container = reviewItem.querySelector('.manual-review-container');
const currentOpinion = textarea.value;
container.innerHTML = `
<div class="p-2 bg-white rounded border border-gray-200 text-xs">
<div class="flex justify-between items-center mb-1">
<span class="text-xs">人工审核意见</span>
<span class="text-xs text-success">已通过</span>
</div>
<p class="text-xs">${currentOpinion}</p>
<div class="text-right text-xs text-gray-500 mt-1">
审核人:当前用户 | 时间:${new Date().toLocaleString()}
</div>
</div>
`;
// 更新高亮区域样式(如果存在)
const highlightArea = document.querySelector(`.highlight-area[data-review-id="${reviewId}"]`);
if (highlightArea) {
highlightArea.classList.remove('warning');
highlightArea.classList.add('success');
}
alert(`评查点#${reviewId}已通过人工审核`);
}
// 不通过人工审核
function rejectReviewItem(reviewId) {
const reviewItem = document.querySelector(`.review-point-item[data-review-id="${reviewId}"]`);
const textarea = reviewItem.querySelector('.manual-review-textarea');
const opinion = textarea.value.trim();
if (!opinion) {
alert('请输入审核意见');
return;
}
// 在实际应用中应调用API提交审核结果
// console.log('不通过人工审核:', {
reviewId: reviewId,
opinion: opinion,
result: 'rejected'
});
// 更新状态标签
const statusBadge = reviewItem.querySelector('.status-badge');
statusBadge.className = 'status-badge status-error';
statusBadge.innerHTML = '<i class="ri-close-circle-line mr-1"></i>不通过';
// 更新人工审核区域为只读状态
const container = reviewItem.querySelector('.manual-review-container');
const currentOpinion = textarea.value;
container.innerHTML = `
<div class="p-2 bg-white rounded border border-gray-200 text-xs">
<div class="flex justify-between items-center mb-1">
<span class="text-xs">人工审核意见</span>
<span class="text-xs text-error">不通过</span>
</div>
<p class="text-xs">${currentOpinion}</p>
<div class="text-right text-xs text-gray-500 mt-1">
审核人:当前用户 | 时间:${new Date().toLocaleString()}
</div>
</div>
<button class="ant-btn ant-btn-default ant-btn-sm mt-2" onclick="reopenReviewItem(${reviewId})">
<i class="ri-restart-line"></i> 重新审核
</button>
`;
alert(`评查点#${reviewId}未通过人工审核`);
}
// 重新打开人工审核
function reopenReviewItem(reviewId) {
const reviewItem = document.querySelector(`.review-point-item[data-review-id="${reviewId}"]`);
const container = reviewItem.querySelector('.manual-review-container');
const opinion = container.querySelector('p').textContent.trim();
// 恢复为编辑状态
container.innerHTML = `
<textarea class="manual-review-textarea" placeholder="请输入人工审核意见...">${opinion}</textarea>
<div class="manual-review-actions">
<button class="ant-btn ant-btn-default ant-btn-sm" onclick="saveReviewDraft(${reviewId})">
<i class="ri-save-line"></i> 保存草稿
</button>
<button class="ant-btn ant-btn-primary ant-btn-sm" onclick="approveReviewItem(${reviewId})">
<i class="ri-check-line"></i> 通过
</button>
<button class="ant-btn ant-btn-danger ant-btn-sm" onclick="rejectReviewItem(${reviewId})">
<i class="ri-close-line"></i> 不通过
</button>
</div>
`;
// 更新状态标签为处理中
const statusBadge = reviewItem.querySelector('.status-badge');
statusBadge.className = 'status-badge status-processing';
statusBadge.innerHTML = '<i class="ri-time-line mr-1"></i>处理中';
alert(`评查点#${reviewId}已重新打开人工审核`);
}
</script>
</body>
</html>