- 博客(161)
- 收藏
- 关注
原创 .NET Core 中上位机开发常用的方法和编程方式的详细说明之二
继续补充 .NET Core(现为 .NET,如 .NET 5/6/7/8)在上位机开发中常用的方法和编程方式,重点针对大数据量、硬件交互和高实时性需求场景。异步与并发:Task.Run, Task.WhenAll, Parallel.ForEachAsync, Channels, ValueTask, Dataflow, IAsyncEnumerable。对比 .NET Framework:Framework 支持 Dataflow,但 .NET Core 性能更高,集成更好。
2025-05-29 17:23:25
423
原创 .NET Core 中上位机开发常用的方法和编程方式的详细说明之一
在使用 .NET Core(现为 .NET,如 .NET 5/6/7/8)开发上位机软件时,特别是在大数据量、硬件交互和高实时性需求的场景下,.NET Core 提供了许多高性能、异步、现代化和跨平台的编程方法。这些方法在性能优化、并发处理、内存管理和硬件交互等方面表现出色,非常适合上位机开发(如工业控制、数据采集、实时监控)。以下是 .NET Core 中上位机开发常用的方法和编程方式的详细说明,涵盖广泛场景,并提供具体示例和使用注意事项,力求全面。优势:高性能异步队列,适合每秒数万条数据的高吞吐场景。
2025-05-29 17:17:53
113
原创 在上位机控制贴片机或晶圆老化设备时,C#的实现需要考虑高性能、异步操作、日志记录、硬件适配的灵活性以及错误处
在上位机控制贴片机(SMT Placement Machine)或晶圆老化设备(Wafer Aging Equipment)时,C#的实现需要考虑高性能、异步操作、日志记录、硬件适配的灵活性以及错误处理等关键因素。以下是一个针对贴片机和晶圆老化设备的优化方案,结合异步操作、日志记录、反射驱动加载和具体硬件实现细节,并提供可参考的案例和最佳实践。需实现协议解析(如Modbus、自定义协议)。灵活性:通过接口和反射支持不同硬件(如贴片机的吸嘴控制、晶圆老化设备的温控系统),便于扩展。
2025-05-29 08:52:14
554
原创 通过抽象接口和反射机制实现上位机控制不同硬件的统一驱动切换,是一种优雅且适应变化的设计方式
在C#中,通过抽象接口和反射机制实现上位机控制不同硬件的统一驱动切换,是一种优雅且适应变化的设计方式。以下是实现这种架构的详细步骤和代码示例,重点在于通过接口抽象驱动逻辑,并利用反射动态加载和切换不同的硬件驱动,以提高系统的灵活性和可扩展性。这种设计不仅支持动态切换驱动,还能通过配置文件快速适配新硬件,极大地提高了系统的可维护性和扩展性。抽象接口:定义一个统一的硬件控制接口,包含所有硬件通用的操作(如连接、发送数据、断开等)。上位机通过工厂类获取驱动实例,并调用统一接口方法,无需关心具体硬件实现。
2025-05-29 08:36:33
687
原创 提供一个封装良好的C#通信类库,适用于上位机通过串口(COM口,波特率1115200,数据位8,无校验,1停止位)与采集板通信
提供一个封装良好的C#通信类库,适用于上位机通过串口(COM口,波特率1115200,数据位8,无校验,1停止位)与采集板通信。代码将实现初始化、连接、读取和写入功能,遵循文档中的帧结构和功能码要求,采用大端模式,并支持错误处理和CRC校验。可扩展性:支持所有功能码的实现,当前提供了0x00, 0x01, 0x03, 0x04, 0x05,其他功能码可按需扩展。Connect:初始化串口(波特率1115200,8数据位,1停止位,无校验),打开COM口。波特率1115200:非标准波特率,需确认硬件支持。
2025-05-28 08:44:54
371
原创 我们将创建一个 Modbus RTU 和 Modbus TCP 模拟器,模拟设备以每秒 10MB 的数据量生成数据,并使用之前提供的高性能上位机方法进行采集
模拟器将生成 Modbus 数据包(RTU 和 TCP 格式),上位机使用 .NET 8 的 System.IO.Pipelines、System.Threading.Channels、Parallel.ForEachAsync 和其他优化方法采集和处理数据,确保高实时性(<50ms 延迟)。以下是详细实现,包括模拟器和上位机的完整代码、配置说明、性能优化和运行步骤。数据生成:每个数据包 ~100 字节,包含 SlaveID、Function Code(0x03)、数据(ID、值、时间戳)和 CRC16。
2025-05-28 08:28:11
768
原创 制造业执行系统(MES,Manufacturing Execution System)常用的单词和术语主要涵盖生产管理、数据采集、过程控制和系统集成等方面
在半导体行业,制造执行系统(MES,Manufacturing Execution System)涉及许多特定术语,涵盖晶圆制造、测试、封装等环节。MES - Manufacturing Execution System,制造执行系统,连接ERP与车间层面的生产管理系统。SPC - Statistical Process Control,统计过程控制,监控生产质量。HMI - Human-Machine Interface,人机界面,用于操作员与设备交互。
2025-05-28 08:14:07
244
原创 在 ABP 框架中,`DomainService` 是一个核心概念,用于实现领域驱动设计(DDD)中的领域服务(Domain Services)
`DomainService` 是一个抽象基类,实现了 `IDomainService` 接口,并提供了一些内置服务属性(如 `ILogger`、`IGuidGenerator`、`IClock` 等),通过 `IAbpLazyServiceProvider` 进行延迟加载。- ABP 建议领域服务以 `Manager` 或 `Service` 结尾(如 `TaskManager`、`OrderService`),以区分其他类型的服务(如应用服务 `AppService`)。
2025-05-28 08:12:30
319
原创 Entity Framework(EF)是 Microsoft 提供的一个对象关系映射(ORM)框架,用于简化 .NET 应用程序与数据库之间的交互
2. 将实体添加到 `DbSet<TEntity>`(通过 `Add` 或 `AddRange` 方法),EF 将实体状态标记为 `Added`。// 查询 ID=1 的产品。2. 调用 `Remove` 或 `RemoveRange` 方法,EF 将实体状态标记为 `Deleted`。- 使用 `AddRange`、`UpdateRange` 或 `RemoveRange` 减少数据库往返。- 原因:未使用 `Select` 或 `AsNoTracking`,加载了不必要的字段或跟踪了只读数据。
2025-05-28 08:11:58
607
原创 以下是采集板协议中涉及的术语“帧头、模块地址、功能码、数据长度、分包序号、数据、CRC、帧尾、功能码含义、数据报文中数据位格式、通讯协议”的详细中文解释
响应帧:BB 66 01 00 00 04 00 00 01 17 01 01 XX XX 0D 0A(版本0x01,年0x17即2023-2000,月0x01,日0x01)。例如,发送帧BB 66 01 00 00 00 00 00 00(帧头+模块地址+功能码+长度+序号),计算CRC后附加XX XX,再加帧尾0D 0A。响应:136字节,包括包序号(2字节)、错误码(2字节)、上桥漏电(84字节float)、NTC数据(84字节float)等。在文档中,帧头是固定值0xBB66(2字节)。
2025-05-27 20:01:56
523
原创 设计一个可配置的老化测试任务执行流程,用C#实现
添加新任务类型:在 AgingTask.cs 中添加新的任务类(如 HumidityTask),并在 TaskScheduler 中添加对应的逻辑。模拟测试:当前代码使用 Thread.Sleep 模拟任务执行,实际项目中需要替换为真实的硬件控制逻辑(例如通过设备驱动设置电压或温度)。示例配置文件中,先执行电压测试(5V,300秒),再执行温度测试(85°C,600秒)。任务抽象:将电压测试和温度测试抽象为任务(Task),通过接口实现统一的执行逻辑。设计一个可配置的老化测试任务执行流程,用C#实现。
2025-05-27 19:47:40
406
原创 C# WinForms 实现晶圆老化测试设备上位机软件的详细介绍,涵盖设计思路、功能实现、关键代码示例及优化建议
晶圆老化测试(Wafer Burn-in Testing)是半导体制造中用于检测晶圆在高温、高压等极端条件下的可靠性和稳定性的重要环节,上位机负责与下位机(如测试设备)通信、数据采集、处理、展示及存储。通信功能:与下位机(如PLC、微控制器或专用测试设备)通过串口、以太网、USB等方式通信,发送控制指令并接收测试数据。数据采集与处理:实时采集晶圆老化测试数据(如温度、电压、电流、电阻等),进行解析、过滤和计算。数据显示:通过WinForms界面实时展示测试数据(如曲线图、表格、状态指示器)。
2025-05-27 14:34:26
744
原创 一个经典的 ABP 框架领域服务代码示例,基于一个具体的场景:任务管理系统中的任务分配逻辑
`TaskManager` 继承了 `DomainService` 并实现了 `ITaskManager` 接口,自动获得 `Logger` 等内置服务。- `Task` 和 `Person` 是聚合根,`TaskManager` 作为领域服务协调两者,符合 DDD 的设计理念。- `Task` 包含分配的人员 ID(`AssignedPersonId`)和状态(`State`)。1. `TaskAppService` 从仓储获取 `Task` 和 `Person` 实体。
2025-05-27 11:17:11
481
原创 批量添加到 DataTable
受影响的 SealingBox 集合,键为 GroupIndex产品映射集合</param>/// <param name="msg">错误信息(包含所有失败的详细信息)</param>/// <param name="added">是否全部添加成功
2025-05-27 11:13:33
542
原创 半导体制造和设备原理是半导体行业的基础,涵盖芯片从设计到生产的全流程,以及支持这些流程的关键设备
以下是对半导体制造流程、设备原理及相关知识的详细介绍,结合你的背景(16年程序员经验,熟悉C#,对半导体和智能制造感兴趣),我将重点突出与上位机、MES、AI和国产化相关的技术点,帮助你快速补充行业知识,为从技术人员到架构师、技术总监乃至创业者的目标奠定基础。硅提纯:从硅石(SiO₂)提炼高纯度多晶硅(99.9999%以上纯度),通过Czochralski(CZ)或浮区(FZ)法生长单晶硅锭。干法刻蚀(等离子刻蚀):使用等离子体(如反应离子刻蚀,RIE)去除材料,精度高。
2025-05-27 08:19:50
345
原创 旨在帮助你从大学起点成长为半导体行业的即时技术专家和行业专家,助力中国国产化设备发展
针对半导体行业中涉及C#、Java、人工智能(AI)、智能生产(智能制造)以及国产化设备开发的方向,计算机专业背景和对智慧农业的兴趣,以下是一个详细的职业规划,旨在帮助你从大学起点成长为半导体行业的即时技术专家和行业专家,助力中国国产化设备发展。Python:学习数据分析(Pandas、NumPy)、AI框架(TensorFlow、PyTorch),用于半导体缺陷检测、工艺优化。智能生产(智能制造):结合工业物联网(IIoT)、MES、数字孪生,推动半导体制造的自动化、数字化和智能化。
2025-05-27 08:02:21
763
原创 针对设备生成方面的岗位,以下是一个详细的职业规划,涵盖从大学到成为高级工程师或架构师的成长路径
技术栈包括.NET、Java、数据库(SQL Server、Oracle)、前端框架(如React、Angular)。上位机开发:涉及工业控制软件开发,用于设备监控、数据采集、通信(如PLC、SCADA系统)。你的优势:C#是上位机和MES开发的主流语言,你的背景非常契合。核心语言:重点学习C#(.NET用于上位机和MES开发)、Python(数据处理、自动化脚本)、C++(嵌入式或高性能场景)。工业知识:了解自动化设备(如PLC、传感器)、工业通信协议(Modbus、OPC UA、MQTT)。
2025-05-27 07:54:11
860
原创 通过传入C#代码字符串(Code)动态生成一个自定义的DLL文件
以下是实现这一需求的详细步骤和代码示例,使用C#的Microsoft.CodeAnalysis.CSharp库(Roslyn)来动态编译代码并生成DLL文件。上述代码提供了一个通用的解决方案,用于根据传入的C#代码字符串动态生成DLL文件。以下是一个完整的C#程序,用于接收代码字符串,生成自定义DLL文件,并支持一些基本规则(如自定义命名空间、输出路径等)。dllName:生成的DLL文件名(如CustomLibrary.dll)。code:C#代码字符串,定义了DLL的内容(如类、方法等)。
2025-05-26 13:47:49
475
原创 ABP Framework 是一个开源的应用程序框架,基于 ASP.NET Core,旨在帮助开发者快速构建企业级应用
ABP 自动为 `DbContext` 中的每个实体生成默认仓储,支持标准操作(如 `InsertAsync`、`UpdateAsync`、`DeleteAsync`、`GetAsync`)。- 为每个模块定义单独的 `DbContext` 接口和类,接口继承自 `IEfCoreDbContext`,类继承自 `AbpDbContext<TDbContext>`。- 在模块类中通过 `AddAbpDbContext<TDbContext>` 注册 `DbContext`,并指定仓储实现。
2025-05-26 11:06:00
667
原创 Entity Framework(EF)是 Microsoft 提供的一个对象关系映射(ORM)框架,用于简化 .NET 应用程序与数据库之间的交互
2. 将实体添加到 `DbSet<TEntity>`(通过 `Add` 或 `AddRange` 方法),EF 将实体状态标记为 `Added`。// 查询 ID=1 的产品。2. 调用 `Remove` 或 `RemoveRange` 方法,EF 将实体状态标记为 `Deleted`。- 使用 `AddRange`、`UpdateRange` 或 `RemoveRange` 减少数据库往返。- 原因:未使用 `Select` 或 `AsNoTracking`,加载了不必要的字段或跟踪了只读数据。
2025-05-26 09:27:33
1027
原创 经典软件开发模型详解
1. 需求分析 → 2. 系统设计 → 3. 实现 → 4. 测试 → 5. 部署维护。**适用场景**:对质量要求高、需求稳定的系统(如医疗、航空软件)快速分析 → 构建原型 → 用户评估 → 细化需求 → 正式开发。**适用场景**:大型、高风险项目(如军事、航天系统)**适用场景**:需求明确、技术成熟的小型项目。**适用场景**:需求变化快的项目,中小型团队。**适用场景**:需求不明确或界面密集型系统。**适用场景**:需求可分段实现的中大型项目。**适用场景**:需要频繁发布的企业级应用。
2025-05-25 11:03:39
321
原创 为库存管理系统的移动端(添加交互功能,具体实现**手动触发补货**功能,允许用户在查看库存预警或报表时直接发起补货请求
在 `ReportService.Application.Contracts` 中扩展 `ReportType` 和 `GenerateReportDto`.- 在 `InventoryManagement.Domain` 中添加补货请求事件 `ReplenishmentRequestedEto`。- **领域模型**:添加 `ReplenishStock` 方法和 `ReplenishmentRequestedEto` 事件。
2025-05-25 08:59:07
813
原创 在ABP框架中,`Check.NotNullOrWhiteSpace` 是一个静态方法,用于验证字符串是否为 `null`、空字符串或仅包含空白字符
在之前的 `Product` 实体中,可以直接使用ABP的 `Check.NotNullOrWhiteSpace`,或替换为自定义的 `ValidationHelper.NotNullOrWhiteSpace` 以支持更多功能(如最小长度或本地化)。`Check.NotNullOrWhiteSpace` 是ABP框架中 `Volo.Abp` 命名空间下 `Check` 静态类的一部分,位于 `Volo.Abp.Core` 包中。自定义实现不会显著影响性能。
2025-05-25 08:54:20
539
原创 通过读取 JSON 配置文件的方式来生成 material_config.json,并允许程序根据指定的 JSON 文件名称动态生成配置
config:GeneratorConfig 对象,包含 Id, Name, EnumArray, Fields, MainTable, RequiredFields, HiddenFields, Tabs, EnumFields, AdditionalColumns。以下是修改后的代码,包含从 JSON 文件加载配置的逻辑。Test 方法从 JSON 文件(如 material_input.json)读取配置,生成 material_config.json。
2025-05-24 18:31:41
607
原创 我将对现有的安全库存预警功能进行扩展,具体实现以下功能
Configure<AbpRabbitMqEventBusOptions>(options => { /* RabbitMQ配置 */ });- 邮件和RabbitMQ通知:通过 `IEmailSender` 和 `IDistributedEventBus` 实现多渠道预警通知。typeof(AbpEventBusRabbitMqModule) // 添加RabbitMQ模块依赖。库存变更由 `OrderService` 触发,通过分布式事件通知 `InventoryService` 更新库存。
2025-05-24 13:32:29
879
原创 基于领域驱动设计(DDD)理念,使用ABP框架实现的安全库存预警规则功能的完整示例代码及详细解释
`UpdateStatus` 方法根据当前库存和安全库存阈值更新状态,并触发领域事件 `SafetyStockWarningEvent`(定义在下面)。- 属性(如 `Name`、`CurrentStock`)使用私有 `set` 方法,确保只能通过领域方法修改,符合DDD封装性。- `Product` 是聚合根,继承 `AggregateRoot<Guid>`,以 `Guid` 作为主键。- `GET /api/app/product/below-safety-stock`:获取低于安全库存的产品。
2025-05-24 09:21:49
898
原创 基于ABP框架和DDD的实际场景,展示如何利用“约定大于配置”实现一个简单的产品管理模块,包括实体定义、仓储、应用服务和API生成
启动项目:运行`Acme.ECommerce.HttpApi.Host`项目,访问Swagger UI(默认:`https://localhost:44321/swagger`)。- 继承`IRepository<Product, Guid>`,自动获得标准CRUD方法(如`InsertAsync`、`GetAsync`)。- 继承`ApplicationService`,自动获得`ObjectMapper`(AutoMapper)和`Logger`。`ProductCreationDto`用于输入。
2025-05-24 09:21:32
452
原创 ABP 框架中仓储(Repository)方法 FindAsync(x => x.Id == input.Id) 和 FindAsync(input.Id) 的区别
ABP 框架中仓储(Repository)方法 FindAsync(x => x.Id == input.Id) 和 FindAsync(input.Id) 的区别。以下我将详细分析两者的区别,结合 ABP 框架的实现,特别关注注意事项和易错的地方,并与你的 WarehouseArea 项目上下文相关联。目标:比较 FindAsync(x => x.Id == input.Id) 和 FindAsync(input.Id),并说明注意事项及易错点。
2025-05-23 14:43:06
861
原创 展示了一个基于 ABP 框架 和 DDD(领域驱动设计) 的仓储层实现,具体是 `EfCoreMaterialRepository` 类
DDD 中的角色:`EfCoreMaterialRepository` 是 DDD 仓储模式的实现,针对 `Materials` 聚合根提供数据访问,接口 `IMaterialRepository` 定义领域层的契约。- 继承 `EfCoreRepository` 提供了通用 CRUD 操作(如 `AddAsync`, `UpdateAsync`, `DeleteAsync`, `FindAsync` 等),减少了重复代码。`Materials` 实体很可能是聚合根,仓储为其提供数据访问支持。
2025-05-23 11:20:26
509
原创 要进一步增强MES日志分析工具,支持动态规则管理的扩展功能,包括提供API接口以允许外部系统推送规则,以及支持规则优先级(临时规则可覆盖配置文件规则)
要进一步增强MES日志分析工具,支持动态规则管理的扩展功能,包括提供API接口以允许外部系统推送规则,以及支持规则优先级(临时规则可覆盖配置文件规则),我们需要扩展之前的`AdvancedMESLogAnalyzer.cs`代码。- `AddOrUpdateRules`:添加或更新规则,设置`Source`(`API`或`CommandLine`)。- 在报告中显示规则的优先级和来源(`ConfigFile`、`CommandLine`或`API`)。
2025-05-23 10:18:52
687
原创 提供一个基于 SQL Server 数据库的代码生成工具实现方案,针对 tb_warehouse_area 表生成符合 DDD 和 ABP 框架的 CRUD 功能代码
DDD 和 ABP 架构:生成 Domain 层(实体、枚举、仓储接口)、Application 层(DTO、应用服务)、Infrastructure 层(EF Core 配置、仓储实现)、API 层(控制器)。生成的代码包括实体、仓储、DTO、应用服务、EF 配置、控制器和单元测试,完整适配 ABP 框架。以下是默认的 T4 模板示例(用户可覆盖)。其他类型(如 varchar、bigint、datetime)按标准映射(string、long、DateTime)。
2025-05-22 20:25:41
696
原创 基于 .NET Core 8.0 的完整代码生成工具示例,针对 SQL Server 的 tb_warehouse_area 表
以下是一个基于 .NET Core 8.0 的完整代码生成工具示例,针对 SQL Server 的 tb_warehouse_area 表,生成 ABP 框架和 DDD 架构下的代码(实体、仓储、应用服务、DTO、单元测试),支持自定义 T4 模板、增量生成和集成测试。目标:开发一个命令行工具,读取 tb_warehouse_area 表元数据,生成 ABP DDD 代码(实体、仓储、应用服务、DTO、单元测试),支持自定义 T4 模板和增量生成。在 Templates 目录下创建以下 T4 模板文件。
2025-05-22 20:24:41
788
原创 一个基于 .NET Core 8.0 的完整代码生成工具示例
以下是一个基于 .NET Core 8.0 的完整代码生成工具示例,针对 SQL Server 的 tb_warehouse_area 表,生成 ABP 框架和 DDD 架构下的代码(实体、仓储、应用服务、DTO、单元测试),支持自定义 T4 模板、增量生成和集成测试。目标:开发一个命令行工具,读取 tb_warehouse_area 表元数据,生成 ABP DDD 代码(实体、仓储、应用服务、DTO、单元测试),支持自定义 T4 模板和增量生成。在 Templates 目录下创建以下 T4 模板文件。
2025-05-22 13:35:01
1030
原创 在 ABP 框架中,结合领域驱动设计(DDD)的思想,QueryProfiles 的实现通常涉及如何在应用程序中查询和获取数据,并将数据以 JSON 格式返回
在 ABP 框架中,结合领域驱动设计(DDD)的思想,QueryProfiles 的实现通常涉及如何在应用程序中查询和获取数据,并将数据以 JSON 格式返回。输入格式:前端可以发送类似 {"Conditions": [{"Field": "Name", "Value": "John"}, {"Field": "Email", "Value": "example.com"}]} 的 JSON 数据。在 ABP 中,应用服务可以自动生成 API 端点(通过 ABP 的动态 API 功能)。
2025-05-22 08:58:33
638
原创 以下是一个基于 T4 模板 的代码生成工具的实现方案,用于根据数据库表结构自动生成 ABP 框架 的 DDD 项目代码
以下是一个基于 T4 模板 的代码生成工具的实现方案,用于根据数据库表结构自动生成 ABP 框架 的 DDD 项目代码,支持灵活的类型映射(例如 FLOAT 映射为 double,BIGINT 映射为 long),并通过配置文件实现高度可配置性。以下是详细的实现步骤和代码示例,附带中文解释。生成所有层:实体(Domain)、仓储(Domain 和 EF Core)、应用服务(Application)、DTO(Application.Contracts)、API 控制器(HttpApi)。
2025-05-22 07:46:46
1024
原创 要进一步增强MES日志分析工具,支持更复杂的条件(正则表达式或部分匹配的`KeyFields`、调用顺序要求)、动态规则(运行时修改`config.json`、命令行临时规则)以及性能优化
`KeyFieldCondition`类定义`Field`、`MatchType`(`Exact`、`Regex`、`Contains`)和`Pattern`。- 扩展`config.json`,为`KeyFields`添加匹配类型(`Exact`、`Regex`、`Contains`)和模式。- `Exact`:完全相等(如`TraySn`等于“G-1-V400L-W2-H-2024-2-008”)。- 支持`KeyFields`的逻辑组合(如`TraySn`匹配A且`LotSn`匹配B)。
2025-05-22 07:40:16
446
原创 在晶圆级老化测试设备上位机中,高频数据采集需要高效处理以避免界面卡顿、数据丢失或性能瓶颈
如果你的晶圆级老化测试设备数据频率很高(>100 Hz),或需要与其他异步操作(如数据库、网络)集成,推荐使用 Task,因为它更灵活且性能更高。Task 是现代C#异步编程的首选方式,适合处理高频数据采集,优点是代码简洁、支持异步/等待模式,且与WinForms事件循环集成良好。异步读取:Task.Run(() => serialPort.ReadLine()) 将阻塞性IO操作移到线程池,避免主线程卡顿。await this.InvokeAsync(async () => // 异步调用UI线程。
2025-05-21 13:18:13
855
原创 对于超高频数据采集(>1 kHz),使用 Queue<string> 作为缓冲区是有效的解决方案,可以防止数据丢失并优化处理流程
LogMessageAsync("测试停止").GetAwaiter().GetResult();testDataTable.Columns.Add("测试参数", typeof(string));LogMessageAsync("测试开始").GetAwaiter().GetResult();testDataTable.Columns.Add("时间", typeof(string));testDataTable.Columns.Add("结果", typeof(string));
2025-05-21 12:56:10
660
原创 为 `Product` 实体添加扩展属性并触发分布式事件的详细实现,基于 ABP Framework 和你提供的 `WMSManagementDomainModule` 代码上下文
在 `PostConfigureServices` 中,通过 `ObjectExtensionManager` 为 `Product` 实体添加 `BatchNumber` 属性。`WMSManagementDomainMapperProfile` 确保 `Product` 的扩展属性(如 `BatchNumber`)被映射到 `ProductDto`。如果 `BatchNumber` 是高频访问字段,考虑将其提升为 `Product` 实体的固定属性,减少 `ExtraProperties` 的使用。
2025-05-21 08:34:42
600
原创 基于之前的库存管理模块和报表服务,延续DDD和ABP框架的最佳实践
以下是对您提到的八个功能的详细扩展实现,基于之前的库存管理模块和报表服务,延续DDD和ABP框架的最佳实践。每个功能包括详细的实现步骤、代码示例(必要时提供完整的<xaiArtifact>),以及功能的价值和扩展性分析。- 在 `Product` 和 `InventorySnapshot` 中添加 `WarehouseId` 和 `WarehouseName`。在 `ReportService.Application.Contracts` 中扩展 `GenerateReportDto`。
2025-05-20 18:09:38
532
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人