65.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--账本合并

有时我们需要把几个账本合并到一个账本中,这样就可以在一个账本中查看所有的交易记录。那么,在本片文章中我们就来一起实现这个功能。

一、需求分析

用户需要能够将多个账本中的交易记录合并到一个目标账本中,以便在统一的视图下管理和查看所有交易数据。用户首先选择一个目标账本作为合并的目的地,然后选择一个或多个源账本,系统将源账本中的所有交易记录复制到目标账本中。

在这里我们暂时不考虑合并后可能出现的重复交易记录问题,因为这个功能属于一个较为复杂的功能,因此我们会把这个功能放在进阶的阶段去讲解具体怎么实现。

二、功能设计

我们现在已经了解了需求,接下来我们来设计一下这个功能。这个功能很简单,只需要一个接口,一个方法就可以实现。

我们在 AccountBookController 中添加一个新的接口 MergeAccountBooks,该方法接受一个目标账本 ID 和一个源账本 ID 列表,代码如下:

csharp 复制代码
///<summary>
///账本合并
///</summary>
///<param name="request">账本合并请求</param>
[HttpPost("merge")]
public ActionResult<bool> MergeAccountBooks([FromBody] AccountBookMergeRequest request)
{
    _accountBookServer.Merge(request);
    return Ok();
}

接下来我们需要定义 AccountBookMergeRequest 类来封装请求参数:

csharp 复制代码
namespace SP.FinanceService.Models.Request
{
    /// <summary>
    /// 账本合并请求模型
    /// </summary>
    public class AccountBookMergeRequest
    {
        /// <summary>
        /// 目标账本ID
        /// </summary>
        public long TargetAccountBookId { get; set; }
        /// <summary>
        /// 源账本ID列表
        /// </summary>
        public List<long> SourceAccountBookIds { get; set; } = new();
    }
}

接下来我们在 IAccountBookServer 中新增 Merge 方法,并在 AccountBookServerImpl 类中实现该方法:

csharp 复制代码
// IAccountBookServer.cs
/// <summary>
/// 合并账本
/// </summary>
/// <param name="request"></param>
void Merge(AccountBookMergeRequest request);

// AccountBookServerImpl.cs
/// <summary>
/// 合并账本
/// </summary>
/// <param name="request"></param>
/// <exception cref="NotImplementedException"></exception>
public void Merge(AccountBookMergeRequest request)
{
    // 目标账本是否存在
    bool targetExist = Exist(request.TargetAccountBookId);
    if (targetExist)
    {
        throw new NotFoundException($"账本不存在,ID: {request.TargetAccountBookId}");
    }

    // 来源账本是否存在
    List<long> sourceIds = request.SourceAccountBookIds;
    List<long> notExistIds = BatchQuery(sourceIds);
    if (notExistIds.Any())
    {
        throw new NotFoundException($"以下账本不存在,ID: {string.Join(", ", notExistIds)}");
    }

    // 迁移账本下的记录
    // 规则:源账本的记录迁移到目标账本下,修改账本ID为目标账本ID
    var accountingServer = _serviceProvider.GetRequiredService<IAccountingServer>();
    accountingServer.MigrateAccountBook(request.TargetAccountBookId, sourceIds);
}

在上面的代码中,我们首先检查目标账本是否存在,如果不存在则抛出异常。接着检查源账本是否存在,如果有不存在的账本也抛出异常。最后,我们调用 IAccountingServerMigrateAccountBook 方法来迁移源账本下的记录到目标账本下。

在合并前,系统需要通过 Exist 方法确认目标账本存在,若不存在则立即抛出 NotFoundException 异常,中断合并流程。随后使用 BatchQuery 方法对所有源账本进行批量查询,返回不存在的账本ID列表。这种方式比逐个验证更高效,特别是在源账本数量较多时。

核心的记录迁移操作通过 MigrateAccountBook 方法实现,将源账本中的所有交易记录转移到目标账本,其本质是更新这些记录的 AccountBookId 字段为目标账本ID,从而实现记录的归集。在实现此方法时,应当使用数据库事务确保整个迁移过程的原子性,避免数据不一致。对于大量交易记录的迁移场景,应使用批量更新操作而非逐条更新,以提高性能并减少数据库压力。

三、总结

这篇文章我们介绍了如何实现账本合并功能。通过设计一个简单的接口和方法,我们可以将多个账本中的交易记录合并到一个目标账本中,方便用户统一管理和查看所有交易数据。在实际应用中,还可以根据需求进一步完善该功能,例如处理重复交易记录等问题。

相关推荐
缺点内向2 小时前
C#: 告别繁琐!轻松移除Word文档中的文本与图片水印
c#·自动化·word·.net
2501_930707783 小时前
使用 C# .NET 从 PowerPoint 演示文稿中提取背景图片
c#·powerpoint·.net
向上的车轮8 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
波波0079 小时前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
波波0071 天前
每日一题:中间件是如何工作的?
中间件·.net·面试题
无风听海1 天前
.NET 10之可空引用类型
数据结构·.net
码云数智-园园1 天前
基于 JSON 配置的 .NET 桌面应用自动更新实现指南
.net
无风听海1 天前
.NET 10 之dotnet run的功能
.net
岩屿1 天前
Ubuntu下安装Docker并部署.NET API(二)
运维·docker·容器·.net
码云数智-大飞1 天前
.NET 中高效实现 List 集合去重的多种方法详解
.net