122 lines
5.7 KiB
Go
122 lines
5.7 KiB
Go
|
|
package inventory
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"errors"
|
||
|
|
|
||
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/app/controller"
|
||
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/app/dto"
|
||
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/app/service"
|
||
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
|
||
|
|
|
||
|
|
"github.com/labstack/echo/v4"
|
||
|
|
)
|
||
|
|
|
||
|
|
// InventoryController 定义了库存相关的控制器
|
||
|
|
type InventoryController struct {
|
||
|
|
ctx context.Context
|
||
|
|
inventoryService service.InventoryService
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewInventoryController 创建一个新的 InventoryController 实例
|
||
|
|
func NewInventoryController(ctx context.Context, inventoryService service.InventoryService) *InventoryController {
|
||
|
|
return &InventoryController{
|
||
|
|
ctx: ctx,
|
||
|
|
inventoryService: inventoryService,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// AdjustStock godoc
|
||
|
|
// @Summary 调整原料库存
|
||
|
|
// @Description 手动调整指定原料的库存量。
|
||
|
|
// @Tags 库存管理
|
||
|
|
// @Security BearerAuth
|
||
|
|
// @Accept json
|
||
|
|
// @Produce json
|
||
|
|
// @Param request body dto.StockAdjustmentRequest true "库存调整请求"
|
||
|
|
// @Success 200 {object} controller.Response{data=dto.StockLogResponse} "业务码为200代表调整成功"
|
||
|
|
// @Router /api/v1/inventory/stock/adjust [post]
|
||
|
|
func (c *InventoryController) AdjustStock(ctx echo.Context) error {
|
||
|
|
reqCtx, logger := logs.Trace(ctx.Request().Context(), c.ctx, "AdjustStock")
|
||
|
|
var req dto.StockAdjustmentRequest
|
||
|
|
const actionType = "调整原料库存"
|
||
|
|
|
||
|
|
if err := ctx.Bind(&req); err != nil {
|
||
|
|
logger.Errorf("%s: 参数绑定失败: %v", actionType, err)
|
||
|
|
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的请求体: "+err.Error(), actionType, "请求体绑定失败", req)
|
||
|
|
}
|
||
|
|
|
||
|
|
resp, err := c.inventoryService.AdjustStock(reqCtx, &req)
|
||
|
|
if err != nil {
|
||
|
|
logger.Errorf("%s: 服务层调整库存失败: %v", actionType, err)
|
||
|
|
if errors.Is(err, service.ErrInventoryRawMaterialNotFound) {
|
||
|
|
return controller.SendErrorWithAudit(ctx, controller.CodeNotFound, err.Error(), actionType, "原料不存在", req)
|
||
|
|
}
|
||
|
|
if errors.Is(err, service.ErrInventoryInsufficientStock) {
|
||
|
|
return controller.SendErrorWithAudit(ctx, controller.CodeConflict, err.Error(), actionType, "原料库存不足", req)
|
||
|
|
}
|
||
|
|
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "调整库存失败: "+err.Error(), actionType, "服务层调整库存失败", req)
|
||
|
|
}
|
||
|
|
|
||
|
|
logger.Infof("%s: 库存调整成功, 原料ID: %d", actionType, resp.RawMaterialID)
|
||
|
|
return controller.SendSuccessWithAudit(ctx, controller.CodeSuccess, "库存调整成功", resp, actionType, "库存调整成功", resp)
|
||
|
|
}
|
||
|
|
|
||
|
|
// ListCurrentStock godoc
|
||
|
|
// @Summary 获取当前库存列表
|
||
|
|
// @Description 获取所有原料的当前库存列表,支持分页和过滤。
|
||
|
|
// @Tags 库存管理
|
||
|
|
// @Security BearerAuth
|
||
|
|
// @Produce json
|
||
|
|
// @Param query query dto.ListCurrentStockRequest false "查询参数"
|
||
|
|
// @Success 200 {object} controller.Response{data=dto.ListCurrentStockResponse} "业务码为200代表成功获取列表"
|
||
|
|
// @Router /api/v1/inventory/stock/current [get]
|
||
|
|
func (c *InventoryController) ListCurrentStock(ctx echo.Context) error {
|
||
|
|
reqCtx, logger := logs.Trace(ctx.Request().Context(), c.ctx, "ListCurrentStock")
|
||
|
|
const actionType = "获取当前库存列表"
|
||
|
|
var req dto.ListCurrentStockRequest
|
||
|
|
|
||
|
|
if err := ctx.Bind(&req); err != nil {
|
||
|
|
logger.Errorf("%s: 查询参数绑定失败: %v", actionType, err)
|
||
|
|
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的查询参数: "+err.Error(), actionType, "查询参数绑定失败", req)
|
||
|
|
}
|
||
|
|
|
||
|
|
resp, err := c.inventoryService.ListCurrentStock(reqCtx, &req)
|
||
|
|
if err != nil {
|
||
|
|
logger.Errorf("%s: 服务层获取当前库存列表失败: %v", actionType, err)
|
||
|
|
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "获取当前库存列表失败: "+err.Error(), actionType, "服务层获取当前库存列表失败", nil)
|
||
|
|
}
|
||
|
|
|
||
|
|
logger.Infof("%s: 获取当前库存列表成功, 数量: %d", actionType, len(resp.List))
|
||
|
|
return controller.SendSuccessWithAudit(ctx, controller.CodeSuccess, "获取当前库存列表成功", resp, actionType, "获取当前库存列表成功", resp)
|
||
|
|
}
|
||
|
|
|
||
|
|
// ListStockLogs godoc
|
||
|
|
// @Summary 获取库存变动日志
|
||
|
|
// @Description 获取原料库存变动历史记录,支持分页、过滤和时间范围查询。
|
||
|
|
// @Tags 库存管理
|
||
|
|
// @Security BearerAuth
|
||
|
|
// @Produce json
|
||
|
|
// @Param query query dto.ListStockLogRequest false "查询参数"
|
||
|
|
// @Success 200 {object} controller.Response{data=dto.ListStockLogResponse} "业务码为200代表成功获取列表"
|
||
|
|
// @Router /api/v1/inventory/stock/logs [get]
|
||
|
|
func (c *InventoryController) ListStockLogs(ctx echo.Context) error {
|
||
|
|
reqCtx, logger := logs.Trace(ctx.Request().Context(), c.ctx, "ListStockLogs")
|
||
|
|
const actionType = "获取库存变动日志"
|
||
|
|
var req dto.ListStockLogRequest
|
||
|
|
|
||
|
|
if err := ctx.Bind(&req); err != nil {
|
||
|
|
logger.Errorf("%s: 查询参数绑定失败: %v", actionType, err)
|
||
|
|
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的查询参数: "+err.Error(), actionType, "查询参数绑定失败", req)
|
||
|
|
}
|
||
|
|
|
||
|
|
resp, err := c.inventoryService.ListStockLogs(reqCtx, &req)
|
||
|
|
if err != nil {
|
||
|
|
logger.Errorf("%s: 服务层获取库存变动日志失败: %v", actionType, err)
|
||
|
|
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "获取库存变动日志失败: "+err.Error(), actionType, "服务层获取库存变动日志失败", nil)
|
||
|
|
}
|
||
|
|
|
||
|
|
logger.Infof("%s: 获取库存变动日志成功, 数量: %d", actionType, len(resp.List))
|
||
|
|
return controller.SendSuccessWithAudit(ctx, controller.CodeSuccess, "获取库存变动日志成功", resp, actionType, "获取库存变动日志成功", resp)
|
||
|
|
}
|