修改controller包

This commit is contained in:
2025-11-05 17:24:19 +08:00
parent 4cae93ef34
commit ef4ca397ce
11 changed files with 449 additions and 354 deletions

View File

@@ -1,6 +1,7 @@
package management
import (
"context"
"errors"
"strconv"
@@ -15,14 +16,14 @@ import (
// PigFarmController 负责处理猪舍和猪栏相关的API请求
type PigFarmController struct {
logger *logs.Logger
ctx context.Context
service service.PigFarmService
}
// NewPigFarmController 创建一个新的 PigFarmController 实例
func NewPigFarmController(logger *logs.Logger, service service.PigFarmService) *PigFarmController {
func NewPigFarmController(ctx context.Context, service service.PigFarmService) *PigFarmController {
return &PigFarmController{
logger: logger,
ctx: ctx,
service: service,
}
}
@@ -40,16 +41,17 @@ func NewPigFarmController(logger *logs.Logger, service service.PigFarmService) *
// @Success 201 {object} controller.Response{data=dto.PigHouseResponse} "创建成功"
// @Router /api/v1/pig-houses [post]
func (c *PigFarmController) CreatePigHouse(ctx echo.Context) error {
reqCtx, logger := logs.Trace(ctx.Request().Context(), c.ctx, "CreatePigHouse")
const action = "创建猪舍"
var req dto.CreatePigHouseRequest
if err := ctx.Bind(&req); err != nil {
c.logger.Errorf("%s: 参数绑定失败: %v", action, err)
logger.Errorf("%s: 参数绑定失败: %v", action, err)
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的请求体", action, "请求体绑定失败", req)
}
house, err := c.service.CreatePigHouse(req.Name, req.Description)
house, err := c.service.CreatePigHouse(reqCtx, req.Name, req.Description)
if err != nil {
c.logger.Errorf("%s: 业务逻辑失败: %v", action, err)
logger.Errorf("%s: 业务逻辑失败: %v", action, err)
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "创建猪舍失败", action, "业务逻辑失败", req)
}
@@ -66,18 +68,19 @@ func (c *PigFarmController) CreatePigHouse(ctx echo.Context) error {
// @Success 200 {object} controller.Response{data=dto.PigHouseResponse} "获取成功"
// @Router /api/v1/pig-houses/{id} [get]
func (c *PigFarmController) GetPigHouse(ctx echo.Context) error {
reqCtx, logger := logs.Trace(ctx.Request().Context(), c.ctx, "GetPigHouse")
const action = "获取猪舍"
id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
if err != nil {
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID格式", action, "ID格式错误", ctx.Param("id"))
}
house, err := c.service.GetPigHouseByID(uint(id))
house, err := c.service.GetPigHouseByID(reqCtx, uint(id))
if err != nil {
if errors.Is(err, service.ErrHouseNotFound) {
return controller.SendErrorWithAudit(ctx, controller.CodeNotFound, "猪舍不存在", action, "猪舍不存在", id)
}
c.logger.Errorf("%s: 业务逻辑失败: %v", action, err)
logger.Errorf("%s: 业务逻辑失败: %v", action, err)
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "获取猪舍失败", action, "业务逻辑失败", id)
}
@@ -93,10 +96,11 @@ func (c *PigFarmController) GetPigHouse(ctx echo.Context) error {
// @Success 200 {object} controller.Response{data=[]dto.PigHouseResponse} "获取成功"
// @Router /api/v1/pig-houses [get]
func (c *PigFarmController) ListPigHouses(ctx echo.Context) error {
reqCtx, logger := logs.Trace(ctx.Request().Context(), c.ctx, "ListPigHouses")
const action = "获取猪舍列表"
houses, err := c.service.ListPigHouses()
houses, err := c.service.ListPigHouses(reqCtx)
if err != nil {
c.logger.Errorf("%s: 业务逻辑失败: %v", action, err)
logger.Errorf("%s: 业务逻辑失败: %v", action, err)
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "获取列表失败", action, "业务逻辑失败", nil)
}
@@ -115,6 +119,7 @@ func (c *PigFarmController) ListPigHouses(ctx echo.Context) error {
// @Success 200 {object} controller.Response{data=dto.PigHouseResponse} "更新成功"
// @Router /api/v1/pig-houses/{id} [put]
func (c *PigFarmController) UpdatePigHouse(ctx echo.Context) error {
reqCtx, logger := logs.Trace(ctx.Request().Context(), c.ctx, "UpdatePigHouse")
const action = "更新猪舍"
id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
if err != nil {
@@ -126,12 +131,12 @@ func (c *PigFarmController) UpdatePigHouse(ctx echo.Context) error {
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的请求体", action, "请求体绑定失败", req)
}
house, err := c.service.UpdatePigHouse(uint(id), req.Name, req.Description)
house, err := c.service.UpdatePigHouse(reqCtx, uint(id), req.Name, req.Description)
if err != nil {
if errors.Is(err, service.ErrHouseNotFound) {
return controller.SendErrorWithAudit(ctx, controller.CodeNotFound, "猪舍不存在", action, "猪舍不存在", id)
}
c.logger.Errorf("%s: 业务逻辑失败: %v", action, err)
logger.Errorf("%s: 业务逻辑失败: %v", action, err)
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "更新失败", action, "业务逻辑失败", req)
}
@@ -148,13 +153,14 @@ func (c *PigFarmController) UpdatePigHouse(ctx echo.Context) error {
// @Success 200 {object} controller.Response "删除成功"
// @Router /api/v1/pig-houses/{id} [delete]
func (c *PigFarmController) DeletePigHouse(ctx echo.Context) error {
reqCtx, logger := logs.Trace(ctx.Request().Context(), c.ctx, "DeletePigHouse")
const action = "删除猪舍"
id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
if err != nil {
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID格式", action, "ID格式错误", ctx.Param("id"))
}
if err := c.service.DeletePigHouse(uint(id)); err != nil {
if err := c.service.DeletePigHouse(reqCtx, uint(id)); err != nil {
if errors.Is(err, service.ErrHouseNotFound) {
return controller.SendErrorWithAudit(ctx, controller.CodeNotFound, "猪舍不存在", action, "猪舍不存在", id)
}
@@ -162,7 +168,7 @@ func (c *PigFarmController) DeletePigHouse(ctx echo.Context) error {
if errors.Is(err, service.ErrHouseContainsPens) {
return controller.SendErrorWithAudit(ctx, controller.CodeConflict, err.Error(), action, err.Error(), id)
}
c.logger.Errorf("%s: 业务逻辑失败: %v", action, err)
logger.Errorf("%s: 业务逻辑失败: %v", action, err)
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "删除失败", action, "业务逻辑失败", id)
}
@@ -182,19 +188,20 @@ func (c *PigFarmController) DeletePigHouse(ctx echo.Context) error {
// @Success 201 {object} controller.Response{data=dto.PenResponse} "创建成功"
// @Router /api/v1/pens [post]
func (c *PigFarmController) CreatePen(ctx echo.Context) error {
reqCtx, logger := logs.Trace(ctx.Request().Context(), c.ctx, "CreatePen")
const action = "创建猪栏"
var req dto.CreatePenRequest
if err := ctx.Bind(&req); err != nil {
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的请求体", action, "请求体绑定失败", req)
}
pen, err := c.service.CreatePen(req.PenNumber, req.HouseID, req.Capacity)
pen, err := c.service.CreatePen(reqCtx, req.PenNumber, req.HouseID, req.Capacity)
if err != nil {
// 检查是否是业务逻辑错误
if errors.Is(err, service.ErrHouseNotFound) {
return controller.SendErrorWithAudit(ctx, controller.CodeNotFound, err.Error(), action, err.Error(), req)
}
c.logger.Errorf("%s: 业务逻辑失败: %v", action, err)
logger.Errorf("%s: 业务逻辑失败: %v", action, err)
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "创建猪栏失败", action, "业务逻辑失败", req)
}
@@ -211,18 +218,19 @@ func (c *PigFarmController) CreatePen(ctx echo.Context) error {
// @Success 200 {object} controller.Response{data=dto.PenResponse} "获取成功"
// @Router /api/v1/pens/{id} [get]
func (c *PigFarmController) GetPen(ctx echo.Context) error {
reqCtx, logger := logs.Trace(ctx.Request().Context(), c.ctx, "GetPen")
const action = "获取猪栏"
id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
if err != nil {
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID格式", action, "ID格式错误", ctx.Param("id"))
}
pen, err := c.service.GetPenByID(uint(id))
pen, err := c.service.GetPenByID(reqCtx, uint(id))
if err != nil {
if errors.Is(err, service.ErrPenNotFound) {
return controller.SendErrorWithAudit(ctx, controller.CodeNotFound, "猪栏不存在", action, "猪栏不存在", id)
}
c.logger.Errorf("%s: 业务逻辑失败: %v", action, err)
logger.Errorf("%s: 业务逻辑失败: %v", action, err)
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "获取猪栏失败", action, "业务逻辑失败", id)
}
@@ -238,10 +246,11 @@ func (c *PigFarmController) GetPen(ctx echo.Context) error {
// @Success 200 {object} controller.Response{data=[]dto.PenResponse} "获取成功"
// @Router /api/v1/pens [get]
func (c *PigFarmController) ListPens(ctx echo.Context) error {
reqCtx, logger := logs.Trace(ctx.Request().Context(), c.ctx, "ListPens")
const action = "获取猪栏列表"
pens, err := c.service.ListPens()
pens, err := c.service.ListPens(reqCtx)
if err != nil {
c.logger.Errorf("%s: 业务逻辑失败: %v", action, err)
logger.Errorf("%s: 业务逻辑失败: %v", action, err)
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "获取列表失败", action, "业务逻辑失败", nil)
}
@@ -260,6 +269,7 @@ func (c *PigFarmController) ListPens(ctx echo.Context) error {
// @Success 200 {object} controller.Response{data=dto.PenResponse} "更新成功"
// @Router /api/v1/pens/{id} [put]
func (c *PigFarmController) UpdatePen(ctx echo.Context) error {
reqCtx, logger := logs.Trace(ctx.Request().Context(), c.ctx, "UpdatePen")
const action = "更新猪栏"
id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
if err != nil {
@@ -271,13 +281,13 @@ func (c *PigFarmController) UpdatePen(ctx echo.Context) error {
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的请求体", action, "请求体绑定失败", req)
}
pen, err := c.service.UpdatePen(uint(id), req.PenNumber, req.HouseID, req.Capacity, req.Status)
pen, err := c.service.UpdatePen(reqCtx, uint(id), req.PenNumber, req.HouseID, req.Capacity, req.Status)
if err != nil {
if errors.Is(err, service.ErrPenNotFound) {
return controller.SendErrorWithAudit(ctx, controller.CodeNotFound, "猪栏不存在", action, "猪栏不存在", id)
}
// 其他业务逻辑错误可以在这里添加处理
c.logger.Errorf("%s: 业务逻辑失败: %v", action, err)
logger.Errorf("%s: 业务逻辑失败: %v", action, err)
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "更新失败", action, "业务逻辑失败", req)
}
@@ -294,13 +304,14 @@ func (c *PigFarmController) UpdatePen(ctx echo.Context) error {
// @Success 200 {object} controller.Response "删除成功"
// @Router /api/v1/pens/{id} [delete]
func (c *PigFarmController) DeletePen(ctx echo.Context) error {
reqCtx, logger := logs.Trace(ctx.Request().Context(), c.ctx, "DeletePen")
const action = "删除猪栏"
id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
if err != nil {
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID格式", action, "ID格式错误", ctx.Param("id"))
}
if err := c.service.DeletePen(uint(id)); err != nil {
if err := c.service.DeletePen(reqCtx, uint(id)); err != nil {
if errors.Is(err, service.ErrPenNotFound) {
return controller.SendErrorWithAudit(ctx, controller.CodeNotFound, "猪栏不存在", action, "猪栏不存在", id)
}
@@ -308,7 +319,7 @@ func (c *PigFarmController) DeletePen(ctx echo.Context) error {
if errors.Is(err, service.ErrPenInUse) {
return controller.SendErrorWithAudit(ctx, controller.CodeConflict, err.Error(), action, err.Error(), id)
}
c.logger.Errorf("%s: 业务逻辑失败: %v", action, err)
logger.Errorf("%s: 业务逻辑失败: %v", action, err)
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "删除失败", action, "业务逻辑失败", id)
}
@@ -327,6 +338,7 @@ func (c *PigFarmController) DeletePen(ctx echo.Context) error {
// @Success 200 {object} controller.Response{data=dto.PenResponse} "更新成功"
// @Router /api/v1/pens/{id}/status [put]
func (c *PigFarmController) UpdatePenStatus(ctx echo.Context) error {
reqCtx, logger := logs.Trace(ctx.Request().Context(), c.ctx, "UpdatePenStatus")
const action = "更新猪栏状态"
id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
if err != nil {
@@ -338,14 +350,14 @@ func (c *PigFarmController) UpdatePenStatus(ctx echo.Context) error {
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的请求体", action, "请求体绑定失败", req)
}
pen, err := c.service.UpdatePenStatus(uint(id), req.Status)
pen, err := c.service.UpdatePenStatus(reqCtx, uint(id), req.Status)
if err != nil {
if errors.Is(err, service.ErrPenNotFound) {
return controller.SendErrorWithAudit(ctx, controller.CodeNotFound, err.Error(), action, err.Error(), id)
} else if errors.Is(err, service.ErrPenStatusInvalidForOccupiedPen) || errors.Is(err, service.ErrPenStatusInvalidForUnoccupiedPen) {
return controller.SendErrorWithAudit(ctx, controller.CodeConflict, err.Error(), action, err.Error(), id)
}
c.logger.Errorf("%s: 业务逻辑失败: %v", action, err)
logger.Errorf("%s: 业务逻辑失败: %v", action, err)
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "更新猪栏状态失败", action, err.Error(), id)
}