Add instant payment collection flow aligned with Android.

Implement收款详情与收款记录 pages with pay-code API, QR generation, amount setting, and record grouping so merchants can collect payments from the home quick action.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-07 09:29:03 +08:00
parent 731de7d7f0
commit d8329d19fd
17 changed files with 1548 additions and 1 deletions

View File

@ -0,0 +1,136 @@
//
// PaymentRecordGroupView.swift
// suixinkan
//
import SnapKit
import UIKit
///
final class PaymentRecordGroupView: UIView {
private let headerStack = UIStackView()
private let dateLabel = UILabel()
private let summaryLabel = UILabel()
private let itemsStack = UIStackView()
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func apply(group: RepaymentCollectionRecordGroup) {
dateLabel.text = group.analyse.date
summaryLabel.text = "共收款\(group.analyse.orderCount)笔, 当日收益:¥\(group.analyse.orderAmountSum)"
itemsStack.arrangedSubviews.forEach {
itemsStack.removeArrangedSubview($0)
$0.removeFromSuperview()
}
group.items.forEach { item in
let card = PaymentRecordItemView()
card.apply(item: item)
itemsStack.addArrangedSubview(card)
}
}
private func setupUI() {
headerStack.axis = .horizontal
headerStack.alignment = .center
headerStack.distribution = .equalSpacing
dateLabel.font = .systemFont(ofSize: 14)
dateLabel.textColor = AppColor.textTertiary
summaryLabel.font = .systemFont(ofSize: 14)
summaryLabel.textColor = UIColor(hex: 0x4B5563)
summaryLabel.textAlignment = .right
summaryLabel.numberOfLines = 2
itemsStack.axis = .vertical
itemsStack.spacing = AppSpacing.sm
addSubview(headerStack)
addSubview(itemsStack)
headerStack.addArrangedSubview(dateLabel)
headerStack.addArrangedSubview(summaryLabel)
headerStack.snp.makeConstraints { make in
make.top.leading.trailing.equalToSuperview()
}
itemsStack.snp.makeConstraints { make in
make.top.equalTo(headerStack.snp.bottom).offset(6)
make.leading.trailing.bottom.equalToSuperview()
}
}
}
///
final class PaymentRecordItemView: UIView {
private let amountLabel = UILabel()
private let orderNumberLabel = UILabel()
private let phoneLabel = UILabel()
private let timeLabel = UILabel()
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func apply(item: RepaymentCollectionRecordItem) {
amountLabel.text = "¥ \(item.orderAmount)"
orderNumberLabel.text = item.orderNumber
phoneLabel.text = item.userPhone
timeLabel.text = item.createTime
}
private func setupUI() {
backgroundColor = .white
layer.borderColor = UIColor(hex: 0xF3F4F6).cgColor
layer.borderWidth = 1
layer.cornerRadius = AppRadius.lg
amountLabel.font = .systemFont(ofSize: 18, weight: .bold)
amountLabel.textColor = AppColor.primary
orderNumberLabel.font = .systemFont(ofSize: 14)
orderNumberLabel.textColor = AppColor.textSecondary
orderNumberLabel.textAlignment = .right
phoneLabel.font = .systemFont(ofSize: 14)
phoneLabel.textColor = AppColor.textSecondary
timeLabel.font = .systemFont(ofSize: 14)
timeLabel.textColor = AppColor.textSecondary
timeLabel.textAlignment = .right
let topRow = UIStackView(arrangedSubviews: [amountLabel, orderNumberLabel])
topRow.axis = .horizontal
topRow.distribution = .fillEqually
let bottomRow = UIStackView(arrangedSubviews: [phoneLabel, timeLabel])
bottomRow.axis = .horizontal
bottomRow.distribution = .fillEqually
let stack = UIStackView(arrangedSubviews: [topRow, bottomRow])
stack.axis = .vertical
stack.spacing = AppSpacing.xs
addSubview(stack)
stack.snp.makeConstraints { make in
make.edges.equalToSuperview().inset(AppSpacing.md)
}
}
}