拆分宣传页视图并扩充 Mock 数据,合作订单支持获客员备注名并修复线索图片网格尺寸。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-02 17:43:04 +08:00
parent 1b1e93b9ca
commit 328c4321f4
41 changed files with 2529 additions and 1436 deletions

View File

@ -0,0 +1,118 @@
//
// ScenicPromotionQueuePanelView.swift
// suixinkan
//
// Created by Codex on 2026/7/2.
//
import SwiftUI
///
struct ScenicPromotionQueuePanelView: View {
let queue: ScenicPromotionQueueInfo?
var body: some View {
Group {
if let queue {
HStack(spacing: 10) {
ScenicPromotionQueueSideView(
icon: "camera.aperture",
title: "下一位",
value: queue.nextNumber,
tint: Color(hex: 0x197BFF)
)
Divider()
.frame(height: 52)
VStack(spacing: 0) {
Text("当前叫号")
.font(.system(size: 15, weight: .bold))
.foregroundStyle(Color(hex: 0x123F86))
Text(queue.currentNumber)
.font(.system(size: 38, weight: .heavy))
.foregroundStyle(Color(hex: 0x197BFF))
.minimumScaleFactor(0.55)
}
.frame(maxWidth: .infinity)
Divider()
.frame(height: 52)
ScenicPromotionQueueSideView(
icon: "person.2.fill",
title: "拍摄用时",
value: queue.shootingDuration,
tint: Color(hex: 0x7A4DFF)
)
}
.padding(.horizontal, 14)
.padding(.vertical, 7)
} else {
HStack(spacing: 18) {
Image(systemName: "list.clipboard")
.font(.system(size: 46, weight: .semibold))
.foregroundStyle(Color(hex: 0x2F80ED))
.frame(width: 92, height: 92)
.background(Color(hex: 0xEAF4FF), in: RoundedRectangle(cornerRadius: 18))
VStack(alignment: .leading, spacing: 8) {
Text("当前暂无排队信息")
.font(.system(size: 22, weight: .heavy))
.foregroundStyle(Color(hex: 0x123F86))
Text("可先浏览景点样片,稍后再查看排队动态")
.font(.system(size: 14, weight: .medium))
.foregroundStyle(Color(hex: 0x5272A5))
}
Spacer(minLength: 0)
}
.padding(18)
}
}
.frame(maxWidth: .infinity)
.background(.white.opacity(0.86), in: RoundedRectangle(cornerRadius: 18))
.overlay(
RoundedRectangle(cornerRadius: 18)
.stroke(.white.opacity(0.9), lineWidth: 1)
)
.shadow(color: Color(hex: 0x0D47A1, alpha: 0.10), radius: 14, y: 6)
}
}
///
struct ScenicPromotionQueueSideView: View {
let icon: String
let title: String
let value: String
let tint: Color
var body: some View {
HStack(spacing: 7) {
Image(systemName: icon)
.font(.system(size: 18, weight: .semibold))
.foregroundStyle(tint)
.frame(width: 34, height: 34)
.background(tint.opacity(0.13), in: Circle())
VStack(alignment: .leading, spacing: 3) {
Text(title)
.font(.system(size: 11, weight: .medium))
.foregroundStyle(Color(hex: 0x113B79))
Text(value)
.font(.system(size: 13, weight: .heavy))
.foregroundStyle(tint)
.lineLimit(2)
.fixedSize(horizontal: false, vertical: true)
.minimumScaleFactor(0.76)
}
}
.frame(maxWidth: .infinity, alignment: .leading)
}
}
#if DEBUG
#Preview("叫号面板") {
ScenicPromotionQueuePanelView(queue: ScenicPromotionPreviewSupport.sampleQueue)
.padding(.horizontal, 20)
}
#Preview("叫号面板-空") {
ScenicPromotionQueuePanelView(queue: nil)
.padding(.horizontal, 20)
}
#endif