CSharp: Composite Pattern

项目结构:

一个基于组合模式(Composite Pattern)实现的珠宝企业级业务系统。系统采用树形结构组织业务流程,包含12个叶子节点(如原料采购、设计制图、加工生产等)和3个组合节点(前端销售链路、生产制造链路、职能后台支撑链路)。通过IBusinessProcessNode接口统一业务节点操作,AbstractProcessNode抽象类封装公共逻辑,ProcessCompositeNode实现组合节点管理。系统使用DI容器管理组件,支持单订单顺序执行和多线程批量处理,具备完善的日志记录和异常处理机制。该设计实现了业务节点的灵活组合和高扩展性,适用于复杂业务流程的模块化管理。

cs 复制代码
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : AbstractProcessNode.cs
 */
 
using CompositePattern.Core.Exceptions;
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Extensions.Logging;
 
 
namespace CompositePattern.Core.CompositePattern
{
    /// <summary>
    /// 业务节点抽象基类
    /// 封装公共日志、节点名称;提供叶子节点默认不支持子节点操作实现
    /// 所有叶子业务节点继承此类
    /// </summary>
    public abstract class AbstractProcessNode : IBusinessProcessNode
    {
        /// <summary>
        /// 当前业务节点名称
        /// </summary>
        public string NodeName { get; }
 
        /// <summary>
        /// 节点专属日志实例,DI注入隔离日志分类
        /// </summary>
        protected readonly ILogger _logger;
 
        /// <summary>
        /// 构造函数注入日志与节点名称
        /// </summary>
        /// <param name="logger">ILogger<T>注入实例</param>
        /// <param name="nodeName">业务节点中文名称</param>
        protected AbstractProcessNode(ILogger logger, string nodeName)
        {
            _logger = logger;
            NodeName = nodeName;
        }
 
        /// <summary>
        /// 子类重写:实现当前节点专属业务逻辑
        /// </summary>
        /// <param name="businessOrderNo">业务单号</param>
        public abstract void Execute(string businessOrderNo);
 
        /// <summary>
        /// 叶子节点默认实现:不支持添加子流程
        /// </summary>
        /// <param name="childNode">子节点对象</param>
        public virtual void AddChild(IBusinessProcessNode childNode)
        {
            string errorMsg = $"叶子业务节点【{NodeName}】不支持挂载子业务流程";
            _logger.LogWarning(errorMsg);
            throw new BusinessProcessException(errorMsg, "未知", NodeName);
        }
 
        /// <summary>
        /// 叶子节点默认实现:不支持移除子流程
        /// </summary>
        /// <param name="childNode">子节点对象</param>
        public virtual void RemoveChild(IBusinessProcessNode childNode)
        {
            string errorMsg = $"叶子业务节点【{NodeName}】无下属子流程,无法移除";
            _logger.LogWarning(errorMsg);
            throw new BusinessProcessException(errorMsg, "未知", NodeName);
        }
 
        /// <summary>
        /// 叶子节点默认实现:无任何子节点,返回空集合
        /// </summary>
        /// <returns>空子节点列表</returns>
        public virtual List<IBusinessProcessNode> GetChildren()
        {
            return new List<IBusinessProcessNode>();
        }
    }
}
 
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : IBusinessProcessNode.cs
 */
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Core.CompositePattern
{
    /// <summary>
    /// 组合模式顶层抽象构件接口
    /// 所有业务叶子节点、业务分组组合节点统一实现该接口
    /// 对外提供统一执行、增删子节点标准方法
    /// </summary>
    public interface IBusinessProcessNode
    {
        /// <summary>
        /// 获取当前业务节点名称
        /// </summary>
        string NodeName { get; }
 
        /// <summary>
        /// 执行业务流程
        /// </summary>
        /// <param name="businessOrderNo">业务唯一订单编号</param>
        void Execute(string businessOrderNo);
 
        /// <summary>
        /// 添加子业务节点
        /// 叶子节点实现直接抛不支持异常;组合节点实现挂载子流程
        /// </summary>
        /// <param name="childNode">待添加子节点</param>
        void AddChild(IBusinessProcessNode childNode);
 
        /// <summary>
        /// 移除指定子业务节点
        /// </summary>
        /// <param name="childNode">待移除子节点</param>
        void RemoveChild(IBusinessProcessNode childNode);
 
        /// <summary>
        /// 获取当前节点下全部子节点副本(线程安全返回快照)
        /// </summary>
        /// <returns>子节点集合</returns>
        List<IBusinessProcessNode> GetChildren();
    }
}
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : ProcessCompositeNode.cs
 */
