|
@@ -191,24 +191,31 @@
|
|
|
<!-- 左侧保留 -->
|
|
|
<div class="left-column">
|
|
|
<div class="project-info-card card">
|
|
|
- <div class="card-header">
|
|
|
+ <div class="card-header" (click)="toggleCustomerInfo()" style="cursor: pointer;">
|
|
|
<h2>客户信息</h2>
|
|
|
- <div class="sync-status" [class.syncing]="isSyncingCustomerInfo">
|
|
|
- @if (isSyncingCustomerInfo) {
|
|
|
- <span class="sync-indicator">
|
|
|
- <span class="sync-spinner"></span>
|
|
|
- 同步中...
|
|
|
- </span>
|
|
|
- } @else if (lastSyncTime) {
|
|
|
- <span class="sync-time">
|
|
|
- <i class="icon-sync"></i>
|
|
|
- 已同步: {{ formatTime(lastSyncTime) }}
|
|
|
- </span>
|
|
|
- }
|
|
|
+ <div class="header-actions">
|
|
|
+ <div class="sync-status" [class.syncing]="isSyncingCustomerInfo">
|
|
|
+ @if (isSyncingCustomerInfo) {
|
|
|
+ <span class="sync-indicator">
|
|
|
+ <span class="sync-spinner"></span>
|
|
|
+ 同步中...
|
|
|
+ </span>
|
|
|
+ } @else if (lastSyncTime) {
|
|
|
+ <span class="sync-time">
|
|
|
+ <i class="icon-sync"></i>
|
|
|
+ 已同步: {{ formatTime(lastSyncTime) }}
|
|
|
+ </span>
|
|
|
+ }
|
|
|
+ </div>
|
|
|
+ <div class="toggle-icon" [class.expanded]="isCustomerInfoExpanded">
|
|
|
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
|
+ <path d="M4 6L8 10L12 6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
|
+ </svg>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
@if (project) {
|
|
|
- <div class="info-grid">
|
|
|
+ <div class="info-grid" [class.collapsed]="!isCustomerInfoExpanded">
|
|
|
<!-- 显示订单创建时填写的客户信息,如果有的话 -->
|
|
|
@if (orderCreationData?.customerInfo) {
|
|
|
<!-- 基本客户信息 -->
|
|
@@ -231,7 +238,7 @@
|
|
|
<div class="info-item"><label>项目创建</label><span>{{ formatDate(project.createdAt) }}</span></div>
|
|
|
<div class="info-item"><label>截止日期</label><span>{{ formatDate(project.deadline) }}</span></div>
|
|
|
</div>
|
|
|
- <div class="tags-container" style="margin-top: 12px;">
|
|
|
+ <div class="tags-container" [class.collapsed]="!isCustomerInfoExpanded" style="margin-top: 12px;">
|
|
|
<div class="tag-section">
|
|
|
<h3>客户标签</h3>
|
|
|
<div class="tags">
|
|
@@ -241,161 +248,8 @@
|
|
|
@if (project.customerTags.length === 0) { <span class="desc">暂无标签</span> }
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="tag-section">
|
|
|
- <h3>高优先级需求</h3>
|
|
|
- <ul class="need-list">
|
|
|
- @for (need of project.highPriorityNeeds; track $index) {
|
|
|
- <li>{{ need }}</li>
|
|
|
- }
|
|
|
- @if (project.highPriorityNeeds.length === 0) { <li class="desc">无</li> }
|
|
|
- </ul>
|
|
|
-
|
|
|
- <!-- 新增:需求关键信息同步区域 -->
|
|
|
- <div class="requirement-sync-info">
|
|
|
- <h4>项目需求信息</h4>
|
|
|
-
|
|
|
- <!-- 显示订单创建时填写的需求信息 -->
|
|
|
- @if (orderCreationData?.requirementInfo) {
|
|
|
- <div class="order-requirement-info">
|
|
|
- <h5>订单创建阶段需求</h5>
|
|
|
- <div class="key-info-grid">
|
|
|
- @if (orderCreationData.requirementInfo.downPayment) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">定金金额</span>
|
|
|
- <span class="info-value">¥{{ orderCreationData.requirementInfo.downPayment }}</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- @if (orderCreationData.requirementInfo.budget) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">预算范围</span>
|
|
|
- <span class="info-value">¥{{ orderCreationData.requirementInfo.budget }}</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- @if (orderCreationData.requirementInfo.area) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">房屋面积</span>
|
|
|
- <span class="info-value">{{ orderCreationData.requirementInfo.area }}㎡</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- @if (orderCreationData.requirementInfo.houseType) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">房屋类型</span>
|
|
|
- <span class="info-value">{{ orderCreationData.requirementInfo.houseType }}</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- @if (orderCreationData.requirementInfo.smallImageTime) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">小图时间</span>
|
|
|
- <span class="info-value">{{ formatDate(orderCreationData.requirementInfo.smallImageTime) }}</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- @if (orderCreationData.requirementInfo.largeImageTime) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">大图时间</span>
|
|
|
- <span class="info-value">{{ formatDate(orderCreationData.requirementInfo.largeImageTime) }}</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- @if (orderCreationData.requirementInfo.spaceRequirements) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">涉及空间</span>
|
|
|
- <span class="info-value">{{ orderCreationData.requirementInfo.spaceRequirements }}</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- @if (orderCreationData.requirementInfo.designAngles) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">设计角度</span>
|
|
|
- <span class="info-value">{{ orderCreationData.requirementInfo.designAngles }}</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- @if (orderCreationData.requirementInfo.specialAreaHandling) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">特殊区域处理</span>
|
|
|
- <span class="info-value">{{ orderCreationData.requirementInfo.specialAreaHandling }}</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- @if (orderCreationData.requirementInfo.materialRequirements) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">材质要求</span>
|
|
|
- <span class="info-value">{{ orderCreationData.requirementInfo.materialRequirements }}</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- @if (orderCreationData.requirementInfo.lightingRequirements) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">灯光要求</span>
|
|
|
- <span class="info-value">{{ orderCreationData.requirementInfo.lightingRequirements }}</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 显示偏好标签 -->
|
|
|
- @if (orderCreationData.preferenceTags && orderCreationData.preferenceTags.length > 0) {
|
|
|
- <div class="preference-tags">
|
|
|
- <span class="info-label">偏好标签:</span>
|
|
|
- <div class="tags">
|
|
|
- @for (tag of orderCreationData.preferenceTags; track tag) {
|
|
|
- <span class="tag">{{ tag }}</span>
|
|
|
- }
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- }
|
|
|
- </div>
|
|
|
- }
|
|
|
-
|
|
|
- <!-- 确认需求阶段的关键信息 -->
|
|
|
- <div class="confirmed-requirement-info">
|
|
|
- <h5>确认需求关键信息</h5>
|
|
|
- <div class="key-info-grid">
|
|
|
- @if (requirementKeyInfo.colorAtmosphere.description) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">色彩氛围</span>
|
|
|
- <span class="info-value">{{ requirementKeyInfo.colorAtmosphere.description }}</span>
|
|
|
- <div class="color-preview" [style.background-color]="requirementKeyInfo.colorAtmosphere.mainColor"></div>
|
|
|
- </div>
|
|
|
- }
|
|
|
-
|
|
|
- @if (requirementKeyInfo.spaceStructure.aspectRatio > 0) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">空间结构</span>
|
|
|
- <span class="info-value">比例 {{ requirementKeyInfo.spaceStructure.aspectRatio.toFixed(1) }}</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
-
|
|
|
- @if (requirementKeyInfo.materialWeights.woodRatio > 0 || requirementKeyInfo.materialWeights.fabricRatio > 0) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">材质权重</span>
|
|
|
- <div class="material-weights">
|
|
|
- @if (requirementKeyInfo.materialWeights.woodRatio > 0) {
|
|
|
- <span class="weight-item">木质 {{ requirementKeyInfo.materialWeights.woodRatio }}%</span>
|
|
|
- }
|
|
|
- @if (requirementKeyInfo.materialWeights.fabricRatio > 0) {
|
|
|
- <span class="weight-item">布艺 {{ requirementKeyInfo.materialWeights.fabricRatio }}%</span>
|
|
|
- }
|
|
|
- @if (requirementKeyInfo.materialWeights.metalRatio > 0) {
|
|
|
- <span class="weight-item">金属 {{ requirementKeyInfo.materialWeights.metalRatio }}%</span>
|
|
|
- }
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- }
|
|
|
-
|
|
|
- @if (requirementKeyInfo.presetAtmosphere.name) {
|
|
|
- <div class="info-item">
|
|
|
- <span class="info-label">预设氛围</span>
|
|
|
- <span class="info-value">{{ requirementKeyInfo.presetAtmosphere.name }}</span>
|
|
|
- <span class="color-temp">{{ requirementKeyInfo.presetAtmosphere.colorTemp }}</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- </div>
|
|
|
-
|
|
|
- @if (getRequirementSummary().length === 0 && !orderCreationData?.requirementInfo) {
|
|
|
- <div class="sync-placeholder">
|
|
|
- <span class="placeholder-text">暂无同步的需求信息</span>
|
|
|
- <button class="sync-btn" (click)="syncRequirementKeyInfo({})">手动同步</button>
|
|
|
- </div>
|
|
|
- }
|
|
|
- </div>
|
|
|
- </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+
|
|
|
} @else {
|
|
|
<div class="loading-state">
|
|
|
<div class="loading-spinner"></div>
|
|
@@ -403,6 +257,115 @@
|
|
|
</div>
|
|
|
}
|
|
|
</div>
|
|
|
+
|
|
|
+ <!-- 方案确认卡片 - 优化样式与左侧客户信息卡片保持一致 -->
|
|
|
+ <div class="proposal-confirm-card card">
|
|
|
+ <div class="card-header">
|
|
|
+ <h2>方案确认</h2>
|
|
|
+ <div class="sync-status">
|
|
|
+ <span class="progress-text">{{ getRequiredStagesProgress() }}% 完成</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 需求信息展示区域 -->
|
|
|
+ @if (areRequiredStagesCompleted()) {
|
|
|
+ <div class="info-grid">
|
|
|
+ <!-- 色调信息 -->
|
|
|
+ @if (requirementKeyInfo.colorAtmosphere.description) {
|
|
|
+ <div class="info-item">
|
|
|
+ <label>色调</label>
|
|
|
+ <span>{{ requirementKeyInfo.colorAtmosphere.description }}</span>
|
|
|
+ @if (requirementKeyInfo.colorAtmosphere.mainColor) {
|
|
|
+ <div class="color-preview" [style.background-color]="requirementKeyInfo.colorAtmosphere.mainColor"></div>
|
|
|
+ }
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+
|
|
|
+ <!-- 材质信息 -->
|
|
|
+ @if (requirementKeyInfo.colorAtmosphere.materials && requirementKeyInfo.colorAtmosphere.materials.length > 0) {
|
|
|
+ <div class="info-item">
|
|
|
+ <label>材质</label>
|
|
|
+ <span>
|
|
|
+ @for (material of requirementKeyInfo.colorAtmosphere.materials; track material; let isLast = $last) {
|
|
|
+ {{ material }}@if (!isLast) {, }
|
|
|
+ }
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+
|
|
|
+ <!-- 空间结构 -->
|
|
|
+ @if (requirementKeyInfo.spaceStructure.aspectRatio > 0) {
|
|
|
+ <div class="info-item">
|
|
|
+ <label>空间比例</label>
|
|
|
+ <span>{{ requirementKeyInfo.spaceStructure.aspectRatio.toFixed(1) }}</span>
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+
|
|
|
+ @if (requirementKeyInfo.spaceStructure.ceilingHeight > 0) {
|
|
|
+ <div class="info-item">
|
|
|
+ <label>层高</label>
|
|
|
+ <span>{{ requirementKeyInfo.spaceStructure.ceilingHeight }}m</span>
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+
|
|
|
+ <!-- 材质权重 -->
|
|
|
+ @if (requirementKeyInfo.materialWeights.woodRatio > 0) {
|
|
|
+ <div class="info-item">
|
|
|
+ <label>木质比例</label>
|
|
|
+ <span>{{ requirementKeyInfo.materialWeights.woodRatio }}%</span>
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+
|
|
|
+ @if (requirementKeyInfo.materialWeights.fabricRatio > 0) {
|
|
|
+ <div class="info-item">
|
|
|
+ <label>布艺比例</label>
|
|
|
+ <span>{{ requirementKeyInfo.materialWeights.fabricRatio }}%</span>
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+
|
|
|
+ @if (requirementKeyInfo.materialWeights.metalRatio > 0) {
|
|
|
+ <div class="info-item">
|
|
|
+ <label>金属比例</label>
|
|
|
+ <span>{{ requirementKeyInfo.materialWeights.metalRatio }}%</span>
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+
|
|
|
+ <!-- 预设氛围 -->
|
|
|
+ @if (requirementKeyInfo.presetAtmosphere.name) {
|
|
|
+ <div class="info-item">
|
|
|
+ <label>预设氛围</label>
|
|
|
+ <span>{{ requirementKeyInfo.presetAtmosphere.name }}</span>
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+
|
|
|
+ <!-- 小图时间 -->
|
|
|
+ @if (getEstimatedSmallImageTime()) {
|
|
|
+ <div class="info-item">
|
|
|
+ <label>预计时间</label>
|
|
|
+ <span>{{ getEstimatedSmallImageTime() }}</span>
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 确认方案按钮 -->
|
|
|
+ <div class="proposal-actions">
|
|
|
+ <button class="confirm-btn" (click)="confirmProposal()">
|
|
|
+ 确认方案
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ } @else {
|
|
|
+ <!-- 等待状态 -->
|
|
|
+ <div class="waiting-state">
|
|
|
+ <div class="waiting-content">
|
|
|
+ <h5>等待需求信息完善</h5>
|
|
|
+ <p>需求沟通阶段完成后,方案确认功能将自动开启</p>
|
|
|
+ <div class="progress-info">
|
|
|
+ <span>当前进度: {{ getRequiredStagesProgress() }}%</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+ </div>
|
|
|
</div>
|
|
|
|
|
|
<!-- 右侧三分之二 - 制作流程进度 -->
|
|
@@ -435,217 +398,11 @@
|
|
|
(dataUpdated)="onRequirementDataUpdated($event)">
|
|
|
</app-requirements-confirm-card>
|
|
|
} @else if (stage === '方案确认') {
|
|
|
- <!-- 方案确认阶段 - 需求信息展示 -->
|
|
|
- <div class="proposal-confirm-section">
|
|
|
- <div class="section-header">
|
|
|
- <h4>方案确认</h4>
|
|
|
- <div class="progress-indicator">
|
|
|
- <span class="progress-text">{{ getRequiredStagesProgress() }}% 完成</span>
|
|
|
- </div>
|
|
|
+ <!-- 方案确认阶段 - 已移动到左侧列 -->
|
|
|
+ <div class="proposal-confirm-placeholder">
|
|
|
+ <div class="placeholder-message">
|
|
|
+ <p>方案确认卡片已移动到左侧区域</p>
|
|
|
</div>
|
|
|
-
|
|
|
- <!-- 需求信息展示区域 -->
|
|
|
- @if (areRequiredStagesCompleted()) {
|
|
|
- <div class="requirement-info-display">
|
|
|
- <div class="info-header">
|
|
|
- <h5>确认的需求信息</h5>
|
|
|
- <span class="info-subtitle">来自需求沟通阶段</span>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="info-grid">
|
|
|
- <!-- 色调和材质并排布局 -->
|
|
|
- <div class="color-material-row">
|
|
|
- <!-- 色调 -->
|
|
|
- @if (requirementKeyInfo.colorAtmosphere.description) {
|
|
|
- <div class="info-item color-item">
|
|
|
- <div class="info-label">
|
|
|
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
|
- <circle cx="12" cy="12" r="10"></circle>
|
|
|
- <path d="M12 6v6l4 2"></path>
|
|
|
- </svg>
|
|
|
- 色调
|
|
|
- </div>
|
|
|
- <div class="info-content">
|
|
|
- <span class="info-value">{{ requirementKeyInfo.colorAtmosphere.description }}</span>
|
|
|
- @if (requirementKeyInfo.colorAtmosphere.mainColor) {
|
|
|
- <div class="color-preview" [style.background-color]="requirementKeyInfo.colorAtmosphere.mainColor"></div>
|
|
|
- }
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- }
|
|
|
-
|
|
|
- <!-- 材质 -->
|
|
|
- @if (requirementKeyInfo.colorAtmosphere.materials && requirementKeyInfo.colorAtmosphere.materials.length > 0) {
|
|
|
- <div class="info-item material-item">
|
|
|
- <div class="info-label">
|
|
|
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
|
- <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
|
|
|
- <rect x="7" y="7" width="10" height="10" rx="1" ry="1"></rect>
|
|
|
- </svg>
|
|
|
- 材质
|
|
|
- </div>
|
|
|
- <div class="info-content">
|
|
|
- <div class="material-list">
|
|
|
- @for (material of requirementKeyInfo.colorAtmosphere.materials; track material) {
|
|
|
- <span class="material-tag">{{ material }}</span>
|
|
|
- }
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- }
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 空间结构和材质权重并排布局 -->
|
|
|
- <div class="structure-weight-row">
|
|
|
- <!-- 空间结构 -->
|
|
|
- @if (requirementKeyInfo.spaceStructure.aspectRatio > 0) {
|
|
|
- <div class="info-item structure-item">
|
|
|
- <div class="info-label">
|
|
|
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
|
- <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
|
|
|
- <line x1="9" y1="9" x2="15" y2="15"></line>
|
|
|
- </svg>
|
|
|
- 空间结构
|
|
|
- </div>
|
|
|
- <div class="info-content">
|
|
|
- <div class="structure-details">
|
|
|
- <span class="structure-item">比例: {{ requirementKeyInfo.spaceStructure.aspectRatio.toFixed(1) }}</span>
|
|
|
- @if (requirementKeyInfo.spaceStructure.ceilingHeight > 0) {
|
|
|
- <span class="structure-item">层高: {{ requirementKeyInfo.spaceStructure.ceilingHeight }}m</span>
|
|
|
- }
|
|
|
- @if (requirementKeyInfo.spaceStructure.flowWidth > 0) {
|
|
|
- <span class="structure-item">流线宽度: {{ requirementKeyInfo.spaceStructure.flowWidth }}m</span>
|
|
|
- }
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- }
|
|
|
-
|
|
|
- <!-- 材质权重 -->
|
|
|
- @if (requirementKeyInfo.materialWeights.woodRatio > 0 || requirementKeyInfo.materialWeights.fabricRatio > 0 || requirementKeyInfo.materialWeights.metalRatio > 0) {
|
|
|
- <div class="info-item weight-item">
|
|
|
- <div class="info-label">
|
|
|
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
|
- <path d="M3 3v18h18"></path>
|
|
|
- <path d="M7 16l4-4 4 4 6-6"></path>
|
|
|
- </svg>
|
|
|
- 材质权重
|
|
|
- </div>
|
|
|
- <div class="info-content">
|
|
|
- <div class="weight-list">
|
|
|
- @if (requirementKeyInfo.materialWeights.woodRatio > 0) {
|
|
|
- <div class="weight-item">
|
|
|
- <span class="weight-label">木质</span>
|
|
|
- <span class="weight-value">{{ requirementKeyInfo.materialWeights.woodRatio }}%</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- @if (requirementKeyInfo.materialWeights.fabricRatio > 0) {
|
|
|
- <div class="weight-item">
|
|
|
- <span class="weight-label">布艺</span>
|
|
|
- <span class="weight-value">{{ requirementKeyInfo.materialWeights.fabricRatio }}%</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- @if (requirementKeyInfo.materialWeights.metalRatio > 0) {
|
|
|
- <div class="weight-item">
|
|
|
- <span class="weight-label">金属</span>
|
|
|
- <span class="weight-value">{{ requirementKeyInfo.materialWeights.metalRatio }}%</span>
|
|
|
- </div>
|
|
|
- }
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- }
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 预设氛围和小图时间并排布局 -->
|
|
|
- <div class="atmosphere-time-row">
|
|
|
- <!-- 预设氛围 -->
|
|
|
- @if (requirementKeyInfo.presetAtmosphere.name) {
|
|
|
- <div class="info-item atmosphere-item">
|
|
|
- <div class="info-label">
|
|
|
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
|
- <path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"></path>
|
|
|
- </svg>
|
|
|
- 预设氛围
|
|
|
- </div>
|
|
|
- <div class="info-content">
|
|
|
- <div class="atmosphere-info">
|
|
|
- <span class="atmosphere-name">{{ requirementKeyInfo.presetAtmosphere.name }}</span>
|
|
|
- @if (requirementKeyInfo.presetAtmosphere.colorTemp) {
|
|
|
- <span class="color-temp">{{ requirementKeyInfo.presetAtmosphere.colorTemp }}</span>
|
|
|
- }
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- }
|
|
|
-
|
|
|
- <!-- 小图时间 -->
|
|
|
- @if (getEstimatedSmallImageTime()) {
|
|
|
- <div class="info-item time-item">
|
|
|
- <div class="info-label">
|
|
|
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
|
- <circle cx="12" cy="12" r="10"></circle>
|
|
|
- <polyline points="12,6 12,12 16,14"></polyline>
|
|
|
- </svg>
|
|
|
- 小图时间
|
|
|
- </div>
|
|
|
- <div class="info-content">
|
|
|
- <span class="time-estimate">{{ getEstimatedSmallImageTime() }}</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- }
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 确认方案按钮 -->
|
|
|
- <div class="proposal-confirm-actions">
|
|
|
- <button class="confirm-proposal-btn"
|
|
|
- (click)="confirmProposal()"
|
|
|
- style="
|
|
|
- appearance: none !important;
|
|
|
- border: none !important;
|
|
|
- background: linear-gradient(135deg, #007aff 0%, #0066ff 50%, #0051d5 100%) !important;
|
|
|
- color: white !important;
|
|
|
- padding: 16px 40px !important;
|
|
|
- border-radius: 16px !important;
|
|
|
- font-size: 16px !important;
|
|
|
- font-weight: 600 !important;
|
|
|
- cursor: pointer !important;
|
|
|
- transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important;
|
|
|
- display: flex !important;
|
|
|
- align-items: center !important;
|
|
|
- gap: 10px !important;
|
|
|
- box-shadow: 0 8px 24px rgba(0, 122, 255, 0.25), 0 4px 12px rgba(0, 122, 255, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.2) !important;
|
|
|
- min-width: 180px !important;
|
|
|
- justify-content: center !important;
|
|
|
- position: relative !important;
|
|
|
- overflow: hidden !important;
|
|
|
- text-transform: none !important;
|
|
|
- letter-spacing: normal !important;
|
|
|
- line-height: normal !important;
|
|
|
- ">
|
|
|
- <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" style="color: white !important;">
|
|
|
- <polyline points="20,6 9,17 4,12"></polyline>
|
|
|
- </svg>
|
|
|
- 确认方案
|
|
|
- </button>
|
|
|
- </div>
|
|
|
- } @else {
|
|
|
- <div class="requirement-pending">
|
|
|
- <div class="pending-icon">
|
|
|
- <svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
|
- <circle cx="12" cy="12" r="10"></circle>
|
|
|
- <polyline points="12,6 12,12 16,14"></polyline>
|
|
|
- </svg>
|
|
|
- </div>
|
|
|
- <h5>等待需求确认完成</h5>
|
|
|
- <p>请先完成"流程进度 > 确认需求 > 需求沟通"四个流程,确认需求信息后方可查看。</p>
|
|
|
- <div class="progress-status">
|
|
|
- <span>当前进度: {{ getRequiredStagesProgress() }}%</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- }
|
|
|
</div>
|
|
|
} @else if (stage === '建模') {
|
|
|
<div class="upload-section">
|