using F9WebAiTest.Application.Common.Exceptions; using F9WebAiTest.Application.Interfaces.SnowflakeID; using F9WebAiTest.Domain.Entities.SYS.Gongyingshangs; using F9WebAiTest.Domain.Enums.SYS.Gongyingshangs; using F9WebAiTest.Domain.Interfaces.SYS.Gongyingshangs; using MediatR; namespace F9WebAiTest.Application.CQRS.SYS.Gongyingshangs.Commands; /// 新增往来单位 public record Gongyingshang_CreateCommand(string Name, Gys_Type_Enum Type, Gys_Group_Enum Group, string Address, string Lianxiren, string Phone, string Pinyin, Gys_SaleType_Enum SaleType) : IRequest; public class CreateGongyingshangCommandHandler( IGongyingshangWriteRepository repository, ISnowflakeIdGenerator snowflakeIdGenerator, IPublisher eventBus) : IRequestHandler { public async Task Handle(Gongyingshang_CreateCommand command, CancellationToken cancellationToken) { if (string.IsNullOrWhiteSpace(command.Name)) throw new F9OperationException("往来单位名称不能为空"); var entity = new Gongyingshang(snowflakeIdGenerator.CreateId(), command.Type, command.Name.Trim(), command.Phone ?? string.Empty, command.Lianxiren ?? string.Empty, command.Address ?? string.Empty, string.IsNullOrWhiteSpace(command.Pinyin) ? BuildPinyin(command.Name) : command.Pinyin.Trim(), command.Group, command.SaleType); var result = await repository.AddAsync(entity); if (result == false) throw new F9OperationException("往来单位", "新增"); foreach (var de in entity.DomainEvents) await eventBus.Publish(de, cancellationToken); entity.ClearDomainEvents(); return entity.Id; } /// 未填写简码时按名称生成(中文取拼音首字母能力有限,这里退化为首字) internal static string BuildPinyin(string name) => (name ?? string.Empty).Trim() is { Length: > 0 } n ? n[..1] : string.Empty; } /// 修改往来单位 public record Gongyingshang_UpdateCommand(long Id, string Name, Gys_Type_Enum Type, Gys_Group_Enum Group, string Address, string Lianxiren, string Phone, string Pinyin, Gys_SaleType_Enum SaleType) : IRequest; public class UpdateGongyingshangCommandHandler( IGongyingshangWriteRepository repository, IPublisher eventBus) : IRequestHandler { public async Task Handle(Gongyingshang_UpdateCommand command, CancellationToken cancellationToken) { var entity = await repository.GetByIdAsync(command.Id, cancellationToken) ?? throw new F9NotFoundException("往来单位不存在"); if (string.IsNullOrWhiteSpace(command.Name)) throw new F9OperationException("往来单位名称不能为空"); entity.Update(command.Type, command.Name.Trim(), command.Phone ?? string.Empty, command.Lianxiren ?? string.Empty, command.Address ?? string.Empty, command.Pinyin ?? string.Empty, command.Group, command.SaleType); var result = await repository.UpdateAsync(entity); if (result == false) throw new F9OperationException("往来单位", "修改"); foreach (var de in entity.DomainEvents) await eventBus.Publish(de, cancellationToken); entity.ClearDomainEvents(); return true; } } /// 删除往来单位 public record Gongyingshang_DelCommand(long Id) : IRequest; public class DelGongyingshangCommandHandler( IGongyingshangWriteRepository repository, IPublisher eventBus) : IRequestHandler { public async Task Handle(Gongyingshang_DelCommand command, CancellationToken cancellationToken) { var entity = await repository.GetByIdAsync(command.Id, cancellationToken) ?? throw new F9NotFoundException("往来单位不存在"); var result = await repository.SoftDeleteAsync(command.Id); if (result == false) throw new F9OperationException("往来单位", "删除"); entity.Deleted(); foreach (var de in entity.DomainEvents) await eventBus.Publish(de, cancellationToken); entity.ClearDomainEvents(); return true; } }