迁移合作订单完整能力,并统一 AppRoleCode 角色权限与首页菜单展示。

新增 CooperationOrder 模块(双 Tab 列表、获客员绑定、主 Tab 扫码)、订单来源/带客单绑定及配套 API 测试;同步引入 roleCode 权限匹配与相关单元测试。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-29 13:33:00 +08:00
parent d310d26293
commit 1970572edd
66 changed files with 4247 additions and 201 deletions

View File

@ -15,15 +15,15 @@ final class HomeViewModelTests: XCTestCase {
func testBuildMenusClearsStaleMenusWhenCurrentRoleIsMissing() {
let viewModel = HomeViewModel()
let permissions = [
rolePermission(roleId: 1, permissions: [
rolePermission(roleCode: "photographer", roleId: 1, permissions: [
permission(id: 1, name: "消息中心", uri: "message_center")
])
]
viewModel.buildMenus(from: permissions, currentRoleId: 1)
viewModel.buildMenus(from: permissions, currentRoleCode: "photographer")
XCTAssertEqual(viewModel.menuItems.map(\.uri), ["message_center"])
viewModel.buildMenus(from: permissions, currentRoleId: 99)
viewModel.buildMenus(from: permissions, currentRoleCode: "unknown_role")
XCTAssertTrue(viewModel.menuItems.isEmpty)
}
@ -32,15 +32,15 @@ final class HomeViewModelTests: XCTestCase {
func testBuildMenusFallsBackToFirstRoleOnlyWhenCurrentRoleIsNil() {
let viewModel = HomeViewModel()
let permissions = [
rolePermission(roleId: 1, permissions: [
rolePermission(roleCode: "photographer", roleId: 1, permissions: [
permission(id: 1, name: "任务管理", uri: "task_management")
]),
rolePermission(roleId: 2, permissions: [
rolePermission(roleCode: "editor", roleId: 2, permissions: [
permission(id: 2, name: "消息中心", uri: "message_center")
])
]
viewModel.buildMenus(from: permissions, currentRoleId: nil)
viewModel.buildMenus(from: permissions, currentRoleCode: nil)
XCTAssertEqual(viewModel.menuItems.map(\.uri), ["task_management"])
}
@ -49,14 +49,14 @@ final class HomeViewModelTests: XCTestCase {
func testBuildMenusFlattensPermissionTree() {
let viewModel = HomeViewModel()
let permissions = [
rolePermission(roleId: 1, permissions: [
rolePermission(roleCode: "photographer", roleId: 1, permissions: [
permission(id: 1, name: "任务管理", uri: "task_management", children: [
permission(id: 2, name: "消息中心", uri: "message_center")
])
])
]
viewModel.buildMenus(from: permissions, currentRoleId: 1)
viewModel.buildMenus(from: permissions, currentRoleCode: "photographer")
XCTAssertEqual(viewModel.menuItems.map(\.uri), ["task_management", "message_center"])
}
@ -65,7 +65,7 @@ final class HomeViewModelTests: XCTestCase {
func testBuildMenusDeduplicatesKnownAndroidAliases() {
let viewModel = HomeViewModel()
let permissions = [
rolePermission(roleId: 1, permissions: [
rolePermission(roleCode: "photographer", roleId: 1, permissions: [
permission(id: 1, name: "项目管理", uri: "pm_manager"),
permission(id: 2, name: "项目管理旧入口", uri: "pm"),
permission(id: 3, name: "收款码", uri: "payment_code"),
@ -75,7 +75,7 @@ final class HomeViewModelTests: XCTestCase {
])
]
viewModel.buildMenus(from: permissions, currentRoleId: 1)
viewModel.buildMenus(from: permissions, currentRoleCode: "photographer")
XCTAssertEqual(viewModel.menuItems.map(\.uri), ["pm", "deposit_order_detail", "pm_manager", "payment_code"])
}
@ -84,22 +84,22 @@ final class HomeViewModelTests: XCTestCase {
func testBuildMenusSortsByPreferredOrder() {
let viewModel = HomeViewModel()
let permissions = [
rolePermission(roleId: 1, permissions: [
rolePermission(roleCode: "photographer", roleId: 1, permissions: [
permission(id: 1, name: "消息中心", uri: "message_center"),
permission(id: 2, name: "空间设置", uri: "space_settings"),
permission(id: 3, name: "钱包", uri: "wallet")
])
]
viewModel.buildMenus(from: permissions, currentRoleId: 1)
viewModel.buildMenus(from: permissions, currentRoleCode: "photographer")
XCTAssertEqual(viewModel.menuItems.map(\.uri), ["space_settings", "wallet", "message_center"])
}
///
private func rolePermission(roleId: Int, permissions: [PermissionItem]) -> RolePermissionResponse {
private func rolePermission(roleCode: String, roleId: Int, permissions: [PermissionItem]) -> RolePermissionResponse {
RolePermissionResponse(
role: RoleInfo(id: roleId, name: "角色\(roleId)", permission: permissions),
role: RoleInfo(id: roleId, name: "角色\(roleId)", roleCode: roleCode, permission: permissions),
scenic: []
)
}