Files
yunbiaoshu/ai-bidding-system-final.html
陈金美 2ccc7c4e8c
Some checks failed
backend-contract-verification / Verify TypeScript build & OpenAPI contracts (push) Has been cancelled
基础资料
2025-11-08 15:48:26 +08:00

1616 lines
61 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>AI智能制标系统</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
background: #f5f7fa;
min-height: 100vh;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
/* 步骤指示器 */
.steps-header {
background: white;
border-radius: 12px;
padding: 30px;
margin-bottom: 30px;
box-shadow: 0 2px 8px rgba(0,0,0,0.08);
}
.steps-indicator {
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
max-width: 800px;
margin: 0 auto;
}
.step-item {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
z-index: 2;
}
.step-circle {
width: 48px;
height: 48px;
border-radius: 50%;
background: #e8eaed;
color: #9aa0a6;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
font-weight: 600;
margin-bottom: 10px;
position: relative;
}
.step-item.active .step-circle {
background: #4285f4;
color: white;
}
.step-item.completed .step-circle {
background: #4285f4;
color: white;
}
.step-item.completed .step-circle::after {
content: '✓';
position: absolute;
font-size: 20px;
}
.step-title {
font-size: 14px;
font-weight: 600;
color: #202124;
margin-bottom: 4px;
}
.step-desc {
font-size: 12px;
color: #5f6368;
}
.step-line {
position: absolute;
top: 24px;
left: 50%;
width: calc(100% - 48px);
height: 2px;
background: #e8eaed;
z-index: 1;
}
.step-item:not(:last-child)::after {
content: '';
position: absolute;
top: 24px;
left: calc(50% + 24px);
width: calc(100vw / 3 - 48px);
max-width: 200px;
height: 2px;
background: #e8eaed;
z-index: 0;
}
.step-item.completed:not(:last-child)::after {
background: #4285f4;
}
/* 主内容区域 */
.main-content {
background: white;
border-radius: 12px;
box-shadow: 0 2px 8px rgba(0,0,0,0.08);
overflow: hidden;
}
.step-content {
display: none;
padding: 40px;
min-height: 500px;
}
.step-content.active {
display: block;
animation: fadeIn 0.3s ease;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
/* 第一步 - 基础设置 */
.settings-tabs {
display: flex;
gap: 20px;
margin-bottom: 30px;
border-bottom: 1px solid #e8eaed;
}
.settings-tab {
padding: 12px 0;
font-size: 14px;
color: #5f6368;
border: none;
background: none;
cursor: pointer;
position: relative;
transition: color 0.3s;
}
.settings-tab.active {
color: #1a73e8;
}
.settings-tab.active::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 2px;
background: #1a73e8;
}
.tab-pane {
display: none;
}
.tab-pane.active {
display: block;
}
/* 封面模板 */
.cover-templates {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 20px;
margin-top: 20px;
}
.cover-template {
border: 2px solid #e8eaed;
border-radius: 8px;
overflow: hidden;
cursor: pointer;
transition: all 0.3s;
text-align: center;
}
.cover-template:hover {
border-color: #4285f4;
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(66,133,244,0.2);
}
.cover-template.selected {
border-color: #4285f4;
background: #e8f0fe;
}
.cover-preview {
width: 100%;
height: 200px;
background: linear-gradient(135deg, #4285f4 0%, #1a73e8 100%);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 18px;
font-weight: 600;
}
.cover-name {
padding: 10px;
font-size: 13px;
color: #202124;
}
/* 模版样式 */
.template-preview {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 20px;
margin-top: 20px;
}
.template-card {
border: 1px solid #e8eaed;
border-radius: 8px;
padding: 20px;
text-align: center;
cursor: pointer;
transition: all 0.3s;
}
.template-card:hover {
border-color: #4285f4;
background: #f8f9fa;
}
.template-img {
width: 100%;
height: 250px;
background: #f8f9fa;
border: 1px solid #e8eaed;
border-radius: 4px;
margin-bottom: 10px;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
color: #5f6368;
}
/* 配置选项 */
.config-options {
display: flex;
flex-direction: column;
gap: 20px;
margin-top: 20px;
}
.config-item {
display: flex;
align-items: center;
gap: 15px;
padding: 15px;
background: #f8f9fa;
border-radius: 8px;
}
.config-checkbox {
width: 18px;
height: 18px;
accent-color: #4285f4;
}
.config-label {
flex: 1;
font-size: 14px;
color: #202124;
}
/* 第二步 - 上传文件 */
.upload-section {
margin-bottom: 30px;
}
.upload-area {
border: 2px dashed #dadce0;
border-radius: 8px;
padding: 60px 20px;
text-align: center;
background: #f8f9fa;
cursor: pointer;
transition: all 0.3s;
position: relative;
}
.upload-area:hover {
border-color: #4285f4;
background: #e8f0fe;
}
.upload-area.active {
border-color: #34a853;
background: #e6f4ea;
}
.upload-icon {
width: 64px;
height: 64px;
margin: 0 auto 20px;
background: #ea4335;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 28px;
color: white;
}
.upload-title {
font-size: 18px;
font-weight: 500;
color: #202124;
margin-bottom: 8px;
}
.upload-desc {
font-size: 14px;
color: #5f6368;
}
/* 文件解析信息 */
.parse-info {
background: #f8f9fa;
border-radius: 8px;
padding: 20px;
margin-top: 30px;
}
.parse-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 20px;
font-size: 16px;
font-weight: 500;
color: #202124;
}
.parse-content {
display: grid;
gap: 15px;
}
.parse-item {
display: flex;
align-items: flex-start;
gap: 15px;
}
.parse-label {
min-width: 100px;
font-size: 14px;
color: #5f6368;
}
.parse-value {
flex: 1;
font-size: 14px;
color: #202124;
}
.parse-value input,
.parse-value select {
width: 100%;
padding: 8px 12px;
border: 1px solid #dadce0;
border-radius: 4px;
font-size: 14px;
}
.date-range {
display: flex;
align-items: center;
gap: 10px;
}
.date-range input {
flex: 1;
}
/* 引用资料区 */
.reference-section {
margin-top: 30px;
padding: 20px;
background: #f8f9fa;
border-radius: 8px;
}
.reference-title {
font-size: 16px;
font-weight: 500;
color: #202124;
margin-bottom: 15px;
}
.reference-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.reference-upload {
border: 2px dashed #dadce0;
border-radius: 8px;
padding: 30px;
text-align: center;
cursor: pointer;
transition: all 0.3s;
background: white;
}
.reference-upload:hover {
border-color: #4285f4;
background: #e8f0fe;
}
.reference-upload.uploaded {
border-color: #34a853;
background: #e6f4ea;
}
.reference-icon {
font-size: 32px;
margin-bottom: 10px;
}
.reference-name {
font-size: 14px;
font-weight: 500;
color: #202124;
margin-bottom: 5px;
}
.reference-desc {
font-size: 12px;
color: #5f6368;
}
.reference-status {
margin-top: 10px;
font-size: 12px;
color: #34a853;
font-weight: 500;
}
/* 工程清单区域 */
.engineering-section {
margin-top: 20px;
padding: 15px;
background: #f0f7ff;
border: 1px solid #c2e0ff;
border-radius: 8px;
}
.engineering-title {
font-size: 14px;
font-weight: 500;
color: #1a73e8;
margin-bottom: 10px;
}
/* 第三步 - 目录确认 */
.outline-container {
display: grid;
grid-template-columns: 400px 1fr;
gap: 30px;
}
.outline-tree {
background: #f8f9fa;
border-radius: 8px;
padding: 20px;
max-height: 600px;
overflow-y: auto;
}
.outline-preview {
background: white;
border: 1px solid #e8eaed;
border-radius: 8px;
padding: 30px;
max-height: 600px;
overflow-y: auto;
}
.tree-item {
padding: 8px 0;
cursor: pointer;
transition: all 0.2s;
}
.tree-item:hover {
color: #1a73e8;
}
.tree-item.level-1 {
font-size: 16px;
font-weight: 600;
color: #202124;
margin-top: 10px;
}
.tree-item.level-2 {
padding-left: 20px;
font-size: 14px;
color: #5f6368;
}
.tree-item.level-3 {
padding-left: 40px;
font-size: 13px;
color: #80868b;
}
.outline-content {
line-height: 1.8;
}
.outline-content h2 {
font-size: 20px;
color: #202124;
margin: 20px 0 10px;
padding-bottom: 10px;
border-bottom: 2px solid #e8eaed;
}
.outline-content h3 {
font-size: 16px;
color: #202124;
margin: 15px 0 8px;
}
.outline-content p {
color: #5f6368;
margin: 10px 0;
}
/* 页数选择器 */
.page-selector {
margin-top: 30px;
padding: 20px;
background: #f8f9fa;
border-radius: 8px;
}
.page-title {
font-size: 14px;
color: #5f6368;
margin-bottom: 15px;
}
.page-slider {
width: 100%;
height: 6px;
-webkit-appearance: none;
appearance: none;
background: #e8eaed;
border-radius: 3px;
outline: none;
}
.page-slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 20px;
height: 20px;
background: #4285f4;
border-radius: 50%;
cursor: pointer;
}
.page-marks {
display: flex;
justify-content: space-between;
margin-top: 10px;
font-size: 12px;
color: #80868b;
}
.page-value {
text-align: center;
margin-top: 10px;
font-size: 18px;
font-weight: 600;
color: #4285f4;
}
/* 第四步 - 编写全文 */
.editor-container {
display: grid;
grid-template-columns: 250px 1fr;
gap: 20px;
height: 600px;
}
.editor-sidebar {
background: #f8f9fa;
border-radius: 8px;
padding: 20px;
overflow-y: auto;
}
.editor-main {
background: white;
border: 1px solid #e8eaed;
border-radius: 8px;
display: flex;
flex-direction: column;
}
.editor-toolbar {
padding: 15px;
border-bottom: 1px solid #e8eaed;
display: flex;
align-items: center;
gap: 10px;
}
.toolbar-btn {
padding: 6px 12px;
background: white;
border: 1px solid #dadce0;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
transition: all 0.2s;
}
.toolbar-btn:hover {
background: #f8f9fa;
border-color: #4285f4;
}
.editor-content {
flex: 1;
padding: 30px;
overflow-y: auto;
}
.sidebar-title {
font-size: 16px;
font-weight: 600;
color: #202124;
margin-bottom: 15px;
}
.doc-tree {
font-size: 14px;
}
.doc-section {
margin-bottom: 5px;
}
.doc-section-title {
padding: 8px 10px;
cursor: pointer;
border-radius: 4px;
transition: all 0.2s;
}
.doc-section-title:hover {
background: #e8eaed;
}
.doc-section-title.expanded::before {
content: '▼ ';
font-size: 10px;
}
.doc-section-title:not(.expanded)::before {
content: '▶ ';
font-size: 10px;
}
.doc-subsections {
display: none;
padding-left: 20px;
}
.doc-subsections.show {
display: block;
}
.doc-subsection {
padding: 6px 10px;
color: #5f6368;
cursor: pointer;
border-radius: 4px;
font-size: 13px;
}
.doc-subsection:hover {
background: #e8eaed;
color: #202124;
}
/* 生成状态 */
.generation-status {
text-align: center;
padding: 40px;
}
.generation-icon {
font-size: 48px;
margin-bottom: 20px;
}
.generation-text {
font-size: 16px;
color: #202124;
margin-bottom: 10px;
}
.generation-desc {
font-size: 14px;
color: #5f6368;
}
/* 底部操作栏 */
.footer-actions {
padding: 20px 40px;
background: white;
border-top: 1px solid #e8eaed;
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 30px;
border-radius: 12px;
box-shadow: 0 -2px 8px rgba(0,0,0,0.05);
}
.footer-left {
display: flex;
align-items: center;
gap: 20px;
}
.footer-buttons {
display: flex;
gap: 12px;
}
.btn {
padding: 10px 24px;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.3s;
border: none;
}
.btn-secondary {
background: white;
border: 1px solid #dadce0;
color: #5f6368;
}
.btn-secondary:hover {
background: #f8f9fa;
border-color: #4285f4;
}
.btn-primary {
background: #202124;
color: white;
}
.btn-primary:hover {
background: #303134;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(32,33,36,0.3);
}
.btn-primary:disabled {
background: #dadce0;
color: #80868b;
cursor: not-allowed;
}
/* 结果展示 */
.result-panel {
padding: 40px;
text-align: center;
}
.result-icon {
font-size: 64px;
color: #34a853;
margin-bottom: 20px;
}
.result-title {
font-size: 24px;
font-weight: 600;
color: #202124;
margin-bottom: 10px;
}
.result-desc {
font-size: 14px;
color: #5f6368;
margin-bottom: 30px;
}
.result-actions {
display: flex;
justify-content: center;
gap: 15px;
}
.result-btn {
padding: 12px 30px;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.3s;
border: none;
}
.result-btn.primary {
background: #1a73e8;
color: white;
}
.result-btn.secondary {
background: white;
border: 1px solid #dadce0;
color: #5f6368;
}
/* Loading动画 */
.loading-spinner {
display: inline-block;
width: 20px;
height: 20px;
border: 3px solid rgba(66,133,244,0.3);
border-top-color: #4285f4;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
</style>
</head>
<body>
<div class="container">
<!-- 步骤指示器 -->
<div class="steps-header">
<div class="steps-indicator">
<div class="step-item active" id="step-1-indicator">
<div class="step-circle">1</div>
<div class="step-title">基础设置</div>
<div class="step-desc">设置标书基本格式</div>
</div>
<div class="step-item" id="step-2-indicator">
<div class="step-circle">2</div>
<div class="step-title">解析文件</div>
<div class="step-desc">解析招标文件信息</div>
</div>
<div class="step-item" id="step-3-indicator">
<div class="step-circle">3</div>
<div class="step-title">确认目录</div>
<div class="step-desc">生成目录大纲,可自由编辑</div>
</div>
<div class="step-item" id="step-4-indicator">
<div class="step-circle">4</div>
<div class="step-title">编写全文</div>
<div class="step-desc">生成全文,可自由编辑</div>
</div>
</div>
</div>
<!-- 主内容区 -->
<div class="main-content">
<!-- 第一步:基础设置 -->
<div class="step-content active" id="step-1">
<h2 style="margin-bottom: 30px;">标书设置</h2>
<div class="settings-tabs">
<button class="settings-tab active" onclick="switchSettingTab('cover')">A4版面</button>
<button class="settings-tab" onclick="switchSettingTab('template')">A3版面横向</button>
</div>
<div class="tab-pane active" id="cover-pane">
<h3 style="margin-bottom: 20px; font-size: 16px;">封面</h3>
<div class="cover-templates">
<div class="cover-template selected">
<div class="cover-preview">
<span>投标文件</span>
</div>
<div class="cover-name">默认封面模板</div>
</div>
<div class="cover-template">
<div class="cover-preview" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);">
<span>投标文件</span>
</div>
<div class="cover-name">封面模板1</div>
</div>
<div class="cover-template">
<div class="cover-preview" style="background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);">
<span>投标文件</span>
</div>
<div class="cover-name">封面模板2</div>
</div>
<div class="cover-template">
<div class="cover-preview" style="background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);">
<span>投标文件</span>
</div>
<div class="cover-name">封面模板3</div>
</div>
<div class="cover-template">
<div class="cover-preview" style="background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);">
<span>投标文件</span>
</div>
<div class="cover-name">封面模板4</div>
</div>
<div class="cover-template">
<div class="cover-preview" style="background: linear-gradient(135deg, #fa709a 0%, #fee140 100%);">
<span>投标文件</span>
</div>
<div class="cover-name">封面模板5</div>
</div>
</div>
<h3 style="margin: 40px 0 20px; font-size: 16px;">模版</h3>
<div class="template-preview">
<div class="template-card">
<div class="template-img">默认</div>
</div>
<div class="template-card">
<div class="template-img">表格型(上下结构)</div>
</div>
<div class="template-card">
<div class="template-img">表格型(左右结构)</div>
</div>
</div>
<h3 style="margin: 40px 0 20px; font-size: 16px;">自动配图</h3>
<div class="config-options">
<div class="config-item">
<span style="color: #5f6368;">🖼️ AI智能配图引擎基于生成的文本内容自动匹配相应配图片</span>
</div>
<div class="config-item">
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
<span style="color: #5f6368;"></span>
<input type="radio" name="image-config" value="none" checked>
</label>
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
<span style="color: #5f6368;">较少</span>
<input type="radio" name="image-config" value="few">
</label>
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
<span style="color: #4285f4;">中等</span>
<input type="radio" name="image-config" value="medium">
</label>
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
<span style="color: #5f6368;">较多</span>
<input type="radio" name="image-config" value="many">
</label>
</div>
</div>
<h3 style="margin: 40px 0 20px; font-size: 16px;">表格</h3>
<div class="config-options">
<div class="config-item">
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
<span style="color: #5f6368;"></span>
<input type="radio" name="table-config" value="none">
</label>
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
<span style="color: #5f6368;">较少</span>
<input type="radio" name="table-config" value="few">
</label>
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
<span style="color: #4285f4;">中等</span>
<input type="radio" name="table-config" value="medium" checked>
</label>
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
<span style="color: #5f6368;">较多</span>
<input type="radio" name="table-config" value="many">
</label>
</div>
</div>
<h3 style="margin: 40px 0 20px; font-size: 16px;">流程图</h3>
<div class="config-options">
<div class="config-item">
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
<span style="color: #5f6368;"></span>
<input type="radio" name="flow-config" value="none">
</label>
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
<span style="color: #4285f4;"></span>
<input type="radio" name="flow-config" value="yes" checked>
</label>
</div>
</div>
<h3 style="margin: 40px 0 20px; font-size: 16px;">统一称谓</h3>
<div class="config-options">
<div class="config-item">
<span style="color: #5f6368;">统一设置方案中的自称,如"我方"、"我司"等,全文保持统一</span>
</div>
<div class="config-item">
<input type="text" placeholder="我方" style="padding: 8px 12px; border: 1px solid #dadce0; border-radius: 4px; width: 200px;">
<span>先主语</span>
<button class="btn btn-secondary" style="margin-left: 20px;">+ 自定义</button>
</div>
</div>
<div class="config-options" style="margin-top: 30px;">
<div class="config-item">
<input type="checkbox" class="config-checkbox" id="smartTitle" checked>
<label for="smartTitle" class="config-label">
<strong>🤖 暗标功能</strong><br>
<span style="font-size: 12px; color: #5f6368;">
开启暗标功能后,系统将自动遮盖企业名称等关键信息,以符合公开招标要求,确保客观公正。
联系方式、公司人员信息、联系方式、证件信息都不会暴露。
</span>
</label>
</div>
<div class="config-item">
<input type="checkbox" class="config-checkbox" id="deepseek">
<label for="deepseek" class="config-label">
<strong>🎯 DeepSeek-R1满血版</strong><br>
<span style="font-size: 12px; color: #5f6368;">
搭载DeepSeek-R1引擎后续思维引擎进行深度思维和文本提供重构技术方案模块的优优化水平至更高。
</span>
</label>
</div>
</div>
</div>
<div class="tab-pane" id="template-pane">
<h3>A3版面设置</h3>
<p>横向A3版面适用于大型工程项目标书</p>
</div>
</div>
<!-- 第二步:解析文件 -->
<div class="step-content" id="step-2">
<h2 style="margin-bottom: 30px;">上传招标文件</h2>
<div class="upload-section">
<div class="upload-area" id="tenderUpload">
<div class="upload-icon">📄</div>
<h3 class="upload-title">晋江市医院(上海市第六人民医院福建医院)住院部智慧技楼连廊封窗项目</h3>
<p class="upload-desc">竞争性磋商文件<br>(工程类)</p>
<div style="margin-top: 20px;">
<p style="font-size: 12px; color: #5f6368; line-height: 1.8;">
项目名称:晋江市医院(上海市第六人民医院福建医院)住院部智慧技楼连廊封窗项目<br>
招标编号CG2M-2025-350582-01940[2025]01521<br>
项目编号:[350582]FJPCC[CS]20250006
</p>
<div style="margin-top: 15px;">
<img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='80' height='80'%3E%3Crect width='80' height='80' fill='%23ea4335'/%3E%3C/svg%3E" alt="公章" style="width: 80px; height: 80px; opacity: 0.3;">
<img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='80' height='80'%3E%3Crect width='80' height='80' fill='%23ea4335'/%3E%3C/svg%3E" alt="公章" style="width: 80px; height: 80px; opacity: 0.3; margin-left: 20px;">
</div>
</div>
</div>
</div>
<div class="parse-info">
<div class="parse-header">
<span>📋</span>
<span>招标文件解析</span>
</div>
<div class="parse-content">
<div class="parse-item">
<div class="parse-label">方案名称</div>
<div class="parse-value">
<input type="text" value="晋江市医院(上海市第六人民医院福建医院)住院部智慧技楼连廊封">
</div>
</div>
<div class="parse-item">
<div class="parse-label">方案类型</div>
<div class="parse-value">
<select>
<option>服务类</option>
<option>货物类</option>
<option selected>工程类</option>
<option>其他</option>
</select>
</div>
</div>
<div class="parse-item">
<div class="parse-label">项目日期</div>
<div class="parse-value">
<div class="date-range">
<input type="date" value="2025-09-11">
<span></span>
<input type="date" value="2025-12-10">
</div>
</div>
</div>
<div class="parse-item">
<div class="parse-label">招标要求</div>
<div class="parse-value">
<textarea style="width: 100%; height: 120px; padding: 8px 12px; border: 1px solid #dadce0; border-radius: 4px; font-size: 14px; resize: vertical;">项目概况:晋江市医院(上海市第六人民医院福建医院)拟对住院部智慧技楼的连廊进行封窗改造,改造内容包括门窗安装、消防及电梯...</textarea>
</div>
</div>
<div class="parse-item">
<div class="parse-label">评分标准</div>
<div class="parse-value">
<textarea style="width: 100%; height: 200px; padding: 8px 12px; border: 1px solid #dadce0; border-radius: 4px; font-size: 14px; resize: vertical;">A. 技术和服务要求响应程度【4352】1.技术和服务要求响应程度:技术和服
务要求的响应程度【4352】5. 施工方案【25】6. 施工方案:方案的合理性和
...</textarea>
</div>
</div>
</div>
</div>
<div class="reference-section">
<h3 class="reference-title">引用资料 <span style="font-size: 12px; color: #5f6368;">AI将以您上传的文件为依据进行编写</span></h3>
<div class="reference-grid">
<div class="reference-upload" onclick="uploadReference('knowledge')">
<div class="reference-icon">📚</div>
<div class="reference-name">引用知识库</div>
<div class="reference-desc">从知识库选择中选择</div>
</div>
<div class="reference-upload" onclick="uploadReference('clean')">
<div class="reference-icon"></div>
<div class="reference-name">工程清单</div>
<div class="reference-desc" style="color: #1a73e8;">生成目录方式:按评分标准内容生成</div>
<select style="margin-top: 10px; padding: 4px 8px; border: 1px solid #dadce0; border-radius: 4px; font-size: 12px;">
<option>生成目录方式:按评分标准内容生成</option>
<option>按工程量清单生成</option>
<option>按技术要求生成</option>
</select>
</div>
</div>
</div>
<!-- 新增:工程图纸识别功能 -->
<div class="engineering-section">
<h3 class="engineering-title">🏗️ 工程资料(可选)</h3>
<div class="reference-grid">
<div class="reference-upload" onclick="uploadReference('boq')" id="boqUpload">
<div class="reference-icon">📊</div>
<div class="reference-name">工程量清单</div>
<div class="reference-desc">上传Excel/CSV格式清单AI自动计算报价</div>
</div>
<div class="reference-upload" onclick="uploadReference('drawing')" id="drawingUpload">
<div class="reference-icon">📐</div>
<div class="reference-name">工程图纸</div>
<div class="reference-desc">支持CAD、PDF格式智能提取技术参数</div>
</div>
</div>
<div id="engineeringResult" style="display: none; margin-top: 15px; padding: 15px; background: #e8f0fe; border-radius: 8px;">
<div style="font-size: 14px; color: #1a73e8; font-weight: 500; margin-bottom: 10px;">✅ 识别成功</div>
<div id="engineeringResultContent" style="font-size: 13px; color: #5f6368; line-height: 1.6;"></div>
</div>
</div>
</div>
<!-- 第三步:确认目录 -->
<div class="step-content" id="step-3">
<div style="display: flex; align-items: center; gap: 20px; margin-bottom: 30px;">
<h2>招标文件</h2>
<div style="display: flex; gap: 10px;">
<button class="btn btn-secondary">📋 项目概述</button>
<button class="btn btn-secondary">📊 评分标准</button>
</div>
<div style="margin-left: auto; display: flex; gap: 10px;">
<button class="btn btn-secondary">📥 编辑设置</button>
<button class="btn btn-secondary">🎨 重新生成</button>
<button class="btn btn-secondary">📑 生成历史</button>
</div>
</div>
<div class="outline-container">
<div class="outline-tree">
<h3 style="margin-bottom: 15px;">目录大纲</h3>
<div style="background: #e8f0fe; padding: 10px; border-radius: 6px; margin-bottom: 20px;">
<div style="font-size: 13px; color: #1a73e8; margin-bottom: 10px;">
<strong>评分标准</strong>
</div>
<div style="font-size: 12px; color: #5f6368; line-height: 1.6;">
第一章 技术和服务要求响应<br>
第一节 技术标准响应<br>
一、建筑结构设计标准<br>
二、窗体材料技术要求<br>
三、密封性能响应<br>
四、隔热保温技术措施<br>
五、防水防渗技术方案<br>
六、安全性能保障措施<br>
第二节 服务保障响应<br>
一、项目管理体系<br>
二、施工进度保障措施<br>
三、质量控制流程<br>
四、售后服务承诺<br>
五、应急响应机制<br>
第二章 施工与建筑安装工程<br>
第一节 施工方案<br>
一、绿色节能设计应用<br>
二、智能化管控方案<br>
三、材料选型优化<br>
四、施工工艺创新<br>
五、运维管理优化<br>
六、隐蔽增效策措<br>
</div>
</div>
<div style="background: white; padding: 10px; border-radius: 6px; border: 1px solid #e8eaed;">
<div style="font-size: 13px; color: #202124; margin-bottom: 10px;">
<strong>生成章节</strong>
</div>
<div class="tree-item level-1">第一章 技术和服务要求响应</div>
<div class="tree-item level-2">第一节 技术标准响应</div>
<div class="tree-item level-2">第二节 服务保障响应</div>
<div class="tree-item level-1">第二章 门窗与建筑安装工程</div>
<div class="tree-item level-2">第一节 门窗工程</div>
<div class="tree-item level-3">一、特级复合防火幕窗门窗安装施工方案(含门选、功能</div>
</div>
<button class="btn btn-primary" style="width: 100%; margin-top: 20px;">生成第四级章节</button>
</div>
<div class="outline-preview">
<h2>福建省政府采购项目</h2>
<h3>竞争性磋商文件</h3>
<h3>(工程类)</h3>
<div style="margin: 40px 0;">
<p><strong>项目名称:</strong>晋江市医院(上海市第六人民医院福建医院)住院部智慧技楼连廊封窗项目</p>
<p><strong>招标编号:</strong>CG2M-2025-350582-01940[2025]01521</p>
<p><strong>项目编号:</strong>[350582]FJPCC[CS]20250006</p>
</div>
<div style="margin-top: 40px; padding: 20px; background: #f8f9fa; border-radius: 8px;">
<p style="font-size: 14px; color: #5f6368; line-height: 1.8;">
【实施要求】基本要求1. 本项目工程内容以采购人提供的工程量清单、图纸及现场为准。详见附件。2. 成交供应方须严格按照...</p>
</div>
</div>
</div>
<div class="page-selector">
<div class="page-title">页数选择正文默认使用小四字号每页约500字段。生成全文约422页约253200字</div>
<input type="range" class="page-slider" min="282" max="2814" value="422" id="pageSlider">
<div class="page-marks">
<span>282</span>
<span>422</span>
<span>844</span>
<span>1055</span>
<span>1759</span>
<span>2110</span>
<span>2462</span>
<span>2814</span>
</div>
<div class="page-value" id="pageValue">422页</div>
</div>
</div>
<!-- 第四步:编写全文 -->
<div class="step-content" id="step-4">
<div class="generation-status" id="generationStatus">
<div class="generation-icon"></div>
<h2 class="generation-text">正在生成全文...</h2>
<p class="generation-desc">请稍等片刻,"编写全文"正在运行中...</p>
<div class="loading-spinner" style="margin-top: 20px;"></div>
</div>
<div class="editor-container" id="editorContainer" style="display: none;">
<div class="editor-sidebar">
<h3 class="sidebar-title">📄 晋江市医院(上海...</h3>
<div class="doc-tree">
<div class="doc-section">
<div class="doc-section-title expanded" onclick="toggleSection(this)">
第一章 技术和服务要求响应
</div>
<div class="doc-subsections show">
<div class="doc-subsection">一、建筑结构设计标准</div>
<div class="doc-subsection">二、窗体材料技术要求</div>
<div class="doc-subsection">三、密封性能响应</div>
<div class="doc-subsection">四、隔热保温技术措施</div>
<div class="doc-subsection">五、防水防渗技术方案</div>
<div class="doc-subsection">六、安全性能保障措施</div>
</div>
</div>
<div class="doc-section">
<div class="doc-section-title" onclick="toggleSection(this)">
第二章 服务保障响应
</div>
<div class="doc-subsections">
<div class="doc-subsection">一、项目管理体系</div>
<div class="doc-subsection">二、施工进度保障措施</div>
<div class="doc-subsection">三、质量控制流程</div>
<div class="doc-subsection">四、售后服务承诺</div>
<div class="doc-subsection">五、应急响应机制</div>
</div>
</div>
<div class="doc-section">
<div class="doc-section-title" onclick="toggleSection(this)">
第三章 施工与建筑安装工程
</div>
<div class="doc-subsections">
<div class="doc-subsection">一、绿色节能设计应用</div>
<div class="doc-subsection">二、智能化管控方案</div>
<div class="doc-subsection">三、材料选型优化</div>
<div class="doc-subsection">四、施工工艺创新</div>
<div class="doc-subsection">五、运维管理优化</div>
</div>
</div>
</div>
<div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #e8eaed;">
<h4 style="font-size: 14px; margin-bottom: 10px;">第三章 创新与优化方案</h4>
<ul style="font-size: 13px; color: #5f6368; line-height: 1.8; padding-left: 20px;">
<li>绿色节能设计应用</li>
<li>智能化管控方案</li>
<li>材料选型优化</li>
<li>施工工艺创新</li>
<li>运维管理优化</li>
</ul>
</div>
<div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #e8eaed;">
<h4 style="font-size: 14px; margin-bottom: 10px;">第二章 门窗与建筑安装工程</h4>
<div style="font-size: 13px; margin-bottom: 10px;">第一节 门窗工程</div>
<ul style="font-size: 12px; color: #5f6368; line-height: 1.8; padding-left: 20px;">
<li>特级复合防火幕窗门窗安装施工方案(含门选、功能</li>
<li>金属防火窗安装施工</li>
<li>隔热铝合金窗材窗安装</li>
<li>施工工艺流程</li>
<li>金属百叶窗安装施工</li>
<li>窗间墙面JCS外泥涂质</li>
<li>铝塑铝合金装施工安装施工</li>
</ul>
</div>
</div>
<div class="editor-main">
<div class="editor-toolbar">
<button class="toolbar-btn">📄 正文模式</button>
<button class="toolbar-btn">📊 目录模式</button>
<div style="margin-left: auto;">
<button class="toolbar-btn" onclick="editContent()">✏️ 编辑</button>
<button class="toolbar-btn" onclick="saveContent()">💾 保存</button>
<button class="toolbar-btn" onclick="exportDocument()">📥 导出</button>
</div>
</div>
<div class="editor-content">
<div style="text-align: center; padding: 100px 0;">
<img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='150'%3E%3Crect width='200' height='150' fill='%23f8f9fa' stroke='%23dadce0'/%3E%3Ctext x='50%25' y='50%25' text-anchor='middle' dy='.3em' fill='%235f6368' font-size='14'%3E标书文档预览%3C/text%3E%3C/svg%3E" alt="文档预览">
<h3 style="margin-top: 20px; color: #202124;">本章节未编写</h3>
<p style="color: #5f6368; margin-top: 10px;">请点击下方"编写本章节"按钮生成内容,或从左侧选择其他章节查看。</p>
<button class="btn btn-primary" style="margin-top: 20px;">编写本章节</button>
</div>
</div>
</div>
</div>
<div class="result-panel" id="resultPanel" style="display: none;">
<div class="result-icon"></div>
<h2 class="result-title">标书生成完成</h2>
<p class="result-desc">您的标书已成功生成共422页约253,200字</p>
<div class="result-actions">
<button class="result-btn primary" onclick="downloadDocument()">下载文档</button>
<button class="result-btn secondary" onclick="previewDocument()">在线预览</button>
<button class="result-btn secondary" onclick="editDocument()">继续编辑</button>
</div>
</div>
</div>
</div>
<!-- 底部操作栏 -->
<div class="footer-actions">
<div class="footer-left">
<button class="btn btn-secondary" onclick="saveProgress()">💾 保存</button>
<button class="btn btn-secondary" onclick="location.href='dashboard-optimized.html'">🏠 返回</button>
</div>
<div class="footer-buttons">
<button class="btn btn-secondary" id="prevBtn" onclick="previousStep()">上一步</button>
<button class="btn btn-primary" id="nextBtn" onclick="nextStep()">下一步</button>
</div>
</div>
</div>
<script>
let currentStep = 1;
let uploadedFiles = {
tender: null,
boq: null,
drawing: null,
knowledge: null
};
// 切换设置标签
function switchSettingTab(tab) {
document.querySelectorAll('.settings-tab').forEach(t => t.classList.remove('active'));
document.querySelectorAll('.tab-pane').forEach(p => p.classList.remove('active'));
event.target.classList.add('active');
document.getElementById(tab + '-pane').classList.add('active');
}
// 上传引用资料
function uploadReference(type) {
const input = document.createElement('input');
input.type = 'file';
if (type === 'boq') {
input.accept = '.xls,.xlsx,.csv';
} else if (type === 'drawing') {
input.accept = '.pdf,.dwg,.dxf,.dwf,.dgn';
input.multiple = true;
}
input.onchange = function(e) {
if (e.target.files.length > 0) {
uploadedFiles[type] = e.target.files;
if (type === 'boq') {
document.getElementById('boqUpload').classList.add('uploaded');
document.getElementById('boqUpload').innerHTML += '<div class="reference-status">✅ 已上传清单</div>';
// 显示识别结果
setTimeout(() => {
document.getElementById('engineeringResult').style.display = 'block';
document.getElementById('engineeringResultContent').innerHTML = `
<strong>工程量清单识别结果:</strong><br>
• 识别到156个清单项<br>
• 总造价¥2,850,000<br>
• 主要项目:门窗安装、防水工程、装饰工程
`;
}, 1000);
} else if (type === 'drawing') {
document.getElementById('drawingUpload').classList.add('uploaded');
document.getElementById('drawingUpload').innerHTML += `<div class="reference-status">✅ 已上传${e.target.files.length}个图纸</div>`;
// 显示识别结果
setTimeout(() => {
document.getElementById('engineeringResult').style.display = 'block';
const currentContent = document.getElementById('engineeringResultContent').innerHTML;
document.getElementById('engineeringResultContent').innerHTML = currentContent + `
<br><br><strong>工程图纸识别结果:</strong><br>
• 建筑面积3,680㎡<br>
• 层高4.5m<br>
• 结构类型:框架结构<br>
• 主要材料:铝合金、钢化玻璃
`;
}, 1500);
}
}
};
input.click();
}
// 下一步
function nextStep() {
if (currentStep < 4) {
// 更新步骤指示器
document.getElementById(`step-${currentStep}-indicator`).classList.remove('active');
document.getElementById(`step-${currentStep}-indicator`).classList.add('completed');
document.getElementById(`step-${currentStep}`).classList.remove('active');
currentStep++;
document.getElementById(`step-${currentStep}-indicator`).classList.add('active');
document.getElementById(`step-${currentStep}`).classList.add('active');
// 更新按钮状态
updateButtons();
// 第四步时开始生成
if (currentStep === 4) {
startGeneration();
}
}
}
// 上一步
function previousStep() {
if (currentStep > 1) {
document.getElementById(`step-${currentStep}-indicator`).classList.remove('active', 'completed');
document.getElementById(`step-${currentStep}`).classList.remove('active');
currentStep--;
document.getElementById(`step-${currentStep}-indicator`).classList.remove('completed');
document.getElementById(`step-${currentStep}-indicator`).classList.add('active');
document.getElementById(`step-${currentStep}`).classList.add('active');
updateButtons();
}
}
// 更新按钮状态
function updateButtons() {
const prevBtn = document.getElementById('prevBtn');
const nextBtn = document.getElementById('nextBtn');
if (currentStep === 1) {
prevBtn.style.display = 'none';
} else {
prevBtn.style.display = 'inline-block';
}
if (currentStep === 4) {
nextBtn.textContent = '一键编写全文';
nextBtn.onclick = function() {
generateFullDocument();
};
} else {
nextBtn.textContent = '下一步';
nextBtn.onclick = nextStep;
}
}
// 开始生成
function startGeneration() {
setTimeout(() => {
document.getElementById('generationStatus').style.display = 'none';
document.getElementById('editorContainer').style.display = 'grid';
}, 3000);
}
// 生成全文
function generateFullDocument() {
document.getElementById('editorContainer').style.display = 'none';
document.getElementById('resultPanel').style.display = 'block';
const nextBtn = document.getElementById('nextBtn');
nextBtn.textContent = '下载文档';
nextBtn.onclick = downloadDocument;
}
// 切换文档树节
function toggleSection(element) {
element.classList.toggle('expanded');
const subsections = element.nextElementSibling;
if (subsections) {
subsections.classList.toggle('show');
}
}
// 保存进度
function saveProgress() {
localStorage.setItem('biddingProgress', JSON.stringify({
step: currentStep,
files: uploadedFiles
}));
alert('进度已保存');
}
// 下载文档
function downloadDocument() {
alert('正在准备下载标书文档...');
}
// 预览文档
function previewDocument() {
window.open('preview.html', '_blank');
}
// 编辑文档
function editDocument() {
document.getElementById('resultPanel').style.display = 'none';
document.getElementById('editorContainer').style.display = 'grid';
}
// 页数滑块
const pageSlider = document.getElementById('pageSlider');
const pageValue = document.getElementById('pageValue');
if (pageSlider) {
pageSlider.addEventListener('input', function() {
pageValue.textContent = this.value + '页';
});
}
// 选择封面模板
document.querySelectorAll('.cover-template').forEach(template => {
template.addEventListener('click', function() {
document.querySelectorAll('.cover-template').forEach(t => t.classList.remove('selected'));
this.classList.add('selected');
});
});
// 初始化
updateButtons();
</script>
</body>
</html>