news 2026/4/16 17:42:30

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
65.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--账本合并

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

一、需求分析

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

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

二、功能设计

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

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

///<summary>///账本合并///</summary>///<param name="request">账本合并请求</param>[HttpPost("merge")]publicActionResult<bool>MergeAccountBooks([FromBody]AccountBookMergeRequestrequest){_accountBookServer.Merge(request);returnOk();}

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

namespaceSP.FinanceService.Models.Request{/// <summary>/// 账本合并请求模型/// </summary>publicclassAccountBookMergeRequest{/// <summary>/// 目标账本ID/// </summary>publiclongTargetAccountBookId{get;set;}/// <summary>/// 源账本ID列表/// </summary>publicList<long>SourceAccountBookIds{get;set;}=new();}}

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

// IAccountBookServer.cs/// <summary>/// 合并账本/// </summary>/// <param name="request"></param>voidMerge(AccountBookMergeRequestrequest);// AccountBookServerImpl.cs/// <summary>/// 合并账本/// </summary>/// <param name="request"></param>/// <exception cref="NotImplementedException"></exception>publicvoidMerge(AccountBookMergeRequestrequest){// 目标账本是否存在booltargetExist=Exist(request.TargetAccountBookId);if(targetExist){thrownewNotFoundException($"账本不存在,ID:{request.TargetAccountBookId}");}// 来源账本是否存在List<long>sourceIds=request.SourceAccountBookIds;List<long>notExistIds=BatchQuery(sourceIds);if(notExistIds.Any()){thrownewNotFoundException($"以下账本不存在,ID:{string.Join(", ",notExistIds)}");}// 迁移账本下的记录// 规则:源账本的记录迁移到目标账本下,修改账本ID为目标账本IDvaraccountingServer=_serviceProvider.GetRequiredService<IAccountingServer>();accountingServer.MigrateAccountBook(request.TargetAccountBookId,sourceIds);}

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

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

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

三、总结

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 15:32:10

uos server 1070e部署OpenStack基础篇-上篇

哈哈&#xff0c;今天开始部署服务器应用中最麻烦的一个开源软件OpenStack&#xff0c;尤其在国产化OS上面部署OpenStack的材料太少了&#xff0c;我写两篇记文章记录下在UOS的服务器1070e版本上完整的部署起OpenStack来&#xff0c;运行一个基础环境的OpenStack最小需要两个节…

作者头像 李华
网站建设 2026/4/16 12:22:20

Elsevier Tracker:科研投稿进度智能监控终极指南

Elsevier Tracker&#xff1a;科研投稿进度智能监控终极指南 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 还在为追踪Elsevier期刊投稿状态而烦恼吗&#xff1f;这款免费的Chrome插件将彻底改变您的科研工作方式&…

作者头像 李华
网站建设 2026/4/16 13:32:37

Vue3组件通信的实战指南

本文将拆解Vue3的7种通信方式&#xff0c;结合电商、后台管理等真实场景&#xff0c;教你“父子用Props&#xff0c;跨层用provide&#xff0c;全局用Pinia”的黄金法则。一、父子组件通信&#xff1a;Props/Emit/v-model1. Props&#xff1a;父传子的“单向快递”核心场景&…

作者头像 李华
网站建设 2026/4/16 13:36:40

NoFences:开源免费的桌面管理终极解决方案

NoFences&#xff1a;开源免费的桌面管理终极解决方案 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences NoFences是一个基于C#开发的开源桌面管理工具&#xff0c;为Windows用户…

作者头像 李华