129 lines
4.5 KiB
Swift
129 lines
4.5 KiB
Swift
//
|
||
// StatisticsSummaryCardView.swift
|
||
// suixinkan
|
||
//
|
||
|
||
import SnapKit
|
||
import UIKit
|
||
|
||
/// 数据统计汇总卡片,包含日期行、周期 chip 与 5 张指标卡。
|
||
final class StatisticsSummaryCardView: UIView {
|
||
|
||
var onPeriodSelected: ((String) -> Void)?
|
||
|
||
private let datePrefixLabel = UILabel()
|
||
private let dateValueLabel = UILabel()
|
||
private let periodStack = UIStackView()
|
||
private var periodButtons: [StatisticsPeriodButton] = []
|
||
|
||
private let totalAmountCard = StatisticsStatCardView(
|
||
title: "订单总金额",
|
||
valueColor: AppColor.online,
|
||
backgroundColor: AppColor.successBackground,
|
||
iconName: "icon_data_statistics_total_amount"
|
||
)
|
||
private let totalOrderCard = StatisticsStatCardView(
|
||
title: "订单总数",
|
||
valueColor: UIColor(hex: 0x7F00FF),
|
||
backgroundColor: UIColor(hex: 0xEBD8FF),
|
||
iconName: "icon_data_statistics_total_order"
|
||
)
|
||
private let receivedCard = StatisticsStatCardView(
|
||
title: "实收金额",
|
||
valueColor: AppColor.online,
|
||
backgroundColor: AppColor.warningBackground,
|
||
iconName: "icon_data_statistics_get_amount"
|
||
)
|
||
private let averageCard = StatisticsStatCardView(
|
||
title: "客单价",
|
||
valueColor: AppColor.primary,
|
||
backgroundColor: AppColor.primaryLight,
|
||
iconName: "icon_data_statistics_average_amount"
|
||
)
|
||
private let refundCard = StatisticsStatCardView(
|
||
title: "退款金额",
|
||
valueColor: AppColor.danger,
|
||
backgroundColor: AppColor.dangerBackground,
|
||
iconName: "icon_data_statistics_refund_amount"
|
||
)
|
||
|
||
override init(frame: CGRect) {
|
||
super.init(frame: frame)
|
||
setupUI()
|
||
}
|
||
|
||
@available(*, unavailable)
|
||
required init?(coder: NSCoder) {
|
||
fatalError("init(coder:) has not been implemented")
|
||
}
|
||
|
||
func apply(selectedPeriod: String, selectedPeriodTime: String, summary: StatisticsSummaryResponse?) {
|
||
dateValueLabel.text = selectedPeriodTime
|
||
periodButtons.forEach { $0.isSelected = $0.periodTitle == selectedPeriod }
|
||
|
||
totalAmountCard.configure(value: "¥\(summary?.orderAmountSum ?? "0")")
|
||
totalOrderCard.configure(value: "\(summary?.orderCount ?? 0)单")
|
||
receivedCard.configure(value: "¥\(summary?.receivedAmountSum ?? "0")")
|
||
averageCard.configure(value: "¥\(summary?.orderPriceAvg ?? "0")")
|
||
refundCard.configure(value: "¥\(summary?.refundAmountSum ?? "0")")
|
||
}
|
||
|
||
private func setupUI() {
|
||
backgroundColor = AppColor.cardBackground
|
||
layer.cornerRadius = AppRadius.lg
|
||
clipsToBounds = true
|
||
|
||
datePrefixLabel.text = "已选日期:"
|
||
datePrefixLabel.font = .app(.body)
|
||
datePrefixLabel.textColor = AppColor.textPrimary
|
||
|
||
dateValueLabel.font = .app(.body)
|
||
dateValueLabel.textColor = AppColor.primary
|
||
dateValueLabel.numberOfLines = 1
|
||
|
||
periodStack.axis = .horizontal
|
||
periodStack.distribution = .equalSpacing
|
||
periodStack.alignment = .fill
|
||
|
||
StatisticsSummaryPeriod.allCases.forEach { period in
|
||
let button = StatisticsPeriodButton()
|
||
button.periodTitle = period.rawValue
|
||
button.addTarget(self, action: #selector(periodTapped(_:)), for: .touchUpInside)
|
||
periodButtons.append(button)
|
||
periodStack.addArrangedSubview(button)
|
||
}
|
||
|
||
let row1 = UIStackView(arrangedSubviews: [totalOrderCard, receivedCard])
|
||
row1.axis = .horizontal
|
||
row1.spacing = AppSpacing.sm
|
||
row1.distribution = .fillEqually
|
||
|
||
let row2 = UIStackView(arrangedSubviews: [averageCard, refundCard])
|
||
row2.axis = .horizontal
|
||
row2.spacing = AppSpacing.sm
|
||
row2.distribution = .fillEqually
|
||
|
||
let cardStack = UIStackView(arrangedSubviews: [totalAmountCard, row1, row2])
|
||
cardStack.axis = .vertical
|
||
cardStack.spacing = AppSpacing.sm
|
||
|
||
let dateRow = UIStackView(arrangedSubviews: [datePrefixLabel, dateValueLabel, UIView()])
|
||
dateRow.axis = .horizontal
|
||
dateRow.alignment = .center
|
||
dateRow.spacing = 0
|
||
|
||
let contentStack = UIStackView(arrangedSubviews: [dateRow, periodStack, cardStack])
|
||
contentStack.axis = .vertical
|
||
contentStack.spacing = AppSpacing.sm
|
||
|
||
addSubview(contentStack)
|
||
contentStack.snp.makeConstraints { make in
|
||
make.edges.equalToSuperview().inset(AppSpacing.md)
|
||
}
|
||
}
|
||
|
||
@objc private func periodTapped(_ sender: StatisticsPeriodButton) {
|
||
onPeriodSelected?(sender.periodTitle)
|
||
}
|
||
}
|