using F9WebAiTest.Application.Common; using F9WebAiTest.Application.Common.Exceptions; using F9WebAiTest.Application.CQRS.SYS.Zq.Commands; using F9WebAiTest.Application.CQRS.SYS.Zq.Queries; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace F9WebAiTest.Api.Controllers; /// 账期管理(DDD + CQRS):账期维护 + 扎帐/取消扎帐 + 按日期取账期 [ApiController] [Route("api/sys/zhangqi")] [Authorize] public class SysZhangqiController : ControllerBase { private readonly IMediator _mediator; public SysZhangqiController(IMediator mediator) => _mediator = mediator; /// 分页查询(按年度筛选) [HttpGet] public async Task GetPaged([FromQuery] int? year, [FromQuery] string keyword, [FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 20) => Ok(ApiResult.Ok(await _mediator.Send(new GetZhangqiPagedQuery(year, keyword ?? string.Empty, pageIndex, pageSize)))); /// 按日期取所属账期(不存在时按 28 日规则自动创建) [HttpGet("by-date")] public async Task GetByDate([FromQuery] DateTime date) { try { return Ok(ApiResult.Ok(await _mediator.Send(new GetZhangqiByDateQuery(date)))); } catch (F9NotFoundException ex) { return NotFound(ApiResult.Fail(ex.Message, 404)); } catch (F9OperationException ex) { return BadRequest(ApiResult.Fail(ex.Message, 400)); } } /// 指定年月是否已扎帐 [HttpGet("is-zhazhang")] public async Task GetIsZhaZhang([FromQuery] int year, [FromQuery] int month) => Ok(ApiResult.Ok(await _mediator.Send(new GetZhangqiIsZhaZhangQuery(year, month)))); /// 指定日期所属账期是否已扎帐 [HttpGet("is-zhazhang-by-date")] public async Task GetIsZhaZhangByDate([FromQuery] DateTime date) => Ok(ApiResult.Ok(await _mediator.Send(new GetZhangqiIsZhaZhangByDateQuery(date)))); [HttpGet("{id}")] public async Task GetById(long id) { try { return Ok(ApiResult.Ok(await _mediator.Send(new GetZhangqiByIdQuery(id)))); } catch (F9NotFoundException ex) { return NotFound(ApiResult.Fail(ex.Message, 404)); } catch (F9OperationException ex) { return BadRequest(ApiResult.Fail(ex.Message, 400)); } } [HttpPost] public async Task Create([FromBody] Zhangqi_CreateCommand command) { try { return Ok(ApiResult.Ok(new { id = await _mediator.Send(command) }, "新增成功")); } catch (F9NotFoundException ex) { return NotFound(ApiResult.Fail(ex.Message, 404)); } catch (F9OperationException ex) { return BadRequest(ApiResult.Fail(ex.Message, 400)); } } [HttpPut("{id}")] public async Task Update(long id, [FromBody] Zhangqi_UpdateCommand command) { try { return Ok(ApiResult.Ok(await _mediator.Send(command with { Id = id }), "修改成功")); } catch (F9NotFoundException ex) { return NotFound(ApiResult.Fail(ex.Message, 404)); } catch (F9OperationException ex) { return BadRequest(ApiResult.Fail(ex.Message, 400)); } } [HttpDelete("{id}")] public async Task Delete(long id) { try { return Ok(ApiResult.Ok(await _mediator.Send(new Zhangqi_DelCommand(id)), "删除成功")); } catch (F9NotFoundException ex) { return NotFound(ApiResult.Fail(ex.Message, 404)); } catch (F9OperationException ex) { return BadRequest(ApiResult.Fail(ex.Message, 400)); } } /// 扎帐 / 取消扎帐 [HttpPut("{id}/zhazhang")] public async Task ZhaZhang(long id, [FromBody] Zhangqi_ZhaZhangCommand command) { try { return Ok(ApiResult.Ok(await _mediator.Send(command with { Id = id }), "操作成功")); } catch (F9NotFoundException ex) { return NotFound(ApiResult.Fail(ex.Message, 404)); } catch (F9OperationException ex) { return BadRequest(ApiResult.Fail(ex.Message, 400)); } } }