using F9WebAiTest.Application.Common.Exceptions; using F9WebAiTest.Application.Dtos.SYS.Employees; using F9WebAiTest.Application.Interfaces.Repositories.SYS.Employees; using F9WebAiTest.Application.Interfaces.SnowflakeID; using F9WebAiTest.Domain.Entities.SYS.Employees; using F9WebAiTest.Domain.Enums.SYS.Employees; using F9WebAiTest.Domain.Interfaces.SYS.Employees; using MediatR; namespace F9WebAiTest.Application.CQRS.SYS.Employees.Commands; /// 新增职工(同时写一条"新入职"变更记录) public record Employee_CreateCommand( long DepId, long WorktypeId, string Code, string Name, string Gangwei, string Phone, string IdCard, DateTime? BirthDate, string Address, string Gender, string Minzu, string HunyinStatus, string Huji, DateTime? RuzhiDate, string JinjiLianxiren, string JinjiLianxirenPhone, string HetongType, DateTime? HetongStartDate, DateTime? HetongEndDate, DateTime? TuixiuDate, DateTime? ShebaoDate, string ShebaoDesc, string BankcardCode, string BiyeYuanxiao, string Zhuanye, string Xueli, Prod_Banci_Enum? Banci, string WorkGroup, int Sort, string NamePinyin, string Memo) : IRequest; public class CreateEmployeeCommandHandler( IEmployeeWriteRepository repository, IEmployeeReadRepository readRepository, ISnowflakeIdGenerator snowflakeIdGenerator, IPublisher eventBus) : IRequestHandler { public async Task Handle(Employee_CreateCommand command, CancellationToken cancellationToken) { if (command.DepId <= 0) throw new F9OperationException("请选择部门"); if (string.IsNullOrWhiteSpace(command.Name)) throw new F9OperationException("请输入姓名"); var entity = new Employee(snowflakeIdGenerator.CreateId(), command.DepId, command.WorktypeId, Employee_WorkStatus_Enum.在职, command.Code ?? string.Empty, command.Name.Trim(), command.Gangwei ?? string.Empty, command.Phone ?? string.Empty, command.IdCard ?? string.Empty, command.BirthDate, command.Address ?? string.Empty, command.Gender ?? string.Empty, command.Minzu ?? string.Empty, command.HunyinStatus ?? string.Empty, command.Huji ?? string.Empty, command.RuzhiDate, null, null, false, command.JinjiLianxiren ?? string.Empty, command.JinjiLianxirenPhone ?? string.Empty, command.HetongType ?? string.Empty, command.HetongStartDate, command.HetongEndDate, command.TuixiuDate, command.ShebaoDate, command.ShebaoDesc ?? string.Empty, command.BankcardCode ?? string.Empty, command.BiyeYuanxiao ?? string.Empty, command.Zhuanye ?? string.Empty, command.Xueli ?? string.Empty, command.Banci, command.WorkGroup ?? string.Empty, command.Sort, command.NamePinyin ?? string.Empty, command.Memo ?? string.Empty, string.Empty); var result = await repository.AddAsync(entity); if (result == false) throw new F9OperationException("职工", "新增"); // 变更记录:新入职 var depName = await readRepository.GetDepNameAsync(entity.DepId); var worktypeName = await readRepository.GetWorktypeNameAsync(entity.WorktypeId); await readRepository.AddChangeRecordAsync(new EmployeeChangeRecordDto(0, entity.Id, entity.RuzhiDate ?? DateTime.Now.Date, Employee_ChangeStatus_Enum.新入职, "", $"{depName},{worktypeName}", "新入职")); foreach (var de in entity.DomainEvents) await eventBus.Publish(de, cancellationToken); entity.ClearDomainEvents(); return entity.Id; } } /// 修改职工基本信息 public record Employee_UpdateCommand( long Id, string Code, string Name, string Gangwei, string Phone, string IdCard, DateTime? BirthDate, string Address, string Gender, string Minzu, string HunyinStatus, string Huji, DateTime? RuzhiDate, string JinjiLianxiren, string JinjiLianxirenPhone, string HetongType, DateTime? HetongStartDate, DateTime? HetongEndDate, DateTime? TuixiuDate, DateTime? ShebaoDate, string ShebaoDesc, string BankcardCode, string BiyeYuanxiao, string Zhuanye, string Xueli, string NamePinyin, string Memo) : IRequest; public class UpdateEmployeeCommandHandler( IEmployeeWriteRepository repository, IPublisher eventBus) : IRequestHandler { public async Task Handle(Employee_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.Code ?? string.Empty, command.Name.Trim(), command.Gangwei ?? string.Empty, command.Phone ?? string.Empty, command.IdCard ?? string.Empty, command.BirthDate, command.Address ?? string.Empty, command.Gender ?? string.Empty, command.Minzu ?? string.Empty, command.HunyinStatus ?? string.Empty, command.Huji ?? string.Empty, command.RuzhiDate, command.JinjiLianxiren ?? string.Empty, command.JinjiLianxirenPhone ?? string.Empty, command.HetongType ?? string.Empty, command.HetongStartDate, command.HetongEndDate, command.TuixiuDate, command.ShebaoDate, command.ShebaoDesc ?? string.Empty, command.BankcardCode ?? string.Empty, command.BiyeYuanxiao ?? string.Empty, command.Zhuanye ?? string.Empty, command.Xueli ?? string.Empty, command.NamePinyin ?? string.Empty, command.Memo ?? string.Empty); 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 Employee_DelCommand(long Id) : IRequest; public class DelEmployeeCommandHandler( IEmployeeWriteRepository repository, IPublisher eventBus) : IRequestHandler { public async Task Handle(Employee_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; } } /// 转正(写"转正"变更记录) public record Employee_ZhuanzhengCommand(long Id, DateTime ZhuanzhengDate) : IRequest; public class ZhuanzhengCommandHandler( IEmployeeWriteRepository repository, IEmployeeReadRepository readRepository, IPublisher eventBus) : IRequestHandler { public async Task Handle(Employee_ZhuanzhengCommand command, CancellationToken cancellationToken) { var entity = await repository.GetByIdAsync(command.Id, cancellationToken) ?? throw new F9NotFoundException("职工不存在"); if (entity.IsZhuanzheng) throw new F9OperationException("该职工已转正"); entity.Zhuanzheng(command.ZhuanzhengDate); var result = await repository.UpdateAsync(entity); if (result == false) throw new F9OperationException("转正", "操作"); var depName = await readRepository.GetDepNameAsync(entity.DepId); var worktypeName = await readRepository.GetWorktypeNameAsync(entity.WorktypeId); await readRepository.AddChangeRecordAsync(new EmployeeChangeRecordDto(0, entity.Id, command.ZhuanzhengDate, Employee_ChangeStatus_Enum.转正, "", $"{depName},{worktypeName}", "转正")); foreach (var de in entity.DomainEvents) await eventBus.Publish(de, cancellationToken); entity.ClearDomainEvents(); return true; } } /// 取消转正 public record Employee_ZhuanzhengCancelCommand(long Id) : IRequest; public class ZhuanzhengCancelCommandHandler( IEmployeeWriteRepository repository, IPublisher eventBus) : IRequestHandler { public async Task Handle(Employee_ZhuanzhengCancelCommand command, CancellationToken cancellationToken) { var entity = await repository.GetByIdAsync(command.Id, cancellationToken) ?? throw new F9NotFoundException("职工不存在"); entity.ZhuanzhengCancel(); 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 Employee_LizhiCommand(long Id, DateTime LizhiDate, string LizhiYuanyin) : IRequest; public class LizhiCommandHandler( IEmployeeWriteRepository repository, IEmployeeReadRepository readRepository, IPublisher eventBus) : IRequestHandler { public async Task Handle(Employee_LizhiCommand command, CancellationToken cancellationToken) { var entity = await repository.GetByIdAsync(command.Id, cancellationToken) ?? throw new F9NotFoundException("职工不存在"); if (entity.WorkStatus == Employee_WorkStatus_Enum.离职) throw new F9OperationException("该职工已离职"); entity.Lizhi(command.LizhiDate, command.LizhiYuanyin); var result = await repository.UpdateAsync(entity); if (result == false) throw new F9OperationException("离职", "操作"); var depName = await readRepository.GetDepNameAsync(entity.DepId); var worktypeName = await readRepository.GetWorktypeNameAsync(entity.WorktypeId); await readRepository.AddChangeRecordAsync(new EmployeeChangeRecordDto(0, entity.Id, command.LizhiDate, Employee_ChangeStatus_Enum.离职, "", $"{depName},{worktypeName}", command.LizhiYuanyin ?? string.Empty)); foreach (var de in entity.DomainEvents) await eventBus.Publish(de, cancellationToken); entity.ClearDomainEvents(); return true; } } /// 取消离职 public record Employee_LizhiCancelCommand(long Id) : IRequest; public class LizhiCancelCommandHandler( IEmployeeWriteRepository repository, IPublisher eventBus) : IRequestHandler { public async Task Handle(Employee_LizhiCancelCommand command, CancellationToken cancellationToken) { var entity = await repository.GetByIdAsync(command.Id, cancellationToken) ?? throw new F9NotFoundException("职工不存在"); entity.LizhiCancel(); 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 Employee_TiaogangCommand(long Id, long DepId, long WorkTypeId, DateTime Date, string GangweiName, Prod_Banci_Enum? Sc_Banci) : IRequest; public class TiaogangCommandHandler( IEmployeeWriteRepository repository, IEmployeeReadRepository readRepository, IPublisher eventBus) : IRequestHandler { public async Task Handle(Employee_TiaogangCommand command, CancellationToken cancellationToken) { var entity = await repository.GetByIdAsync(command.Id, cancellationToken) ?? throw new F9NotFoundException("职工不存在"); if (command.DepId <= 0) throw new F9OperationException("请选择部门"); if (entity.WorkStatus == Employee_WorkStatus_Enum.离职) throw new F9OperationException("离职人员请使用「重新入职」"); var oldDepId = entity.DepId; var oldWorktypeId = entity.WorktypeId; entity.Tiaogang(command.DepId, command.WorkTypeId, command.GangweiName, command.Sc_Banci); var result = await repository.UpdateAsync(entity); if (result == false) throw new F9OperationException("调岗", "操作"); await readRepository.AddTiaogangRecordAsync(entity.Id, oldDepId, oldWorktypeId, command.DepId, command.WorkTypeId, command.Date); var depName = await readRepository.GetDepNameAsync(command.DepId); var worktypeName = await readRepository.GetWorktypeNameAsync(command.WorkTypeId); await readRepository.AddChangeRecordAsync(new EmployeeChangeRecordDto(0, entity.Id, command.Date, Employee_ChangeStatus_Enum.调岗, "", $"{depName},{worktypeName}", "调动")); foreach (var de in entity.DomainEvents) await eventBus.Publish(de, cancellationToken); entity.ClearDomainEvents(); return true; } } /// 重新入职(离职人员) public record Employee_RenewRuzhiCommand(long Id, long DepId, long WorkTypeId, DateTime Date, string GangweiName, Prod_Banci_Enum? Sc_Banci) : IRequest; public class RenewRuzhiCommandHandler( IEmployeeWriteRepository repository, IEmployeeReadRepository readRepository, IPublisher eventBus) : IRequestHandler { public async Task Handle(Employee_RenewRuzhiCommand command, CancellationToken cancellationToken) { var entity = await repository.GetByIdAsync(command.Id, cancellationToken) ?? throw new F9NotFoundException("职工不存在"); if (entity.WorkStatus != Employee_WorkStatus_Enum.离职) throw new F9OperationException("请选择离职人员"); if (command.DepId <= 0) throw new F9OperationException("请选择部门"); var oldDepId = entity.DepId; var oldWorktypeId = entity.WorktypeId; entity.RenewRuzhi(command.Date, command.DepId, command.WorkTypeId, command.GangweiName, command.Sc_Banci); var result = await repository.UpdateAsync(entity); if (result == false) throw new F9OperationException("重新入职", "操作"); await readRepository.AddTiaogangRecordAsync(entity.Id, oldDepId, oldWorktypeId, command.DepId, command.WorkTypeId, command.Date); var depName = await readRepository.GetDepNameAsync(command.DepId); var worktypeName = await readRepository.GetWorktypeNameAsync(command.WorkTypeId); await readRepository.AddChangeRecordAsync(new EmployeeChangeRecordDto(0, entity.Id, command.Date, Employee_ChangeStatus_Enum.再入职, "", $"{depName},{worktypeName}", "再入职")); foreach (var de in entity.DomainEvents) await eventBus.Publish(de, cancellationToken); entity.ClearDomainEvents(); return true; } } /// 修改生产信息(工作组 / 顺序号) public record Employee_UpdateScCommand(long Id, string Sc_WorkGroup, int Sc_Sort) : IRequest; public class UpdateScCommandHandler( IEmployeeWriteRepository repository, IPublisher eventBus) : IRequestHandler { public async Task Handle(Employee_UpdateScCommand command, CancellationToken cancellationToken) { var entity = await repository.GetByIdAsync(command.Id, cancellationToken) ?? throw new F9NotFoundException("职工不存在"); entity.UpdateSc(command.Sc_WorkGroup, command.Sc_Sort); 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; } }