完善基础数据
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
using F9WebAiTest.Application.Common.Exceptions;
|
||||
using F9WebAiTest.Application.Interfaces.SnowflakeID;
|
||||
using F9WebAiTest.Domain.Entities.SYS.Zq;
|
||||
using F9WebAiTest.Domain.Interfaces.SYS.Zq;
|
||||
using MediatR;
|
||||
|
||||
namespace F9WebAiTest.Application.CQRS.SYS.Zq.Commands;
|
||||
|
||||
/// <summary>新增账期</summary>
|
||||
public record Zhangqi_CreateCommand(int Year, int Month, DateTime StartDate, DateTime EndDate) : IRequest<long>;
|
||||
|
||||
public class CreateZhangqiCommandHandler(
|
||||
IZhangqiWriteRepository zhangqiRepository,
|
||||
ISnowflakeIdGenerator snowflakeIdGenerator,
|
||||
IPublisher eventBus) : IRequestHandler<Zhangqi_CreateCommand, long>
|
||||
{
|
||||
public async Task<long> Handle(Zhangqi_CreateCommand command, CancellationToken cancellationToken)
|
||||
{
|
||||
if (command.StartDate > command.EndDate) throw new F9OperationException("开始日期不能大于截止日期");
|
||||
|
||||
var entity = new Zhangqi(snowflakeIdGenerator.CreateId(), command.Year, command.Month,
|
||||
command.StartDate, command.EndDate);
|
||||
|
||||
var result = await zhangqiRepository.AddAsync(entity);
|
||||
if (result == false) throw new F9OperationException("账期", "新增");
|
||||
|
||||
foreach (var de in entity.DomainEvents) await eventBus.Publish(de, cancellationToken);
|
||||
entity.ClearDomainEvents();
|
||||
|
||||
return entity.Id;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>修改账期</summary>
|
||||
public record Zhangqi_UpdateCommand(long Id, int Year, int Month, DateTime StartDate, DateTime EndDate) : IRequest<bool>;
|
||||
|
||||
public class UpdateZhangqiCommandHandler(
|
||||
IZhangqiWriteRepository zhangqiRepository,
|
||||
IPublisher eventBus) : IRequestHandler<Zhangqi_UpdateCommand, bool>
|
||||
{
|
||||
public async Task<bool> Handle(Zhangqi_UpdateCommand command, CancellationToken cancellationToken)
|
||||
{
|
||||
if (command.StartDate > command.EndDate) throw new F9OperationException("开始日期不能大于截止日期");
|
||||
|
||||
var entity = await zhangqiRepository.GetByIdAsync(command.Id, cancellationToken)
|
||||
?? throw new F9NotFoundException("账期不存在");
|
||||
|
||||
if (entity.IsZhaZhang) throw new F9OperationException("账期已扎帐,请先取消扎帐后再修改");
|
||||
|
||||
entity.Update(command.Year, command.Month, command.StartDate, command.EndDate);
|
||||
|
||||
var result = await zhangqiRepository.UpdateAsync(entity);
|
||||
if (result == false) throw new F9OperationException("账期", "修改");
|
||||
|
||||
foreach (var de in entity.DomainEvents) await eventBus.Publish(de, cancellationToken);
|
||||
entity.ClearDomainEvents();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>删除账期</summary>
|
||||
public record Zhangqi_DelCommand(long Id) : IRequest<bool>;
|
||||
|
||||
public class DelZhangqiCommandHandler(
|
||||
IZhangqiWriteRepository zhangqiRepository,
|
||||
IPublisher eventBus) : IRequestHandler<Zhangqi_DelCommand, bool>
|
||||
{
|
||||
public async Task<bool> Handle(Zhangqi_DelCommand command, CancellationToken cancellationToken)
|
||||
{
|
||||
var entity = await zhangqiRepository.GetByIdAsync(command.Id, cancellationToken)
|
||||
?? throw new F9NotFoundException("账期不存在");
|
||||
|
||||
if (entity.IsZhaZhang) throw new F9OperationException("账期已扎帐,请先取消扎帐后再删除");
|
||||
|
||||
var result = await zhangqiRepository.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;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>扎帐 / 取消扎帐(扎帐后账期内业务数据禁止修改)</summary>
|
||||
public record Zhangqi_ZhaZhangCommand(long Id, bool IsZhaZhang) : IRequest<bool>;
|
||||
|
||||
public class ZhaZhangCommandHandler(
|
||||
IZhangqiWriteRepository zhangqiRepository,
|
||||
IPublisher eventBus) : IRequestHandler<Zhangqi_ZhaZhangCommand, bool>
|
||||
{
|
||||
public async Task<bool> Handle(Zhangqi_ZhaZhangCommand command, CancellationToken cancellationToken)
|
||||
{
|
||||
var entity = await zhangqiRepository.GetByIdAsync(command.Id, cancellationToken)
|
||||
?? throw new F9NotFoundException("账期不存在");
|
||||
|
||||
if (entity.IsZhaZhang == command.IsZhaZhang)
|
||||
throw new F9OperationException(command.IsZhaZhang ? "该账期已扎帐" : "该账期未扎帐");
|
||||
|
||||
entity.SetZhaZhang(command.IsZhaZhang);
|
||||
|
||||
var result = await zhangqiRepository.SetZhaZhangAsync(command.Id, command.IsZhaZhang);
|
||||
if (result == false) throw new F9OperationException(command.IsZhaZhang ? "扎帐" : "取消扎帐", "操作");
|
||||
|
||||
foreach (var de in entity.DomainEvents) await eventBus.Publish(de, cancellationToken);
|
||||
entity.ClearDomainEvents();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
using F9WebAiTest.Application.Common;
|
||||
using F9WebAiTest.Application.Dtos.SYS.Zq;
|
||||
using F9WebAiTest.Application.Interfaces.Repositories.SYS.Zq;
|
||||
using F9WebAiTest.Application.Interfaces.SnowflakeID;
|
||||
using F9WebAiTest.Domain.Entities.SYS.Zq;
|
||||
using F9WebAiTest.Domain.Interfaces.SYS.Zq;
|
||||
using MediatR;
|
||||
|
||||
namespace F9WebAiTest.Application.CQRS.SYS.Zq.Queries;
|
||||
|
||||
/// <summary>账期分页查询(按年度筛选)</summary>
|
||||
public record GetZhangqiPagedQuery(int? Year = null, string Keyword = "", int PageIndex = 1, int PageSize = 20)
|
||||
: IRequest<PageResult<ZhangqiReadDto_View>>;
|
||||
|
||||
public class GetZhangqiPagedQueryHandler(IZhangqiReadRepository readRepository)
|
||||
: IRequestHandler<GetZhangqiPagedQuery, PageResult<ZhangqiReadDto_View>>
|
||||
{
|
||||
public async Task<PageResult<ZhangqiReadDto_View>> Handle(GetZhangqiPagedQuery query, CancellationToken ct)
|
||||
=> await readRepository.GetPagedAsync(query.Year, query.Keyword, query.PageIndex, query.PageSize);
|
||||
}
|
||||
|
||||
/// <summary>按 Id 查询账期(编辑回显)</summary>
|
||||
public record GetZhangqiByIdQuery(long Id) : IRequest<ZhangqiReadDto_Edit>;
|
||||
|
||||
public class GetZhangqiByIdQueryHandler(IZhangqiReadRepository readRepository)
|
||||
: IRequestHandler<GetZhangqiByIdQuery, ZhangqiReadDto_Edit>
|
||||
{
|
||||
public async Task<ZhangqiReadDto_Edit> Handle(GetZhangqiByIdQuery query, CancellationToken ct)
|
||||
=> await readRepository.GetByIdForEditAsync(query.Id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 按日期取所属账期:不存在时按"每月 28 日"划分规则自动创建
|
||||
/// (日期 ≤ 28 号:上月 29 日 ~ 本月 28 日;日期 > 28 号:本月 29 日 ~ 下月 28 日)。
|
||||
/// </summary>
|
||||
public record GetZhangqiByDateQuery(DateTime Date) : IRequest<ZhangqiReadDto_Edit>;
|
||||
|
||||
public class GetZhangqiByDateQueryHandler(
|
||||
IZhangqiReadRepository readRepository,
|
||||
IZhangqiWriteRepository writeRepository,
|
||||
ISnowflakeIdGenerator snowflakeIdGenerator) : IRequestHandler<GetZhangqiByDateQuery, ZhangqiReadDto_Edit>
|
||||
{
|
||||
public async Task<ZhangqiReadDto_Edit> Handle(GetZhangqiByDateQuery query, CancellationToken ct)
|
||||
{
|
||||
var exist = await readRepository.GetByDateAsync(query.Date);
|
||||
if (exist != null) return exist;
|
||||
|
||||
var (startDate, endDate) = CalcRange(query.Date);
|
||||
|
||||
var entity = new Zhangqi(snowflakeIdGenerator.CreateId(), endDate.Year, endDate.Month, startDate, endDate);
|
||||
await writeRepository.AddAsync(entity);
|
||||
|
||||
return new ZhangqiReadDto_Edit(entity.Id, entity.Year, entity.Month, entity.StartDate, entity.EndDate, entity.IsZhaZhang);
|
||||
}
|
||||
|
||||
/// <summary>按 28 日边界推算账期区间(截止日期取当天 23:59:59)</summary>
|
||||
private static (DateTime StartDate, DateTime EndDate) CalcRange(DateTime date)
|
||||
{
|
||||
DateTime startDate;
|
||||
DateTime endDay;
|
||||
|
||||
if (date.Day <= 28)
|
||||
{
|
||||
var lastMonth = date.AddMonths(-1);
|
||||
startDate = new DateTime(lastMonth.Year, lastMonth.Month, 28).AddDays(1);
|
||||
endDay = new DateTime(date.Year, date.Month, 28);
|
||||
}
|
||||
else
|
||||
{
|
||||
var nextMonth = date.AddMonths(1);
|
||||
startDate = new DateTime(date.Year, date.Month, 28).AddDays(1);
|
||||
endDay = new DateTime(nextMonth.Year, nextMonth.Month, 28);
|
||||
}
|
||||
|
||||
return (startDate, endDay.Date.AddDays(1).AddSeconds(-1));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>指定年月是否已扎帐</summary>
|
||||
public record GetZhangqiIsZhaZhangQuery(int Year, int Month) : IRequest<bool>;
|
||||
|
||||
public class GetZhangqiIsZhaZhangQueryHandler(IZhangqiReadRepository readRepository)
|
||||
: IRequestHandler<GetZhangqiIsZhaZhangQuery, bool>
|
||||
{
|
||||
public async Task<bool> Handle(GetZhangqiIsZhaZhangQuery query, CancellationToken ct)
|
||||
=> await readRepository.GetIsZhaZhangAsync(query.Year, query.Month);
|
||||
}
|
||||
|
||||
/// <summary>指定日期所属账期是否已扎帐</summary>
|
||||
public record GetZhangqiIsZhaZhangByDateQuery(DateTime Date) : IRequest<bool>;
|
||||
|
||||
public class GetZhangqiIsZhaZhangByDateQueryHandler(IZhangqiReadRepository readRepository)
|
||||
: IRequestHandler<GetZhangqiIsZhaZhangByDateQuery, bool>
|
||||
{
|
||||
public async Task<bool> Handle(GetZhangqiIsZhaZhangByDateQuery query, CancellationToken ct)
|
||||
=> await readRepository.GetIsZhaZhangByDateAsync(query.Date);
|
||||
}
|
||||
Reference in New Issue
Block a user