首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >会计系统领域驱动设计

会计系统领域驱动设计
EN

Stack Overflow用户
提问于 2021-04-05 13:28:55
回答 2查看 412关注 0票数 1

我正在为我正在开发的会计系统遵循DDD方法。

有两个部分(见下面的域):

  1. 创建事务:当现金从Ledger转移到客户帐户,或者从一个Ledger转移到另一个Ledger时,事务(AccountingTransaction)作为父事务(聚合根)创建。事务可以是多腿的,即事务(AccountingTransaction)可以有多个LedgerTransaction或CashTransaction.
  2. 对账:我需要每天在每个分类账中匹配贷方和借方。

我的域是这样的:

  1. AccountingTransaction是聚合根。
  2. LedgerTransaction和CashTransaction是AccountingTransaction的子实体。
  3. AccountingTransaction将有一个CashTransactions和LedgerTransactions的列表。
  4. Ledger是聚合根。
代码语言:javascript
复制
 public class AccountingTransaction : AggregateRoot
    {
        public string AccountingTransactionId { get; private set; }
        public TransactionStatus TransactionStatus { get; private set; } //enum
        
        private List<CashTransaction> _cashTransactions = new List<CashTransaction>();
        public IReadOnlyList<CashTransaction> CashTransactions => new ReadOnlyCollection<CashTransaction>(_cashTransactions);
        private List<LedgerTransaction> _ledgerTransactions = new List<LedgerTransaction>();
        public IReadOnlyList<LedgerTransaction> LedgerTransactions => new ReadOnlyCollection<LedgerTransaction>(_ledgerTransactions);
        private AccountingTransaction(string transactionId, List<CashTransaction> cashTransactions, List<LedgerTransaction> ledgerTransactions, TransactionStatus transactionStatus)
        {
            //Code omitted for brevity
        }
        public static IResult<AccountingTransaction> CreateTransaction(string transactionId, List<CashTransaction> cashTransactions, List<LedgerTransaction> ledgerTransactions, List<ClientAccount> clientAccounts, List<Ledger> ledgerAccounts)
        {
            
            //Factory method
            //Maintain invaraint and creates a new transaction
        }
        public IResult CancelTransaction(string username)
        {
            
        }
    }

 public class LedgerTransaction
    {
        public int Id { get; private set; }
        public string LedgerAccountId { get; private set; }
        public string TransactionId { get; private set; }
        public string EntryDescription { get; private set; }
        public DateTime? ReconciledOn { get; private set; }
        public TransactionAmount TransactionAmount { get; private set; } //Value object
        private LedgerTransaction(int id, TransactionAmount transactionAmount,
            string transactionId,
            string entryDescription,
            string batchId,
            string ledgerAccountId)
        {
            //Code omitted for brevity
        }

        internal static IResult<LedgerTransaction> CreateTransaction(/*List of arguments*/)
        {
            //Factory method
            //Code omitted for brevity
        }
    }

public class CashTransaction
    {
        public int Id { get; private set; }
        public string ClientAccountId { get; private set; }
        public string TransactionId { get; private set; }
        public TransactionAmount TransactionAmount { get; private set; }//Value object
        public string EntryDescription { get; private set; }
        private CashTransaction(int id, 
            TransactionAmount transactionAmount,
            string transactionId,
            string entryDescription,
            string clientAccountId)
        {
            Id = id;
            TransactionAmount = transactionAmount;
            TransactionId = transactionId;
            EntryDescription = entryDescription;
            ClientAccountId = clientAccountId;
        }
        internal static IResult<CashTransaction> CreateTransaction(/*List of arguments*/)
        {
            //Factory method
            //Code omitted for brevity
        }
    }

public class Ledger : AggregateRoot
    {
        public string AccountId { get; private set; }
        public string Name { get; private set; }
        public LedgerType LedgerType { get; set; }
        public Currency Currency { get; private set; }
    }

因此,第一部分(创建事务)工作得很好,而且我还停留在如何处理Ledger帐户对账上。

问题:为了调节帐户,在给定的一天内,我需要获取属于特定分类账的所有分类账事务,其中ReconciledOn(参见域类)为空。然后,我需要确保所有借方和贷方总数为0-如果不是,我需要报告错误。匹配的借方和贷方也有可能属于不同的集合根(AccountingTransaction)。这也意味着我需要在聚合根(AccountingTransaction)之外获取Ledger事务,这是针对DDD的,然后可能直接对LedgerTransactions表执行写操作。

请告诉我该如何处理这个问题。域类中有缺陷吗?

谢谢你的帮助。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2021-04-12 13:42:07

乍一看,这个领域看起来不错。这里有几个选择:

  1. 获取所有有未对账的分类账交易的AccountingTransaction,并将它们全部传递给对账服务。这将要求您将一些域逻辑放到存储库中(了解什么是不可调和的事务),但这应该是可以的。
  2. 使LedgerTransaction成为它自己的聚合根。
票数 1
EN

Stack Overflow用户

发布于 2021-04-05 23:34:16

这种冲突意味着LedgerTransaction想要成为一个聚合根。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66953844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档