using CompositePattern.Core.Exceptions;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Core.CompositePattern
{
    /// <summary>
    /// 组合模式容器节点(Composite)
    /// 用于分组管理多个子业务节点(叶子/其他组合节点)
    /// 内部全部集合操作加锁,保证多线程并发增删子节点安全
    /// </summary>
    public class ProcessCompositeNode : IBusinessProcessNode
    {
        /// <summary>
        /// 分组节点名称
        /// </summary>
        public string NodeName { get; }
 
        /// <summary>
        /// 分组专属日志
        /// </summary>
        protected readonly ILogger _logger;
 
        /// <summary>
        /// 子节点存储集合
        /// </summary>
        private readonly List<IBusinessProcessNode> _childNodes = new List<IBusinessProcessNode>();
 
        /// <summary>
        /// 线程安全操作锁对象
        /// </summary>
        private readonly object _syncLock = new object();
 
        /// <summary>
        /// 构造组合分组节点
        /// </summary>
        /// <param name="logger">分组日志实例</param>
        /// <param name="groupName">分组中文名称</param>
        public ProcessCompositeNode(ILogger logger, string groupName)
        {
            _logger = logger;
            NodeName = groupName;
        }
 
        /// <summary>
        /// 批量顺序执行分组下所有子业务流程
        /// 单个子流程异常仅记录日志,不阻断同组其他流程执行
        /// </summary>
        /// <param name="businessOrderNo">业务单号</param>
        public void Execute(string businessOrderNo)
        {
            _logger.LogInformation("===== 开始执行业务分组【{GroupName}】,业务单号:{OrderNo} =====", NodeName, businessOrderNo);
 
            List<IBusinessProcessNode> snapshot;
            lock (_syncLock)
            {
                snapshot = new List<IBusinessProcessNode>(_childNodes);
            }
 
            foreach (var child in snapshot)
            {
                try
                {
                    child.Execute(businessOrderNo);
                }
                catch (BusinessProcessException busEx)
                {
                    _logger.LogError(busEx, "分组【{GroupName}】子节点【{ChildName}】业务异常,单号:{OrderNo}",
                        NodeName, child.NodeName, businessOrderNo);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "分组【{GroupName}】子节点【{ChildName}】系统未知异常,单号:{OrderNo}",
                        NodeName, child.NodeName, businessOrderNo);
                }
            }
 
            _logger.LogInformation("===== 业务分组【{GroupName}】全部子流程执行完毕,业务单号:{OrderNo} =====", NodeName, businessOrderNo);
        }
 
        /// <summary>
        /// 线程安全添加子节点
        /// </summary>
        /// <param name="childNode">待挂载子流程</param>
        public void AddChild(IBusinessProcessNode childNode)
        {
            lock (_syncLock)
            {
                _childNodes.Add(childNode);
                _logger.LogDebug("分组【{GroupName}】成功挂载子节点:{ChildName}", NodeName, childNode.NodeName);
            }
        }
 
        /// <summary>
        /// 线程安全移除子节点
        /// </summary>
        /// <param name="childNode">待移除子流程</param>
        public void RemoveChild(IBusinessProcessNode childNode)
        {
            lock (_syncLock)
            {
                bool removeResult = _childNodes.Remove(childNode);
                if (removeResult)
                {
                    _logger.LogDebug("分组【{GroupName}】移除子节点:{ChildName}", NodeName, childNode.NodeName);
                }
                else
                {
                    _logger.LogDebug("分组【{GroupName}】未找到目标子节点【{ChildName}】,无需移除", NodeName, childNode.NodeName);
                }
            }
        }
 
        /// <summary>
        /// 返回当前子节点快照副本,避免外部遍历锁竞争
        /// </summary>
        /// <returns>子节点列表快照</returns>
        public List<IBusinessProcessNode> GetChildren()
        {
            lock (_syncLock)
            {
                return new List<IBusinessProcessNode>(_childNodes);
            }
        }
    }
}
 
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : BusinessProcessException.cs
 */
 
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Core.Exceptions
{
    /// <summary>
    /// 珠宝业务流程全局自定义异常
    /// 用于区分业务流程错误与系统底层异常,日志可单独识别
    /// </summary>
    public class BusinessProcessException : Exception
    {
        /// <summary>
        /// 关联业务订单号
        /// </summary>
        public string BusinessOrderNo { get; }
 
        /// <summary>
        /// 异常所属业务节点名称
        /// </summary>
        public string ProcessNodeName { get; }
 
        /// <summary>
        /// 构造业务流程异常
        /// </summary>
        /// <param name="message">异常描述</param>
        /// <param name="orderNo">业务单号</param>
        /// <param name="nodeName">出错节点名称</param>
        public BusinessProcessException(string message, string orderNo, string nodeName)
            : base(message)
        {
            BusinessOrderNo = orderNo;
            ProcessNodeName = nodeName;
        }
 
        /// <summary>
        /// 构造带内部堆栈的业务流程异常
        /// </summary>
        /// <param name="message">异常描述</param>
        /// <param name="innerException">原始异常</param>
        /// <param name="orderNo">业务单号</param>
        /// <param name="nodeName">出错节点名称</param>
        public BusinessProcessException(string message, Exception innerException, string orderNo, string nodeName)
            : base(message, innerException)
        {
            BusinessOrderNo = orderNo;
            ProcessNodeName = nodeName;
        }
    }
}
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : JewelryFileLoggerOptions.cs
 */
 
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using Serilog;
using Serilog.Events;
 
