Files
29WxOrder/OrderSupportTicket/ViewModels/ChatMessageViewModel.cs
T
2026-10-17 18:18:05 +08:00

136 lines
3.4 KiB
C#

using OrderSupportTicket.Models.Api;
using System;
using System.Globalization;
using WPFCommon.Models;
namespace OrderSupportTicket.ViewModels;
/// <summary>
/// 工单留言板中的单条消息。
/// </summary>
public sealed class ChatMessageViewModel : BindableBaseEx
{
private string _messageId;
private int _sequenceNo;
private string _senderType;
private string _senderDisplayName;
private string _content;
private bool _isRecalled;
private DateTimeOffset _createdAt;
public ChatMessageViewModel(TicketMessageDto dto)
{
if (dto == null)
throw new ArgumentNullException(nameof(dto));
MessageId = dto.MessageId;
SequenceNo = dto.SequenceNo;
SenderType = dto.SenderType;
IsRecalled = dto.Recalled;
SenderDisplayName = string.IsNullOrWhiteSpace(dto.SenderName)
? (IsCustomer ? "我" : "客服")
: dto.SenderName;
Content = dto.Recalled
? "该消息已撤回"
: (dto.Text ?? string.Empty);
CreatedAt = ParseTimestamp(dto.CreatedAt);
}
/// <summary>
/// 消息唯一 ID。
/// </summary>
public string MessageId
{
get => _messageId;
private set => SetValue(ref _messageId, value);
}
/// <summary>
/// 工单内连续递增的消息序号。
/// </summary>
public int SequenceNo
{
get => _sequenceNo;
private set => SetValue(ref _sequenceNo, value);
}
/// <summary>
/// 消息发送方类型。
/// </summary>
public string SenderType
{
get => _senderType;
private set
{
if (SetValue(ref _senderType, value))
RaisePropertyChanged(nameof(IsCustomer));
}
}
/// <summary>
/// 消息发送方显示名称。
/// </summary>
public string SenderDisplayName
{
get => _senderDisplayName;
private set => SetValue(ref _senderDisplayName, value);
}
/// <summary>
/// 消息展示内容;撤回消息显示固定提示文本。
/// </summary>
public string Content
{
get => _content;
private set => SetValue(ref _content, value);
}
/// <summary>
/// 消息是否已撤回。
/// </summary>
public bool IsRecalled
{
get => _isRecalled;
private set => SetValue(ref _isRecalled, value);
}
/// <summary>
/// 消息发送时间。
/// </summary>
public DateTimeOffset CreatedAt
{
get => _createdAt;
private set
{
if (SetValue(ref _createdAt, value))
RaisePropertyChanged(nameof(CreatedAtText));
}
}
/// <summary>
/// 当前消息是否由客户发送。
/// </summary>
public bool IsCustomer =>
string.Equals(SenderType, "customer", StringComparison.OrdinalIgnoreCase);
/// <summary>
/// 适合聊天界面展示的本地时间文本。
/// </summary>
public string CreatedAtText =>
CreatedAt == default
? string.Empty
: CreatedAt.ToLocalTime().ToString("MM-dd HH:mm", CultureInfo.CurrentCulture);
private static DateTimeOffset ParseTimestamp(string value)
{
if (DateTimeOffset.TryParse(
value,
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal,
out var parsed))
{
return parsed;
}
return default;
}
}