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;
}
}