namespace CompositePattern.Core.Logging
{
    public static class JewelryFileLoggerOptions
    {
        public static LoggerConfiguration GetStandardOptions()
        {
            string logRoot = Path.Combine(Directory.GetCurrentDirectory(), "Logs");
            Directory.CreateDirectory(logRoot);
 
            return new LoggerConfiguration()
                .MinimumLevel.Debug()
                .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
                .MinimumLevel.Override("System", LogEventLevel.Warning)
                .Enrich.FromLogContext()
                .WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] [{SourceContext}] {Message}{NewLine}{Exception}")
                .WriteTo.File(
                    path: Path.Combine(logRoot, "app-.log"),
                    rollingInterval: RollingInterval.Day,
                    retainedFileCountLimit: 30,
                    rollOnFileSizeLimit: true,
                    outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] [{SourceContext}] {Message}{NewLine}{Exception}");
        }
    }
}
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : LoggerServiceExtension.cs
 */
using Microsoft.Extensions.Logging;
using Serilog;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Core.Logging
{
 
    /// <summary>
    ///
    /// </summary>
    public static class LoggerServiceExtension
    {
        public static ILoggingBuilder AddJewelryStandardLogger(this ILoggingBuilder loggingBuilder)
        {
            loggingBuilder.ClearProviders();
 
            Log.Logger = JewelryFileLoggerOptions.GetStandardOptions().CreateLogger();
            loggingBuilder.AddSerilog(dispose: true);
 
            loggingBuilder.SetMinimumLevel(LogLevel.Debug);
 
            AppDomain.CurrentDomain.ProcessExit += (sender, args) => Log.CloseAndFlush();
            AppDomain.CurrentDomain.UnhandledException += (sender, args) => Log.CloseAndFlush();
 
            return loggingBuilder;
        }
    }
}
 
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : ServiceCollectionExtensions.cs
 */
 
using CompositePattern.Business.CompositeGroups;
using CompositePattern.Business.Nodes;
using CompositePattern.Business.Scheduler;
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Extensions
{
    /// <summary>
    /// DI容器服务注册扩展类
    /// 一次性注册所有核心、业务、调度组件,Program入口代码极简
    /// 新增业务节点仅在此处追加注册,无需修改主程序
    /// </summary>
    public static class ServiceCollectionExtensions
    {
        /// <summary>
        /// 批量注册珠宝系统全部业务、组合、调度服务(单例生命周期)
        /// </summary>
        /// <param name="services">DI服务集合</param>
        /// <returns>链式服务集合</returns>
        public static IServiceCollection AddJewelryAllBusinessServices(this IServiceCollection services)
        {
            // 1. 全局根组合节点
            services.AddSingleton(sp =>
            {
                var log = sp.GetRequiredService<ILogger<ProcessCompositeNode>>();
                return new ProcessCompositeNode(log, "珠宝全业务总流程根节点");
            });
 
            // 2. 12个叶子业务节点单例注册
            services.AddSingleton<RawMaterialPurchaseNode>();
            services.AddSingleton<DesignDrawNode>();
            services.AddSingleton<ManufactureNode>();
            services.AddSingleton<QualityCheckNode>();
            services.AddSingleton<PackNode>();
            services.AddSingleton<LogisticsNode>();
            services.AddSingleton<FinanceNode>();
            services.AddSingleton<MarketingNode>();
            services.AddSingleton<BusinessSaleNode>();
            services.AddSingleton<HrAdminNode>();
            services.AddSingleton<ItSystemNode>();
            services.AddSingleton<TrainNode>();
 
            // 3. 三大业务分组组合节点注册
            services.AddSingleton<SaleLinkComposite>();
            services.AddSingleton<ProduceLinkComposite>();
            services.AddSingleton<AdminSupportComposite>();
 
            // 4. 全局业务调度器注册
            services.AddSingleton<JewelryBusinessScheduler>();
 
            return services;
        }
    }
}
cs 复制代码
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : AdminSupportComposite.cs
 */
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.CompositeGroups
{
    /// <summary>
    /// 业务分组组合节点:职能后台支撑链路
    /// 包含:财务、人事行政、IT、培训后台职能节点
    /// </summary>
    public class AdminSupportComposite : ProcessCompositeNode
    {
        public AdminSupportComposite(ILogger<AdminSupportComposite> logger)
            : base(logger, "职能后台支撑链路")
        {
        }
    }
}
 
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : ProduceLinkComposite.cs
 */
 
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.CompositeGroups
{
    /// <summary>
    /// 业务分组组合节点:生产制造核心链路
    /// 包含:原料采购、设计、加工、质检、包装、物流全生产流程
    /// </summary>
    public class ProduceLinkComposite : ProcessCompositeNode
    {
        public ProduceLinkComposite(ILogger<ProduceLinkComposite> logger)
            : base(logger, "生产制造链路")
        {
        }
    }
}
 
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : SaleLinkComposite.cs
 */
 
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.CompositeGroups
{
    /// <summary>
    /// 业务分组组合节点:前端销售链路
    /// 包含:业务销售、营销推广两个叶子节点
    /// </summary>
    public class SaleLinkComposite : ProcessCompositeNode
    {
        public SaleLinkComposite(ILogger<SaleLinkComposite> logger)
            : base(logger, "前端销售链路")
        {
        }
    }
}
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : JewelryBusinessScheduler.cs
 */
 
