feat: add AI retouch task center

This commit is contained in:
2026-08-14 15:06:57 +08:00
parent 0f3b26991e
commit 30bfe0313f
26 changed files with 3679 additions and 50 deletions
@@ -178,6 +178,44 @@ final class MessageCenterViewModelTests: XCTestCase {
XCTAssertEqual(failureMessage, "删除失败: server down")
}
func testAIRetouchMessageExposesTaskActionAndParsesDirectBatchId() {
let message = makeMessage(
id: 14,
type: 14,
extraData: ["ai_retouch_batch_id": .number(59)]
)
let viewModel = MessageDetailViewModel(message: message)
XCTAssertTrue(viewModel.showsAIRetouchTaskAction)
XCTAssertEqual(viewModel.aiRetouchBatchId, 59)
}
func testAIRetouchMessageParsesNestedStringBatchIdAndFallsBackWhenInvalid() {
let nested = makeMessage(
id: 15,
type: 14,
extraData: ["data": .object(["ai_retouch_batch_id": .string(" 61 ")])]
)
let wrapped = makeMessage(
id: 17,
type: 14,
extraData: ["data": .string(#"{"ai_retouch_batch_id":63}"#)]
)
let missing = makeMessage(id: 16, type: 14, extraData: [:])
let manualRetouch = makeMessage(
id: 10,
type: 10,
extraData: ["ai_retouch_batch_id": .number(59)]
)
XCTAssertEqual(MessageDetailViewModel(message: nested).aiRetouchBatchId, 61)
XCTAssertEqual(MessageDetailViewModel(message: wrapped).aiRetouchBatchId, 63)
XCTAssertTrue(MessageDetailViewModel(message: missing).showsAIRetouchTaskAction)
XCTAssertNil(MessageDetailViewModel(message: missing).aiRetouchBatchId)
XCTAssertFalse(MessageDetailViewModel(message: manualRetouch).showsAIRetouchTaskAction)
XCTAssertNil(MessageDetailViewModel(message: manualRetouch).aiRetouchBatchId)
}
}
@MainActor
@@ -226,12 +264,17 @@ private struct TestError: LocalizedError {
var errorDescription: String? { message }
}
private func makeMessage(id: Int, isRead: Bool = false) -> MessageItem {
private func makeMessage(
id: Int,
isRead: Bool = false,
type: Int = 1,
extraData: [String: MessageJSONValue]? = nil
) -> MessageItem {
MessageItem(
id: id,
receiverId: 1,
receiverType: "staff",
type: 1,
type: type,
typeName: "系统通知",
title: "系统通知",
content: "消息内容",
@@ -240,6 +283,7 @@ private func makeMessage(id: Int, isRead: Bool = false) -> MessageItem {
readAt: "",
pushChannel: 1,
pushChannelName: "站内信",
extraData: extraData,
createdAt: "2026-07-09 10:00:00",
updatedAt: "2026-07-09 10:00:00"
)