Initial commit: suixinkan_ios UIKit rewrite project.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@ -0,0 +1,149 @@
|
||||
//
|
||||
// ScheduleViewControllers.swift
|
||||
// suixinkan
|
||||
//
|
||||
// Created by Codex on 2026/6/26.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
/// 排班管理页。
|
||||
final class ScheduleManagementViewController: ModuleTableViewController {
|
||||
private let viewModel = ScheduleManagementViewModel()
|
||||
|
||||
override func viewDidLoad() {
|
||||
title = "排班管理"
|
||||
navigationItem.rightBarButtonItems = [
|
||||
UIBarButtonItem(title: "新增", style: .plain, target: self, action: #selector(addSchedule)),
|
||||
UIBarButtonItem(title: "下月", style: .plain, target: self, action: #selector(nextMonth))
|
||||
]
|
||||
navigationItem.leftBarButtonItem = UIBarButtonItem(
|
||||
title: "上月",
|
||||
style: .plain,
|
||||
target: self,
|
||||
action: #selector(previousMonth)
|
||||
)
|
||||
super.viewDidLoad()
|
||||
wireViewModel(viewModel) { [weak self] in self?.updateTitle() }
|
||||
}
|
||||
|
||||
override func tableRowCount() -> Int {
|
||||
viewModel.items.count
|
||||
}
|
||||
|
||||
override func configureCell(_ cell: TitleSubtitleTableViewCell, at indexPath: IndexPath) {
|
||||
let item = viewModel.items[indexPath.row]
|
||||
cell.configure(
|
||||
title: item.name,
|
||||
subtitle: "\(item.startTime) - \(item.endTime)",
|
||||
detail: item.orderNumber ?? item.remark
|
||||
)
|
||||
}
|
||||
|
||||
override func didSelectTableRow(at indexPath: IndexPath) {
|
||||
let item = viewModel.items[indexPath.row]
|
||||
let alert = UIAlertController(title: item.name, message: "删除该排班?", preferredStyle: .alert)
|
||||
alert.addAction(UIAlertAction(title: "取消", style: .cancel))
|
||||
alert.addAction(UIAlertAction(title: "删除", style: .destructive) { [weak self] _ in
|
||||
guard let self else { return }
|
||||
Task { await self.viewModel.delete(item: item, api: self.services.scheduleAPI, scenicId: self.services.currentScenicId) }
|
||||
})
|
||||
present(alert, animated: true)
|
||||
}
|
||||
|
||||
override func reloadContent() async {
|
||||
await viewModel.reload(api: services.scheduleAPI, scenicId: services.currentScenicId)
|
||||
updateTitle()
|
||||
}
|
||||
|
||||
private func updateTitle() {
|
||||
let month = viewModel.monthDate.scheduleYearMonthText
|
||||
title = "排班 \(month)"
|
||||
}
|
||||
|
||||
@objc private func previousMonth() {
|
||||
Task { await viewModel.previousMonth(api: services.scheduleAPI, scenicId: services.currentScenicId) }
|
||||
}
|
||||
|
||||
@objc private func nextMonth() {
|
||||
Task { await viewModel.nextMonth(api: services.scheduleAPI, scenicId: services.currentScenicId) }
|
||||
}
|
||||
|
||||
@objc private func addSchedule() {
|
||||
navigationController?.pushViewController(ScheduleAddViewController(), animated: true)
|
||||
}
|
||||
}
|
||||
|
||||
extension ScheduleManagementViewModel: ViewModelBindable {}
|
||||
|
||||
/// 新增排班页。
|
||||
final class ScheduleAddViewController: ModuleTableViewController {
|
||||
private let viewModel = ScheduleAddViewModel()
|
||||
private let nameField = UITextField()
|
||||
private let remarkField = UITextField()
|
||||
|
||||
override func viewDidLoad() {
|
||||
title = "新增排班"
|
||||
navigationItem.rightBarButtonItem = UIBarButtonItem(
|
||||
title: "提交",
|
||||
style: .done,
|
||||
target: self,
|
||||
action: #selector(submit)
|
||||
)
|
||||
super.viewDidLoad()
|
||||
wireViewModel(viewModel) { }
|
||||
setupFormHeader()
|
||||
}
|
||||
|
||||
private func setupFormHeader() {
|
||||
nameField.placeholder = "日程名称"
|
||||
nameField.borderStyle = .roundedRect
|
||||
remarkField.placeholder = "备注"
|
||||
remarkField.borderStyle = .roundedRect
|
||||
let stack = UIStackView(arrangedSubviews: [nameField, remarkField])
|
||||
stack.axis = .vertical
|
||||
stack.spacing = 8
|
||||
stack.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: 96)
|
||||
stack.layoutMargins = UIEdgeInsets(top: 12, left: 16, bottom: 12, right: 16)
|
||||
stack.isLayoutMarginsRelativeArrangement = true
|
||||
tableView.tableHeaderView = stack
|
||||
}
|
||||
|
||||
override func tableRowCount() -> Int {
|
||||
viewModel.availableOrders.count
|
||||
}
|
||||
|
||||
override func configureCell(_ cell: TitleSubtitleTableViewCell, at indexPath: IndexPath) {
|
||||
let order = viewModel.availableOrders[indexPath.row]
|
||||
let selected = viewModel.draft.selectedOrder?.orderNumber == order.orderNumber
|
||||
cell.configure(title: order.orderNumber, subtitle: order.projectName, detail: selected ? "已选择" : nil)
|
||||
cell.accessoryType = selected ? .checkmark : .none
|
||||
}
|
||||
|
||||
override func didSelectTableRow(at indexPath: IndexPath) {
|
||||
viewModel.draft.selectedOrder = viewModel.availableOrders[indexPath.row]
|
||||
reloadTable()
|
||||
}
|
||||
|
||||
override func reloadContent() async {
|
||||
await viewModel.loadOrders(api: services.scheduleAPI, scenicId: services.currentScenicId)
|
||||
}
|
||||
|
||||
@objc private func submit() {
|
||||
viewModel.draft.name = nameField.text ?? ""
|
||||
viewModel.draft.remark = remarkField.text ?? ""
|
||||
Task {
|
||||
let start = Date()
|
||||
let end = Calendar.current.date(byAdding: .hour, value: 1, to: start) ?? start
|
||||
let success = await viewModel.submit(
|
||||
api: services.scheduleAPI,
|
||||
scenicId: services.currentScenicId,
|
||||
startDate: start,
|
||||
endDate: end
|
||||
)
|
||||
if success { navigationController?.popViewController(animated: true) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension ScheduleAddViewModel: ViewModelBindable {}
|
||||
Reference in New Issue
Block a user