using CompositePattern.Business.CompositeGroups;
using CompositePattern.Business.Nodes;
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.Scheduler
{
    /// <summary>
    /// 珠宝业务流程调度器(单一职责:流程组装、同步/并发批量调度)
    /// 不实现任何业务逻辑,仅负责树形结构组装、批量执行调度、异常顶层捕获
    /// 完全DI注入依赖,所有业务节点外部传入,低耦合高扩展
    /// </summary>
    public class JewelryBusinessScheduler
    {
        /// <summary>
        /// 调度器专属日志
        /// </summary>
        private readonly ILogger<JewelryBusinessScheduler> _logger;
 
        /// <summary>
        /// 全局根节点:挂载三大业务分组,代表完整珠宝全业务流程
        /// </summary>
        private readonly ProcessCompositeNode _rootBusinessComposite;
 
        #region 全部叶子业务节点依赖注入字段
        private readonly BusinessSaleNode _saleNode;
        private readonly RawMaterialPurchaseNode _materialNode;
        private readonly DesignDrawNode _designNode;
        private readonly ManufactureNode _manufactureNode;
        private readonly QualityCheckNode _qualityNode;
        private readonly PackNode _packNode;
        private readonly LogisticsNode _logisticsNode;
        private readonly FinanceNode _financeNode;
        private readonly MarketingNode _marketingNode;
        private readonly HrAdminNode _hrNode;
        private readonly ItSystemNode _itNode;
        private readonly TrainNode _trainNode;
        #endregion
 
        #region 业务分组组合节点依赖注入字段
        private readonly SaleLinkComposite _saleComposite;
        private readonly ProduceLinkComposite _produceComposite;
        private readonly AdminSupportComposite _adminComposite;
        #endregion
 
        /// <summary>
        /// 全依赖构造注入,所有业务节点、分组、根组合全部由DI传入
        /// </summary>
        public JewelryBusinessScheduler(
            ILogger<JewelryBusinessScheduler> logger,
            ProcessCompositeNode rootComposite,
            // 叶子节点
            BusinessSaleNode saleNode,
            RawMaterialPurchaseNode materialNode,
            DesignDrawNode designNode,
            ManufactureNode manufactureNode,
            QualityCheckNode qualityNode,
            PackNode packNode,
            LogisticsNode logisticsNode,
            FinanceNode financeNode,
            MarketingNode marketingNode,
            HrAdminNode hrNode,
            ItSystemNode itNode,
            TrainNode trainNode,
            // 分组组合节点
            SaleLinkComposite saleComposite,
            ProduceLinkComposite produceComposite,
            AdminSupportComposite adminComposite)
        {
            _logger = logger;
            _rootBusinessComposite = rootComposite;
 
            _saleNode = saleNode;
            _materialNode = materialNode;
            _designNode = designNode;
            _manufactureNode = manufactureNode;
            _qualityNode = qualityNode;
            _packNode = packNode;
            _logisticsNode = logisticsNode;
            _financeNode = financeNode;
            _marketingNode = marketingNode;
            _hrNode = hrNode;
            _itNode = itNode;
            _trainNode = trainNode;
 
            _saleComposite = saleComposite;
            _produceComposite = produceComposite;
            _adminComposite = adminComposite;
        }
 
        /// <summary>
        /// 初始化完整业务树形组合结构
        /// 分层挂载:叶子节点→分组组合→全局根节点
        /// 外部可随时新增节点后再次调用重新组装
        /// </summary>
        public void InitFullBusinessTreeStructure()
        {
            _logger.LogInformation("调度器开始初始化珠宝全业务组合树形结构");
 
            // 1. 组装销售链路分组
            _saleComposite.AddChild(_saleNode);
            _saleComposite.AddChild(_marketingNode);
 
            // 2. 组装生产制造链路分组
            _produceComposite.AddChild(_materialNode);
            _produceComposite.AddChild(_designNode);
            _produceComposite.AddChild(_manufactureNode);
            _produceComposite.AddChild(_qualityNode);
            _produceComposite.AddChild(_packNode);
            _produceComposite.AddChild(_logisticsNode);
 
            // 3. 组装职能后台支撑分组
            _adminComposite.AddChild(_financeNode);
            _adminComposite.AddChild(_hrNode);
            _adminComposite.AddChild(_itNode);
            _adminComposite.AddChild(_trainNode);
 
            // 4. 根节点挂载三大顶层业务分组
            _rootBusinessComposite.AddChild(_saleComposite);
            _rootBusinessComposite.AddChild(_produceComposite);
            _rootBusinessComposite.AddChild(_adminComposite);
 
            _logger.LogInformation("珠宝全业务树形组合结构初始化完成");
        }
 
        /// <summary>
        /// 同步执行单个订单完整全业务流程
        /// </summary>
        /// <param name="orderNo">唯一业务订单编号</param>
        public void RunSingleOrderFullProcess(string orderNo)
        {
            _logger.LogInformation("调度器启动单订单完整业务流程,订单号:{OrderNo}", orderNo);
            try
            {
                _rootBusinessComposite.Execute(orderNo);
                _logger.LogInformation("调度器单订单全部业务流程执行完成,订单号:{OrderNo}", orderNo);
            }
            catch (Exception ex)
            {
                _logger.LogCritical(ex, "调度器顶层捕获订单全局未知异常,订单号:{OrderNo}", orderNo);
            }
        }
 
        /// <summary>
        /// 多线程并发批量执行多订单业务流程
        /// 使用Parallel.ForEach实现高并发调度,订单之间完全隔离
        /// 单个订单异常仅内部记录,不影响其他订单执行
        /// </summary>
        /// <param name="orderNoList">批量订单编号集合</param>
        public void RunMultiThreadBatchProcess(List<string> orderNoList)
        {
            if (orderNoList == null || orderNoList.Count == 0)
            {
                _logger.LogWarning("批量订单集合为空,跳过并发调度");
                return;
            }
 
            _logger.LogInformation("调度器启动多线程高并发批量业务执行,待处理订单总数:{Count}", orderNoList.Count);
 
            Parallel.ForEach(orderNoList, orderCode =>
            {
                RunSingleOrderFullProcess(orderCode);
            });
 
            _logger.LogInformation("多线程批量全部订单业务流程执行完毕");
        }
    }
}
cs 复制代码
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : BusinessSaleNode.cs
 */
 
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.Nodes
{
    /// <summary>
    /// 叶子业务节点:业务销售
    /// 业务职责:客户洽谈、定制需求录入、销售订单合同建档
    /// </summary>
    public class BusinessSaleNode : AbstractProcessNode
    {
        public BusinessSaleNode(ILogger<BusinessSaleNode> logger)
            : base(logger, "业务")
        {
        }
 
        public override void Execute(string businessOrderNo)
        {
            _logger.LogDebug("【{NodeName}】客户订单建档流程启动,订单号:{OrderNo}", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】录入客户定制参数、签订销售合同、创建业务订单档案", NodeName, businessOrderNo);
            _logger.LogDebug("【{NodeName}】业务销售流程执行完毕,订单号:{OrderNo}", NodeName, businessOrderNo);
        }
    }
}
 
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : DesignDrawNode.cs
 */
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.Nodes
{
    /// <summary>
    /// 叶子业务节点:设计制图
    /// 业务职责:首饰3D建模、效果图渲染、生产图纸导出、方案归档
    /// </summary>
    public class DesignDrawNode : AbstractProcessNode
    {
        public DesignDrawNode(ILogger<DesignDrawNode> logger)
            : base(logger, "设计制图")
        {
        }
 
        public override void Execute(string businessOrderNo)
        {
            _logger.LogDebug("【{NodeName}】首饰3D建模设计启动,订单号:{OrderNo}", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】完成款式建模、尺寸标注、客户效果图渲染导出", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】图纸归档至设计资源库,下发至生产车间", NodeName, businessOrderNo);
            _logger.LogDebug("【{NodeName}】设计制图流程执行完毕,订单号:{OrderNo}", NodeName, businessOrderNo);
        }
    }
}
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : FinanceNode.cs
 */
 
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.Nodes
{
    /// <summary>
    /// 叶子业务节点:财务
    /// 业务职责:订单成本归集、销售开票、应收应付台账记账
    /// </summary>
    public class FinanceNode : AbstractProcessNode
    {
        public FinanceNode(ILogger<FinanceNode> logger)
            : base(logger, "财务")
        {
        }
 
        public override void Execute(string businessOrderNo)
        {
            _logger.LogDebug("【{NodeName}】订单成本核算流程启动,订单号:{OrderNo}", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】归集原料、加工、物流成本,开具销售发票,更新应收台账", NodeName, businessOrderNo);
            _logger.LogDebug("【{NodeName}】财务核算流程执行完毕,订单号:{OrderNo}", NodeName, businessOrderNo);
        }
    }
}
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : HrAdminNode.cs
 */
 
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.Nodes
{
    /// <summary>
    /// 叶子业务节点:人事行政
    /// 业务职责:车间工序工时统计、生产员工绩效台账更新
    /// </summary>
    public class HrAdminNode : AbstractProcessNode
    {
        public HrAdminNode(ILogger<HrAdminNode> logger)
            : base(logger, "人事行政")
        {
        }
 
        public override void Execute(string businessOrderNo)
        {
            _logger.LogDebug("【{NodeName}】订单对应生产人员绩效统计启动,订单号:{OrderNo}", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】统计各工序工时,更新车间员工绩效台账记录", NodeName, businessOrderNo);
            _logger.LogDebug("【{NodeName}】人事行政流程执行完毕,订单号:{OrderNo}", NodeName, businessOrderNo);
        }
    }
}
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : ItSystemNode.cs
 */
 
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.Nodes
{
    /// <summary>
    /// 叶子业务节点:IT运维
    /// 业务职责:订单业务数据备份、数据库归档、系统日志巡检
    /// </summary>
    public class ItSystemNode : AbstractProcessNode
    {
        public ItSystemNode(ILogger<ItSystemNode> logger)
            : base(logger, "IT")
        {
        }
 
        public override void Execute(string businessOrderNo)
        {
            _logger.LogDebug("【{NodeName}】业务订单数据备份校验启动,订单号:{OrderNo}", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】完成订单业务数据归档、数据库备份完整性校验", NodeName, businessOrderNo);
            _logger.LogDebug("【{NodeName}】IT运维流程执行完毕,订单号:{OrderNo}", NodeName, businessOrderNo);
        }
    }
}
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : LogisticsNode.cs
 */
 
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.Nodes
{
    /// <summary>
    /// 叶子业务节点:物流
    /// 业务职责:珠宝保价快递、物流单生成、配送跟踪台账登记
    /// </summary>
    public class LogisticsNode : AbstractProcessNode
    {
        public LogisticsNode(ILogger<LogisticsNode> logger)
            : base(logger, "物流")
        {
        }
 
        public override void Execute(string businessOrderNo)
        {
            _logger.LogDebug("【{NodeName}】保价发货流程启动,订单号:{OrderNo}", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】生成珠宝保价快递单据,录入物流跟踪管理台账", NodeName, businessOrderNo);
            _logger.LogDebug("【{NodeName}】物流流程执行完毕,订单号:{OrderNo}", NodeName, businessOrderNo);
        }
    }
}
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : ManufactureNode.cs
 */
 
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.Nodes
{
    /// <summary>
    /// 叶子业务节点:加工生产
    /// 业务职责:失蜡铸造、宝石镶嵌、粗抛、精抛车间工序流转
    /// </summary>
    public class ManufactureNode : AbstractProcessNode
    {
        public ManufactureNode(ILogger<ManufactureNode> logger)
            : base(logger, "加工生产")
        {
        }
 
        public override void Execute(string businessOrderNo)
        {
            _logger.LogDebug("【{NodeName}】车间生产排产启动,订单号:{OrderNo}", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】执行铸造、镶嵌、粗抛、精抛全生产工序", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】半成品流转至成品质检工位", NodeName, businessOrderNo);
            _logger.LogDebug("【{NodeName}】加工生产流程执行完毕,订单号:{OrderNo}", NodeName, businessOrderNo);
        }
    }
}
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : MarketingNode.cs
 */
 
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.Nodes
{
    /// <summary>
    /// 叶子业务节点:营销推广
    /// 业务职责:客户会员积分、用户标签、营销活动数据统计归档
    /// </summary>
    public class MarketingNode : AbstractProcessNode
    {
        public MarketingNode(ILogger<MarketingNode> logger)
            : base(logger, "营销推广")
        {
        }
 
        public override void Execute(string businessOrderNo)
        {
            _logger.LogDebug("【{NodeName}】订单客户营销数据归档启动,订单号:{OrderNo}", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】发放客户会员积分,更新客户用户标签,统计活动转化数据", NodeName, businessOrderNo);
            _logger.LogDebug("【{NodeName}】营销推广流程执行完毕,订单号:{OrderNo}", NodeName, businessOrderNo);
        }
    }
}
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : PackNode.cs
 */
 
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.Nodes
{
    /// <summary>
    /// 叶子业务节点:包装
    /// 业务职责:礼盒封装、配套证书、防尘防护、防伪封签粘贴
    /// </summary>
    public class PackNode : AbstractProcessNode
    {
        public PackNode(ILogger<PackNode> logger)
            : base(logger, "包装")
        {
        }
 
        public override void Execute(string businessOrderNo)
        {
            _logger.LogDebug("【{NodeName}】成品打包作业启动,订单号:{OrderNo}", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】首饰礼盒封装、配套证书放置、防伪封签粘贴完成", NodeName, businessOrderNo);
            _logger.LogDebug("【{NodeName}】包装流程执行完毕,订单号:{OrderNo}", NodeName, businessOrderNo);
        }
    }
}
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : QualityCheckNode.cs
 */
 
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.Nodes
{
    /// <summary>
    /// 叶子业务节点:质检
    /// 业务职责:重量、贵金属纯度、镶嵌牢固度、外观瑕疵全项检测
    /// </summary>
    public class QualityCheckNode : AbstractProcessNode
    {
        public QualityCheckNode(ILogger<QualityCheckNode> logger)
            : base(logger, "质检")
        {
        }
 
        public override void Execute(string businessOrderNo)
        {
            _logger.LogDebug("【{NodeName}】成品综合检测启动,订单号:{OrderNo}", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】称重、纯度检测、宝石牢固度、外观瑕疵逐项校验", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】合格品粘贴防伪证书,不良品标记退回车间返工", NodeName, businessOrderNo);
            _logger.LogDebug("【{NodeName}】质检流程执行完毕,订单号:{OrderNo}", NodeName, businessOrderNo);
        }
    }
}
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : RawMaterialPurchaseNode.cs
 */
 
using CompositePattern.Core.CompositePattern;
using CompositePattern.Core.Exceptions;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.Nodes
{
    /// <summary>
    /// 叶子业务节点:原料采购核验
    /// 业务职责:贵金属/宝石原料入库、资质核验、库存台账登记
    /// </summary>
    public class RawMaterialPurchaseNode : AbstractProcessNode
    {
        /// <summary>
        /// DI构造注入日志实例
        /// </summary>
        /// <param name="logger">当前节点分类日志</param>
        public RawMaterialPurchaseNode(ILogger<RawMaterialPurchaseNode> logger)
            : base(logger, "原料采购核验")
        {
        }
 
        /// <summary>
        /// 执行原料采购核验完整业务流程
        /// </summary>
        /// <param name="businessOrderNo">珠宝业务订单编号</param>
        public override void Execute(string businessOrderNo)
        {
            _logger.LogDebug("【{NodeName}】原料入库校验流程启动,订单号:{OrderNo}", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】核验贵金属纯度报告、宝石鉴定证书、供应商资质文件", NodeName, businessOrderNo);
 
            // 模拟异常分支:订单后缀带ERR代表原料资质缺失
            if (businessOrderNo.EndsWith("ERR", StringComparison.OrdinalIgnoreCase))
            {
                string errMsg = "原料配套鉴定证书缺失,无法入库,需退回供应商重新提供";
                _logger.LogWarning("【{NodeName}】业务校验失败:{Msg},订单号:{OrderNo}", NodeName, errMsg, businessOrderNo);
                throw new BusinessProcessException(errMsg, businessOrderNo, NodeName);
            }
 
            _logger.LogInformation("【{NodeName}】原料入库台账录入完成,原料库存数据同步更新", NodeName, businessOrderNo);
            _logger.LogDebug("【{NodeName}】原料采购核验流程执行完毕,订单号:{OrderNo}", NodeName, businessOrderNo);
        }
    }
}
 
 
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:组合模式 Composite 演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : TrainNode.cs
 */
 
using CompositePattern.Core.CompositePattern;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace CompositePattern.Business.Nodes
{
    /// <summary>
    /// 叶子业务节点:员工培训
    /// 业务职责:新款工艺培训台账、质检标准培训记录归档
    /// </summary>
    public class TrainNode : AbstractProcessNode
    {
        public TrainNode(ILogger<TrainNode> logger)
            : base(logger, "培训")
        {
        }
 
        public override void Execute(string businessOrderNo)
        {
            _logger.LogDebug("【{NodeName}】新款工艺培训台账归档启动,订单号:{OrderNo}", NodeName, businessOrderNo);
            _logger.LogInformation("【{NodeName}】更新新款首饰工艺、质检标准培训记录台账", NodeName, businessOrderNo);
            _logger.LogDebug("【{NodeName}】员工培训流程执行完毕,订单号:{OrderNo}", NodeName, businessOrderNo);
        }
    }
}

调用:

cs 复制代码
/*
 # encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:结构型模式 Structural Patterns 组合模式 Composite Pattern演示业务层
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/04 22:16
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPattern
# File      : CompositeBll.cs
 */
 
using System;
using System.Collections.Generic;
using System.Text;
using CompositePattern.Core.Logging;
using CompositePattern.Extensions;
using CompositePattern.Business.Scheduler;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
 
 
 
namespace BLL
{
    public abstract class Component
    {
        public string Name;
        protected Component(string name) => Name = name;
        public abstract void Display(int depth);
    }
 
    public class Leaf : Component
    {
        public Leaf(string name) : base(name) { }
        public override void Display(int depth)
        {
            Console.WriteLine(new string('-', depth) + Name);
        }
    }
 
    public class Composite : Component
    {
        private List<Component> _children = new();
        public Composite(string name) : base(name) { }
        public void Add(Component c) => _children.Add(c);
        public override void Display(int depth)
        {
            Console.WriteLine(new string('-', depth) + Name);
            foreach (var c in _children) c.Display(depth + 2);
        }
    }
 
    public class CompositeBll
    {
        public void Demo()
        {
            #region 1. 初始化DI服务容器 + 全局标准化日志
            var serviceCollection = new ServiceCollection();
 
            // 注册企业级标准日志(控制台+按日期分级文件,输出格式统一)
            serviceCollection.AddLogging(logBuilder =>
            {
                logBuilder.AddJewelryStandardLogger();
            });
 
            // 一次性注册全部业务、组合、调度服务
            serviceCollection.AddJewelryAllBusinessServices();
            #endregion
 
            #region 2. 构建服务提供者,获取调度器实例
            var serviceProvider = serviceCollection.BuildServiceProvider();
            var scheduler = serviceProvider.GetRequiredService<JewelryBusinessScheduler>();
            var mainLogger = serviceProvider.GetRequiredService<ILogger<CompositeBll>>();
 
            // 初始化完整业务树形组合结构
            scheduler.InitFullBusinessTreeStructure();
            #endregion
 
            #region 3. 多场景业务流程测试
            mainLogger.LogInformation("========== 珠宝企业级组合模式业务系统启动完成 ==========");
 
            // 测试1:单个正常订单全流程
            string normalOrder = "JEW20260716001";
            scheduler.RunSingleOrderFullProcess(normalOrder);
 
            // 测试2:异常订单(原料证书缺失模拟报错)
            string errorOrder = "JEW20260716002-ERR";
            scheduler.RunSingleOrderFullProcess(errorOrder);
 
            // 测试3:多线程高并发批量订单测试
            List<string> batchOrderList = new List<string>()
            {
                "JEW20260716003",
                "JEW20260716004",
                "JEW20260716005",
                "JEW20260716006"
            };
            scheduler.RunMultiThreadBatchProcess(batchOrderList);
 
            mainLogger.LogInformation("========== 全部业务流程测试执行结束,按回车退出程序 ==========");
            Console.ReadLine();
            #endregion
        }
    }
}

输出:

相关推荐
LeoTao1 小时前
C#专题-C# 异常处理
c#
消失的旧时光-19431 小时前
KMP Web 开发实战(二):js、wasmJs、browser、executable 到底是什么意思?
开发语言·前端·javascript·跨平台·kmp
宇图SHARE1 小时前
别再用 Python 写 Agent 前端了!Vue3 + NestJS + TypeScript 全栈方案,开发效率翻倍
前端·后端
吃饱了得干活1 小时前
Spring Cloud Gateway限流:从Redis到Sentinel的三种方案
后端·spring cloud
sycmancia1 小时前
Qt——线程的生命期问题
开发语言·qt
IT_陈寒1 小时前
Python的GIL让我以为CPU跑满了,结果...
前端·人工智能·后端
影寂ldy1 小时前
C# 多线程进阶知识点(线程优先级、多委托传参、线程锁、死锁)
开发语言·数据库·c#
国服第二切图仔1 小时前
09-搜索工具Grep与Glob
开发语言·javascript·ecmascript
Jiude1 小时前
AI 产品的几种付费方式
后端·架构·openai