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)
|
|
}
|
|
}
|