issue_36 #47
@@ -4,20 +4,20 @@ import "git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
 | 
			
		||||
 | 
			
		||||
// CreateDeviceRequest 定义了创建设备时需要传入的参数
 | 
			
		||||
type CreateDeviceRequest struct {
 | 
			
		||||
	Name             string                 `json:"name" binding:"required"`
 | 
			
		||||
	DeviceTemplateID uint                   `json:"device_template_id" binding:"required"`
 | 
			
		||||
	AreaControllerID uint                   `json:"area_controller_id" binding:"required"`
 | 
			
		||||
	Location         string                 `json:"location,omitempty"`
 | 
			
		||||
	Properties       map[string]interface{} `json:"properties,omitempty"`
 | 
			
		||||
	Name             string                 `json:"name" validate:"required"`
 | 
			
		||||
	DeviceTemplateID uint                   `json:"device_template_id" validate:"required"`
 | 
			
		||||
	AreaControllerID uint                   `json:"area_controller_id" validate:"required"`
 | 
			
		||||
	Location         string                 `json:"location,omitempty" validate:"omitempty"`
 | 
			
		||||
	Properties       map[string]interface{} `json:"properties,omitempty" validate:"omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UpdateDeviceRequest 定义了更新设备时需要传入的参数
 | 
			
		||||
type UpdateDeviceRequest struct {
 | 
			
		||||
	Name             string                 `json:"name" binding:"required"`
 | 
			
		||||
	DeviceTemplateID uint                   `json:"device_template_id" binding:"required"`
 | 
			
		||||
	AreaControllerID uint                   `json:"area_controller_id" binding:"required"`
 | 
			
		||||
	Location         string                 `json:"location,omitempty"`
 | 
			
		||||
	Properties       map[string]interface{} `json:"properties,omitempty"`
 | 
			
		||||
	Name             string                 `json:"name" validate:"required"`
 | 
			
		||||
	DeviceTemplateID uint                   `json:"device_template_id" validate:"required"`
 | 
			
		||||
	AreaControllerID uint                   `json:"area_controller_id" validate:"required"`
 | 
			
		||||
	Location         string                 `json:"location,omitempty" validate:"omitempty"`
 | 
			
		||||
	Properties       map[string]interface{} `json:"properties,omitempty" validate:"omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ManualControlDeviceRequest 定义了手动控制设备时需要传入的参数
 | 
			
		||||
@@ -28,38 +28,38 @@ type ManualControlDeviceRequest struct {
 | 
			
		||||
 | 
			
		||||
// CreateAreaControllerRequest 定义了创建区域主控时需要传入的参数
 | 
			
		||||
type CreateAreaControllerRequest struct {
 | 
			
		||||
	Name       string                 `json:"name" binding:"required"`
 | 
			
		||||
	NetworkID  string                 `json:"network_id" binding:"required"`
 | 
			
		||||
	Location   string                 `json:"location,omitempty"`
 | 
			
		||||
	Properties map[string]interface{} `json:"properties,omitempty"`
 | 
			
		||||
	Name       string                 `json:"name" validate:"required"`
 | 
			
		||||
	NetworkID  string                 `json:"network_id" validate:"required"`
 | 
			
		||||
	Location   string                 `json:"location,omitempty" validate:"omitempty"`
 | 
			
		||||
	Properties map[string]interface{} `json:"properties,omitempty" validate:"omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UpdateAreaControllerRequest 定义了更新区域主控时需要传入的参数
 | 
			
		||||
type UpdateAreaControllerRequest struct {
 | 
			
		||||
	Name       string                 `json:"name" binding:"required"`
 | 
			
		||||
	NetworkID  string                 `json:"network_id" binding:"required"`
 | 
			
		||||
	Location   string                 `json:"location,omitempty"`
 | 
			
		||||
	Properties map[string]interface{} `json:"properties,omitempty"`
 | 
			
		||||
	Name       string                 `json:"name" validate:"required"`
 | 
			
		||||
	NetworkID  string                 `json:"network_id" validate:"required"`
 | 
			
		||||
	Location   string                 `json:"location,omitempty" validate:"omitempty"`
 | 
			
		||||
	Properties map[string]interface{} `json:"properties,omitempty" validate:"omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CreateDeviceTemplateRequest 定义了创建设备模板时需要传入的参数
 | 
			
		||||
type CreateDeviceTemplateRequest struct {
 | 
			
		||||
	Name         string                   `json:"name" binding:"required"`
 | 
			
		||||
	Manufacturer string                   `json:"manufacturer,omitempty"`
 | 
			
		||||
	Description  string                   `json:"description,omitempty"`
 | 
			
		||||
	Category     models.DeviceCategory    `json:"category" binding:"required"`
 | 
			
		||||
	Commands     map[string]interface{}   `json:"commands" binding:"required"`
 | 
			
		||||
	Values       []models.ValueDescriptor `json:"values,omitempty"`
 | 
			
		||||
	Name         string                   `json:"name" validate:"required"`
 | 
			
		||||
	Manufacturer string                   `json:"manufacturer,omitempty" validate:"omitempty"`
 | 
			
		||||
	Description  string                   `json:"description,omitempty" validate:"omitempty"`
 | 
			
		||||
	Category     models.DeviceCategory    `json:"category" validate:"required"`
 | 
			
		||||
	Commands     map[string]interface{}   `json:"commands" validate:"required"`
 | 
			
		||||
	Values       []models.ValueDescriptor `json:"values,omitempty" validate:"omitempty,dive"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UpdateDeviceTemplateRequest 定义了更新设备模板时需要传入的参数
 | 
			
		||||
type UpdateDeviceTemplateRequest struct {
 | 
			
		||||
	Name         string                   `json:"name" binding:"required"`
 | 
			
		||||
	Manufacturer string                   `json:"manufacturer,omitempty"`
 | 
			
		||||
	Description  string                   `json:"description,omitempty"`
 | 
			
		||||
	Category     models.DeviceCategory    `json:"category" binding:"required"`
 | 
			
		||||
	Commands     map[string]interface{}   `json:"commands" binding:"required"`
 | 
			
		||||
	Values       []models.ValueDescriptor `json:"values,omitempty"`
 | 
			
		||||
	Name         string                   `json:"name" validate:"required"`
 | 
			
		||||
	Manufacturer string                   `json:"manufacturer,omitempty" validate:"omitempty"`
 | 
			
		||||
	Description  string                   `json:"description,omitempty" validate:"omitempty"`
 | 
			
		||||
	Category     models.DeviceCategory    `json:"category" validate:"required"`
 | 
			
		||||
	Commands     map[string]interface{}   `json:"commands" validate:"required"`
 | 
			
		||||
	Values       []models.ValueDescriptor `json:"values,omitempty" validate:"omitempty,dive"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeviceResponse 定义了返回给客户端的单个设备信息的结构
 | 
			
		||||
 
 | 
			
		||||
@@ -20,13 +20,13 @@ type PaginationDTO struct {
 | 
			
		||||
 | 
			
		||||
// ListSensorDataRequest 定义了获取传感器数据列表的请求参数
 | 
			
		||||
type ListSensorDataRequest struct {
 | 
			
		||||
	Page       int        `form:"page,default=1"`
 | 
			
		||||
	PageSize   int        `form:"pageSize,default=10"`
 | 
			
		||||
	DeviceID   *uint      `form:"device_id"`
 | 
			
		||||
	SensorType *string    `form:"sensor_type"`
 | 
			
		||||
	StartTime  *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime    *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy    string     `form:"order_by"`
 | 
			
		||||
	Page       int        `query:"page"`
 | 
			
		||||
	PageSize   int        `query:"pageSize"`
 | 
			
		||||
	DeviceID   *uint      `query:"device_id"`
 | 
			
		||||
	SensorType *string    `query:"sensor_type"`
 | 
			
		||||
	StartTime  *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime    *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy    string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SensorDataDTO 是用于API响应的传感器数据结构
 | 
			
		||||
@@ -48,13 +48,13 @@ type ListSensorDataResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListDeviceCommandLogRequest 定义了获取设备命令日志列表的请求参数
 | 
			
		||||
type ListDeviceCommandLogRequest struct {
 | 
			
		||||
	Page            int        `form:"page,default=1"`
 | 
			
		||||
	PageSize        int        `form:"pageSize,default=10"`
 | 
			
		||||
	DeviceID        *uint      `form:"device_id"`
 | 
			
		||||
	ReceivedSuccess *bool      `form:"received_success"`
 | 
			
		||||
	StartTime       *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime         *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy         string     `form:"order_by"`
 | 
			
		||||
	Page            int        `query:"page"`
 | 
			
		||||
	PageSize        int        `query:"pageSize"`
 | 
			
		||||
	DeviceID        *uint      `query:"device_id"`
 | 
			
		||||
	ReceivedSuccess *bool      `query:"received_success"`
 | 
			
		||||
	StartTime       *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime         *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy         string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeviceCommandLogDTO 是用于API响应的设备命令日志结构
 | 
			
		||||
@@ -76,13 +76,13 @@ type ListDeviceCommandLogResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListPlanExecutionLogRequest 定义了获取计划执行日志列表的请求参数
 | 
			
		||||
type ListPlanExecutionLogRequest struct {
 | 
			
		||||
	Page      int        `form:"page,default=1"`
 | 
			
		||||
	PageSize  int        `form:"pageSize,default=10"`
 | 
			
		||||
	PlanID    *uint      `form:"plan_id"`
 | 
			
		||||
	Status    *string    `form:"status"`
 | 
			
		||||
	StartTime *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime   *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy   string     `form:"order_by"`
 | 
			
		||||
	Page      int        `query:"page"`
 | 
			
		||||
	PageSize  int        `query:"pageSize"`
 | 
			
		||||
	PlanID    *uint      `query:"plan_id"`
 | 
			
		||||
	Status    *string    `query:"status"`
 | 
			
		||||
	StartTime *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime   *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy   string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PlanExecutionLogDTO 是用于API响应的计划执行日志结构
 | 
			
		||||
@@ -108,14 +108,14 @@ type ListPlanExecutionLogResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListTaskExecutionLogRequest 定义了获取任务执行日志列表的请求参数
 | 
			
		||||
type ListTaskExecutionLogRequest struct {
 | 
			
		||||
	Page               int        `form:"page,default=1"`
 | 
			
		||||
	PageSize           int        `form:"pageSize,default=10"`
 | 
			
		||||
	PlanExecutionLogID *uint      `form:"plan_execution_log_id"`
 | 
			
		||||
	TaskID             *int       `form:"task_id"`
 | 
			
		||||
	Status             *string    `form:"status"`
 | 
			
		||||
	StartTime          *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime            *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy            string     `form:"order_by"`
 | 
			
		||||
	Page               int        `query:"page"`
 | 
			
		||||
	PageSize           int        `query:"pageSize"`
 | 
			
		||||
	PlanExecutionLogID *uint      `query:"plan_execution_log_id"`
 | 
			
		||||
	TaskID             *int       `query:"task_id"`
 | 
			
		||||
	Status             *string    `query:"status"`
 | 
			
		||||
	StartTime          *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime            *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy            string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TaskDTO 是用于API响应的简化版任务结构
 | 
			
		||||
@@ -149,13 +149,13 @@ type ListTaskExecutionLogResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListPendingCollectionRequest 定义了获取待采集请求列表的请求参数
 | 
			
		||||
type ListPendingCollectionRequest struct {
 | 
			
		||||
	Page      int        `form:"page,default=1"`
 | 
			
		||||
	PageSize  int        `form:"pageSize,default=10"`
 | 
			
		||||
	DeviceID  *uint      `form:"device_id"`
 | 
			
		||||
	Status    *string    `form:"status"`
 | 
			
		||||
	StartTime *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime   *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy   string     `form:"order_by"`
 | 
			
		||||
	Page      int        `query:"page"`
 | 
			
		||||
	PageSize  int        `query:"pageSize"`
 | 
			
		||||
	DeviceID  *uint      `query:"device_id"`
 | 
			
		||||
	Status    *string    `query:"status"`
 | 
			
		||||
	StartTime *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime   *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy   string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PendingCollectionDTO 是用于API响应的待采集请求结构
 | 
			
		||||
@@ -178,15 +178,15 @@ type ListPendingCollectionResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListUserActionLogRequest 定义了获取用户操作日志列表的请求参数
 | 
			
		||||
type ListUserActionLogRequest struct {
 | 
			
		||||
	Page       int        `form:"page,default=1"`
 | 
			
		||||
	PageSize   int        `form:"pageSize,default=10"`
 | 
			
		||||
	UserID     *uint      `form:"user_id"`
 | 
			
		||||
	Username   *string    `form:"username"`
 | 
			
		||||
	ActionType *string    `form:"action_type"`
 | 
			
		||||
	Status     *string    `form:"status"`
 | 
			
		||||
	StartTime  *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime    *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy    string     `form:"order_by"`
 | 
			
		||||
	Page       int        `query:"page"`
 | 
			
		||||
	PageSize   int        `query:"pageSize"`
 | 
			
		||||
	UserID     *uint      `query:"user_id"`
 | 
			
		||||
	Username   *string    `query:"username"`
 | 
			
		||||
	ActionType *string    `query:"action_type"`
 | 
			
		||||
	Status     *string    `query:"status"`
 | 
			
		||||
	StartTime  *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime    *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy    string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UserActionLogDTO 是用于API响应的用户操作日志结构
 | 
			
		||||
@@ -215,13 +215,13 @@ type ListUserActionLogResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListRawMaterialPurchaseRequest 定义了获取原料采购列表的请求参数
 | 
			
		||||
type ListRawMaterialPurchaseRequest struct {
 | 
			
		||||
	Page          int        `form:"page,default=1"`
 | 
			
		||||
	PageSize      int        `form:"pageSize,default=10"`
 | 
			
		||||
	RawMaterialID *uint      `form:"raw_material_id"`
 | 
			
		||||
	Supplier      *string    `form:"supplier"`
 | 
			
		||||
	StartTime     *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime       *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy       string     `form:"order_by"`
 | 
			
		||||
	Page          int        `query:"page"`
 | 
			
		||||
	PageSize      int        `query:"pageSize"`
 | 
			
		||||
	RawMaterialID *uint      `query:"raw_material_id"`
 | 
			
		||||
	Supplier      *string    `query:"supplier"`
 | 
			
		||||
	StartTime     *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime       *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy       string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RawMaterialDTO 是用于API响应的简化版原料结构
 | 
			
		||||
@@ -253,14 +253,14 @@ type ListRawMaterialPurchaseResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListRawMaterialStockLogRequest 定义了获取原料库存日志列表的请求参数
 | 
			
		||||
type ListRawMaterialStockLogRequest struct {
 | 
			
		||||
	Page          int        `form:"page,default=1"`
 | 
			
		||||
	PageSize      int        `form:"pageSize,default=10"`
 | 
			
		||||
	RawMaterialID *uint      `form:"raw_material_id"`
 | 
			
		||||
	SourceType    *string    `form:"source_type"`
 | 
			
		||||
	SourceID      *uint      `form:"source_id"`
 | 
			
		||||
	StartTime     *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime       *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy       string     `form:"order_by"`
 | 
			
		||||
	Page          int        `query:"page"`
 | 
			
		||||
	PageSize      int        `query:"pageSize"`
 | 
			
		||||
	RawMaterialID *uint      `query:"raw_material_id"`
 | 
			
		||||
	SourceType    *string    `query:"source_type"`
 | 
			
		||||
	SourceID      *uint      `query:"source_id"`
 | 
			
		||||
	StartTime     *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime       *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy       string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RawMaterialStockLogDTO 是用于API响应的原料库存日志结构
 | 
			
		||||
@@ -284,14 +284,14 @@ type ListRawMaterialStockLogResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListFeedUsageRecordRequest 定义了获取饲料使用记录列表的请求参数
 | 
			
		||||
type ListFeedUsageRecordRequest struct {
 | 
			
		||||
	Page          int        `form:"page,default=1"`
 | 
			
		||||
	PageSize      int        `form:"pageSize,default=10"`
 | 
			
		||||
	PenID         *uint      `form:"pen_id"`
 | 
			
		||||
	FeedFormulaID *uint      `form:"feed_formula_id"`
 | 
			
		||||
	OperatorID    *uint      `form:"operator_id"`
 | 
			
		||||
	StartTime     *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime       *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy       string     `form:"order_by"`
 | 
			
		||||
	Page          int        `query:"page"`
 | 
			
		||||
	PageSize      int        `query:"pageSize"`
 | 
			
		||||
	PenID         *uint      `query:"pen_id"`
 | 
			
		||||
	FeedFormulaID *uint      `query:"feed_formula_id"`
 | 
			
		||||
	OperatorID    *uint      `query:"operator_id"`
 | 
			
		||||
	StartTime     *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime       *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy       string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PenDTO 是用于API响应的简化版猪栏结构
 | 
			
		||||
@@ -329,15 +329,15 @@ type ListFeedUsageRecordResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListMedicationLogRequest 定义了获取用药记录列表的请求参数
 | 
			
		||||
type ListMedicationLogRequest struct {
 | 
			
		||||
	Page         int        `form:"page,default=1"`
 | 
			
		||||
	PageSize     int        `form:"pageSize,default=10"`
 | 
			
		||||
	PigBatchID   *uint      `form:"pig_batch_id"`
 | 
			
		||||
	MedicationID *uint      `form:"medication_id"`
 | 
			
		||||
	Reason       *string    `form:"reason"`
 | 
			
		||||
	OperatorID   *uint      `form:"operator_id"`
 | 
			
		||||
	StartTime    *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime      *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy      string     `form:"order_by"`
 | 
			
		||||
	Page         int        `query:"page"`
 | 
			
		||||
	PageSize     int        `query:"pageSize"`
 | 
			
		||||
	PigBatchID   *uint      `query:"pig_batch_id"`
 | 
			
		||||
	MedicationID *uint      `query:"medication_id"`
 | 
			
		||||
	Reason       *string    `query:"reason"`
 | 
			
		||||
	OperatorID   *uint      `query:"operator_id"`
 | 
			
		||||
	StartTime    *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime      *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy      string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MedicationDTO 是用于API响应的简化版药品结构
 | 
			
		||||
@@ -370,14 +370,14 @@ type ListMedicationLogResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListPigBatchLogRequest 定义了获取猪批次日志列表的请求参数
 | 
			
		||||
type ListPigBatchLogRequest struct {
 | 
			
		||||
	Page       int        `form:"page,default=1"`
 | 
			
		||||
	PageSize   int        `form:"pageSize,default=10"`
 | 
			
		||||
	PigBatchID *uint      `form:"pig_batch_id"`
 | 
			
		||||
	ChangeType *string    `form:"change_type"`
 | 
			
		||||
	OperatorID *uint      `form:"operator_id"`
 | 
			
		||||
	StartTime  *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime    *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy    string     `form:"order_by"`
 | 
			
		||||
	Page       int        `query:"page"`
 | 
			
		||||
	PageSize   int        `query:"pageSize"`
 | 
			
		||||
	PigBatchID *uint      `query:"pig_batch_id"`
 | 
			
		||||
	ChangeType *string    `query:"change_type"`
 | 
			
		||||
	OperatorID *uint      `query:"operator_id"`
 | 
			
		||||
	StartTime  *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime    *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy    string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PigBatchLogDTO 是用于API响应的猪批次日志结构
 | 
			
		||||
@@ -405,12 +405,12 @@ type ListPigBatchLogResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListWeighingBatchRequest 定义了获取批次称重记录列表的请求参数
 | 
			
		||||
type ListWeighingBatchRequest struct {
 | 
			
		||||
	Page       int        `form:"page,default=1"`
 | 
			
		||||
	PageSize   int        `form:"pageSize,default=10"`
 | 
			
		||||
	PigBatchID *uint      `form:"pig_batch_id"`
 | 
			
		||||
	StartTime  *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime    *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy    string     `form:"order_by"`
 | 
			
		||||
	Page       int        `query:"page"`
 | 
			
		||||
	PageSize   int        `query:"pageSize"`
 | 
			
		||||
	PigBatchID *uint      `query:"pig_batch_id"`
 | 
			
		||||
	StartTime  *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime    *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy    string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WeighingBatchDTO 是用于API响应的批次称重记录结构
 | 
			
		||||
@@ -433,14 +433,14 @@ type ListWeighingBatchResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListWeighingRecordRequest 定义了获取单次称重记录列表的请求参数
 | 
			
		||||
type ListWeighingRecordRequest struct {
 | 
			
		||||
	Page            int        `form:"page,default=1"`
 | 
			
		||||
	PageSize        int        `form:"pageSize,default=10"`
 | 
			
		||||
	WeighingBatchID *uint      `form:"weighing_batch_id"`
 | 
			
		||||
	PenID           *uint      `form:"pen_id"`
 | 
			
		||||
	OperatorID      *uint      `form:"operator_id"`
 | 
			
		||||
	StartTime       *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime         *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy         string     `form:"order_by"`
 | 
			
		||||
	Page            int        `query:"page"`
 | 
			
		||||
	PageSize        int        `query:"pageSize"`
 | 
			
		||||
	WeighingBatchID *uint      `query:"weighing_batch_id"`
 | 
			
		||||
	PenID           *uint      `query:"pen_id"`
 | 
			
		||||
	OperatorID      *uint      `query:"operator_id"`
 | 
			
		||||
	StartTime       *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime         *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy         string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WeighingRecordDTO 是用于API响应的单次称重记录结构
 | 
			
		||||
@@ -466,16 +466,16 @@ type ListWeighingRecordResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListPigTransferLogRequest 定义了获取猪只迁移日志列表的请求参数
 | 
			
		||||
type ListPigTransferLogRequest struct {
 | 
			
		||||
	Page          int        `form:"page,default=1"`
 | 
			
		||||
	PageSize      int        `form:"pageSize,default=10"`
 | 
			
		||||
	PigBatchID    *uint      `form:"pig_batch_id"`
 | 
			
		||||
	PenID         *uint      `form:"pen_id"`
 | 
			
		||||
	TransferType  *string    `form:"transfer_type"`
 | 
			
		||||
	OperatorID    *uint      `form:"operator_id"`
 | 
			
		||||
	CorrelationID *string    `form:"correlation_id"`
 | 
			
		||||
	StartTime     *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime       *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy       string     `form:"order_by"`
 | 
			
		||||
	Page          int        `query:"page"`
 | 
			
		||||
	PageSize      int        `query:"pageSize"`
 | 
			
		||||
	PigBatchID    *uint      `query:"pig_batch_id"`
 | 
			
		||||
	PenID         *uint      `query:"pen_id"`
 | 
			
		||||
	TransferType  *string    `query:"transfer_type"`
 | 
			
		||||
	OperatorID    *uint      `query:"operator_id"`
 | 
			
		||||
	CorrelationID *string    `query:"correlation_id"`
 | 
			
		||||
	StartTime     *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime       *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy       string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PigTransferLogDTO 是用于API响应的猪只迁移日志结构
 | 
			
		||||
@@ -503,16 +503,16 @@ type ListPigTransferLogResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListPigSickLogRequest 定义了获取病猪日志列表的请求参数
 | 
			
		||||
type ListPigSickLogRequest struct {
 | 
			
		||||
	Page              int        `form:"page,default=1"`
 | 
			
		||||
	PageSize          int        `form:"pageSize,default=10"`
 | 
			
		||||
	PigBatchID        *uint      `form:"pig_batch_id"`
 | 
			
		||||
	PenID             *uint      `form:"pen_id"`
 | 
			
		||||
	Reason            *string    `form:"reason"`
 | 
			
		||||
	TreatmentLocation *string    `form:"treatment_location"`
 | 
			
		||||
	OperatorID        *uint      `form:"operator_id"`
 | 
			
		||||
	StartTime         *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime           *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy           string     `form:"order_by"`
 | 
			
		||||
	Page              int        `query:"page"`
 | 
			
		||||
	PageSize          int        `query:"pageSize"`
 | 
			
		||||
	PigBatchID        *uint      `query:"pig_batch_id"`
 | 
			
		||||
	PenID             *uint      `query:"pen_id"`
 | 
			
		||||
	Reason            *string    `query:"reason"`
 | 
			
		||||
	TreatmentLocation *string    `query:"treatment_location"`
 | 
			
		||||
	OperatorID        *uint      `query:"operator_id"`
 | 
			
		||||
	StartTime         *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime           *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy           string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PigSickLogDTO 是用于API响应的病猪日志结构
 | 
			
		||||
@@ -542,14 +542,14 @@ type ListPigSickLogResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListPigPurchaseRequest 定义了获取猪只采购记录列表的请求参数
 | 
			
		||||
type ListPigPurchaseRequest struct {
 | 
			
		||||
	Page       int        `form:"page,default=1"`
 | 
			
		||||
	PageSize   int        `form:"pageSize,default=10"`
 | 
			
		||||
	PigBatchID *uint      `form:"pig_batch_id"`
 | 
			
		||||
	Supplier   *string    `form:"supplier"`
 | 
			
		||||
	OperatorID *uint      `form:"operator_id"`
 | 
			
		||||
	StartTime  *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime    *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy    string     `form:"order_by"`
 | 
			
		||||
	Page       int        `query:"page"`
 | 
			
		||||
	PageSize   int        `query:"pageSize"`
 | 
			
		||||
	PigBatchID *uint      `query:"pig_batch_id"`
 | 
			
		||||
	Supplier   *string    `query:"supplier"`
 | 
			
		||||
	OperatorID *uint      `query:"operator_id"`
 | 
			
		||||
	StartTime  *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime    *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy    string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PigPurchaseDTO 是用于API响应的猪只采购记录结构
 | 
			
		||||
@@ -577,14 +577,14 @@ type ListPigPurchaseResponse struct {
 | 
			
		||||
 | 
			
		||||
// ListPigSaleRequest 定义了获取猪只销售记录列表的请求参数
 | 
			
		||||
type ListPigSaleRequest struct {
 | 
			
		||||
	Page       int        `form:"page,default=1"`
 | 
			
		||||
	PageSize   int        `form:"pageSize,default=10"`
 | 
			
		||||
	PigBatchID *uint      `form:"pig_batch_id"`
 | 
			
		||||
	Buyer      *string    `form:"buyer"`
 | 
			
		||||
	OperatorID *uint      `form:"operator_id"`
 | 
			
		||||
	StartTime  *time.Time `form:"start_time"`
 | 
			
		||||
	EndTime    *time.Time `form:"end_time"`
 | 
			
		||||
	OrderBy    string     `form:"order_by"`
 | 
			
		||||
	Page       int        `query:"page"`
 | 
			
		||||
	PageSize   int        `query:"pageSize"`
 | 
			
		||||
	PigBatchID *uint      `query:"pig_batch_id"`
 | 
			
		||||
	Buyer      *string    `query:"buyer"`
 | 
			
		||||
	OperatorID *uint      `query:"operator_id"`
 | 
			
		||||
	StartTime  *time.Time `query:"start_time"`
 | 
			
		||||
	EndTime    *time.Time `query:"end_time"`
 | 
			
		||||
	OrderBy    string     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PigSaleDTO 是用于API响应的猪只销售记录结构
 | 
			
		||||
 
 | 
			
		||||
@@ -11,20 +11,20 @@ import (
 | 
			
		||||
// SendTestNotificationRequest 定义了发送测试通知请求的 JSON 结构
 | 
			
		||||
type SendTestNotificationRequest struct {
 | 
			
		||||
	// Type 指定要测试的通知渠道
 | 
			
		||||
	Type notify.NotifierType `json:"type" binding:"required"`
 | 
			
		||||
	Type notify.NotifierType `json:"type" validate:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ListNotificationRequest 定义了获取通知列表的请求参数
 | 
			
		||||
type ListNotificationRequest struct {
 | 
			
		||||
	Page         int                        `form:"page,default=1"`
 | 
			
		||||
	PageSize     int                        `form:"pageSize,default=10"`
 | 
			
		||||
	UserID       *uint                      `form:"user_id"`
 | 
			
		||||
	NotifierType *notify.NotifierType       `form:"notifier_type"`
 | 
			
		||||
	Status       *models.NotificationStatus `form:"status"`
 | 
			
		||||
	Level        *zapcore.Level             `form:"level"`
 | 
			
		||||
	StartTime    *time.Time                 `form:"start_time"`
 | 
			
		||||
	EndTime      *time.Time                 `form:"end_time"`
 | 
			
		||||
	OrderBy      string                     `form:"order_by"`
 | 
			
		||||
	Page         int                        `query:"page"`
 | 
			
		||||
	PageSize     int                        `query:"pageSize"`
 | 
			
		||||
	UserID       *uint                      `query:"user_id"`
 | 
			
		||||
	NotifierType *notify.NotifierType       `query:"notifier_type"`
 | 
			
		||||
	Status       *models.NotificationStatus `query:"status"`
 | 
			
		||||
	Level        *zapcore.Level             `query:"level"`
 | 
			
		||||
	StartTime    *time.Time                 `query:"start_time"`
 | 
			
		||||
	EndTime      *time.Time                 `query:"end_time"`
 | 
			
		||||
	OrderBy      string                     `query:"order_by"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NotificationDTO 是用于API响应的通知结构
 | 
			
		||||
 
 | 
			
		||||
@@ -8,11 +8,11 @@ import (
 | 
			
		||||
 | 
			
		||||
// PigBatchCreateDTO 定义了创建猪批次的请求结构
 | 
			
		||||
type PigBatchCreateDTO struct {
 | 
			
		||||
	BatchNumber  string                    `json:"batch_number" binding:"required"`        // 批次编号,必填
 | 
			
		||||
	OriginType   models.PigBatchOriginType `json:"origin_type" binding:"required"`         // 批次来源,必填
 | 
			
		||||
	StartDate    time.Time                 `json:"start_date" binding:"required"`          // 批次开始日期,必填
 | 
			
		||||
	InitialCount int                       `json:"initial_count" binding:"required,min=1"` // 初始数量,必填,最小为1
 | 
			
		||||
	Status       models.PigBatchStatus     `json:"status" binding:"required"`              // 批次状态,必填
 | 
			
		||||
	BatchNumber  string                    `json:"batch_number" validate:"required"`        // 批次编号,必填
 | 
			
		||||
	OriginType   models.PigBatchOriginType `json:"origin_type" validate:"required"`         // 批次来源,必填
 | 
			
		||||
	StartDate    time.Time                 `json:"start_date" validate:"required"`          // 批次开始日期,必填
 | 
			
		||||
	InitialCount int                       `json:"initial_count" validate:"required,min=1"` // 初始数量,必填,最小为1
 | 
			
		||||
	Status       models.PigBatchStatus     `json:"status" validate:"required"`              // 批次状态,必填
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PigBatchUpdateDTO 定义了更新猪批次的请求结构
 | 
			
		||||
@@ -27,7 +27,7 @@ type PigBatchUpdateDTO struct {
 | 
			
		||||
 | 
			
		||||
// PigBatchQueryDTO 定义了查询猪批次的请求结构
 | 
			
		||||
type PigBatchQueryDTO struct {
 | 
			
		||||
	IsActive *bool `json:"is_active" form:"is_active"` // 是否活跃,可选,用于URL查询参数
 | 
			
		||||
	IsActive *bool `json:"is_active" query:"is_active"` // 是否活跃,可选,用于URL查询参数
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PigBatchResponseDTO 定义了猪批次信息的响应结构
 | 
			
		||||
@@ -48,115 +48,115 @@ type PigBatchResponseDTO struct {
 | 
			
		||||
 | 
			
		||||
// AssignEmptyPensToBatchRequest 用于为猪批次分配空栏的请求体
 | 
			
		||||
type AssignEmptyPensToBatchRequest struct {
 | 
			
		||||
	PenIDs []uint `json:"penIDs" binding:"required,min=1" example:"[1,2,3]"` // 待分配的猪栏ID列表
 | 
			
		||||
	PenIDs []uint `json:"penIDs" validate:"required,min=1,dive" example:"[1,2,3]"` // 待分配的猪栏ID列表
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReclassifyPenToNewBatchRequest 用于将猪栏划拨到新批次的请求体
 | 
			
		||||
type ReclassifyPenToNewBatchRequest struct {
 | 
			
		||||
	ToBatchID uint   `json:"toBatchID" binding:"required"` // 目标猪批次ID
 | 
			
		||||
	PenID     uint   `json:"penID" binding:"required"`     // 待划拨的猪栏ID
 | 
			
		||||
	ToBatchID uint   `json:"toBatchID" validate:"required"` // 目标猪批次ID
 | 
			
		||||
	PenID     uint   `json:"penID" validate:"required"`     // 待划拨的猪栏ID
 | 
			
		||||
	Remarks   string `json:"remarks"`                       // 备注
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveEmptyPenFromBatchRequest 用于从猪批次移除空栏的请求体
 | 
			
		||||
type RemoveEmptyPenFromBatchRequest struct {
 | 
			
		||||
	PenID uint `json:"penID" binding:"required"` // 待移除的猪栏ID
 | 
			
		||||
	PenID uint `json:"penID" validate:"required"` // 待移除的猪栏ID
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MovePigsIntoPenRequest 用于将猪只从“虚拟库存”移入指定猪栏的请求体
 | 
			
		||||
type MovePigsIntoPenRequest struct {
 | 
			
		||||
	ToPenID  uint   `json:"toPenID" binding:"required"`        // 目标猪栏ID
 | 
			
		||||
	Quantity int    `json:"quantity" binding:"required,min=1"` // 移入猪只数量
 | 
			
		||||
	ToPenID  uint   `json:"toPenID" validate:"required"`        // 目标猪栏ID
 | 
			
		||||
	Quantity int    `json:"quantity" validate:"required,min=1"` // 移入猪只数量
 | 
			
		||||
	Remarks  string `json:"remarks"`                            // 备注
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SellPigsRequest 用于处理卖猪的请求体
 | 
			
		||||
type SellPigsRequest struct {
 | 
			
		||||
	PenID      uint      `json:"penID" binding:"required"`            // 猪栏ID
 | 
			
		||||
	Quantity   int       `json:"quantity" binding:"required,min=1"`   // 卖出猪只数量
 | 
			
		||||
	UnitPrice  float64   `json:"unitPrice" binding:"required,min=0"`  // 单价
 | 
			
		||||
	TotalPrice float64   `json:"totalPrice" binding:"required,min=0"` // 总价
 | 
			
		||||
	TraderName string    `json:"traderName" binding:"required"`       // 交易方名称
 | 
			
		||||
	TradeDate  time.Time `json:"tradeDate" binding:"required"`        // 交易日期
 | 
			
		||||
	PenID      uint      `json:"penID" validate:"required"`            // 猪栏ID
 | 
			
		||||
	Quantity   int       `json:"quantity" validate:"required,min=1"`   // 卖出猪只数量
 | 
			
		||||
	UnitPrice  float64   `json:"unitPrice" validate:"required,min=0"`  // 单价
 | 
			
		||||
	TotalPrice float64   `json:"totalPrice" validate:"required,min=0"` // 总价
 | 
			
		||||
	TraderName string    `json:"traderName" validate:"required"`       // 交易方名称
 | 
			
		||||
	TradeDate  time.Time `json:"tradeDate" validate:"required"`        // 交易日期
 | 
			
		||||
	Remarks    string    `json:"remarks"`                              // 备注
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BuyPigsRequest 用于处理买猪的请求体
 | 
			
		||||
type BuyPigsRequest struct {
 | 
			
		||||
	PenID      uint      `json:"penID" binding:"required"`            // 猪栏ID
 | 
			
		||||
	Quantity   int       `json:"quantity" binding:"required,min=1"`   // 买入猪只数量
 | 
			
		||||
	UnitPrice  float64   `json:"unitPrice" binding:"required,min=0"`  // 单价
 | 
			
		||||
	TotalPrice float64   `json:"totalPrice" binding:"required,min=0"` // 总价
 | 
			
		||||
	TraderName string    `json:"traderName" binding:"required"`       // 交易方名称
 | 
			
		||||
	TradeDate  time.Time `json:"tradeDate" binding:"required"`        // 交易日期
 | 
			
		||||
	PenID      uint      `json:"penID" validate:"required"`            // 猪栏ID
 | 
			
		||||
	Quantity   int       `json:"quantity" validate:"required,min=1"`   // 买入猪只数量
 | 
			
		||||
	UnitPrice  float64   `json:"unitPrice" validate:"required,min=0"`  // 单价
 | 
			
		||||
	TotalPrice float64   `json:"totalPrice" validate:"required,min=0"` // 总价
 | 
			
		||||
	TraderName string    `json:"traderName" validate:"required"`       // 交易方名称
 | 
			
		||||
	TradeDate  time.Time `json:"tradeDate" validate:"required"`        // 交易日期
 | 
			
		||||
	Remarks    string    `json:"remarks"`                              // 备注
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TransferPigsAcrossBatchesRequest 用于跨猪群调栏的请求体
 | 
			
		||||
type TransferPigsAcrossBatchesRequest struct {
 | 
			
		||||
	DestBatchID uint   `json:"destBatchID" binding:"required"`    // 目标猪批次ID
 | 
			
		||||
	FromPenID   uint   `json:"fromPenID" binding:"required"`      // 源猪栏ID
 | 
			
		||||
	ToPenID     uint   `json:"toPenID" binding:"required"`        // 目标猪栏ID
 | 
			
		||||
	Quantity    uint   `json:"quantity" binding:"required,min=1"` // 调栏猪只数量
 | 
			
		||||
	DestBatchID uint   `json:"destBatchID" validate:"required"`    // 目标猪批次ID
 | 
			
		||||
	FromPenID   uint   `json:"fromPenID" validate:"required"`      // 源猪栏ID
 | 
			
		||||
	ToPenID     uint   `json:"toPenID" validate:"required"`        // 目标猪栏ID
 | 
			
		||||
	Quantity    uint   `json:"quantity" validate:"required,min=1"` // 调栏猪只数量
 | 
			
		||||
	Remarks     string `json:"remarks"`                            // 备注
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TransferPigsWithinBatchRequest 用于群内调栏的请求体
 | 
			
		||||
type TransferPigsWithinBatchRequest struct {
 | 
			
		||||
	FromPenID uint   `json:"fromPenID" binding:"required"`      // 源猪栏ID
 | 
			
		||||
	ToPenID   uint   `json:"toPenID" binding:"required"`        // 目标猪栏ID
 | 
			
		||||
	Quantity  uint   `json:"quantity" binding:"required,min=1"` // 调栏猪只数量
 | 
			
		||||
	FromPenID uint   `json:"fromPenID" validate:"required"`      // 源猪栏ID
 | 
			
		||||
	ToPenID   uint   `json:"toPenID" validate:"required"`        // 目标猪栏ID
 | 
			
		||||
	Quantity  uint   `json:"quantity" validate:"required,min=1"` // 调栏猪只数量
 | 
			
		||||
	Remarks   string `json:"remarks"`                            // 备注
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RecordSickPigsRequest 用于记录新增病猪事件的请求体
 | 
			
		||||
type RecordSickPigsRequest struct {
 | 
			
		||||
	PenID             uint                                    `json:"penID" binding:"required"`             // 猪栏ID
 | 
			
		||||
	Quantity          int                                     `json:"quantity" binding:"required,min=1"`    // 病猪数量
 | 
			
		||||
	TreatmentLocation models.PigBatchSickPigTreatmentLocation `json:"treatmentLocation" binding:"required"` // 治疗地点
 | 
			
		||||
	HappenedAt        time.Time                               `json:"happenedAt" binding:"required"`        // 发生时间
 | 
			
		||||
	PenID             uint                                    `json:"penID" validate:"required"`             // 猪栏ID
 | 
			
		||||
	Quantity          int                                     `json:"quantity" validate:"required,min=1"`    // 病猪数量
 | 
			
		||||
	TreatmentLocation models.PigBatchSickPigTreatmentLocation `json:"treatmentLocation" validate:"required"` // 治疗地点
 | 
			
		||||
	HappenedAt        time.Time                               `json:"happenedAt" validate:"required"`        // 发生时间
 | 
			
		||||
	Remarks           string                                  `json:"remarks"`                               // 备注
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RecordSickPigRecoveryRequest 用于记录病猪康复事件的请求体
 | 
			
		||||
type RecordSickPigRecoveryRequest struct {
 | 
			
		||||
	PenID             uint                                    `json:"penID" binding:"required"`             // 猪栏ID
 | 
			
		||||
	Quantity          int                                     `json:"quantity" binding:"required,min=1"`    // 康复猪数量
 | 
			
		||||
	TreatmentLocation models.PigBatchSickPigTreatmentLocation `json:"treatmentLocation" binding:"required"` // 治疗地点
 | 
			
		||||
	HappenedAt        time.Time                               `json:"happenedAt" binding:"required"`        // 发生时间
 | 
			
		||||
	PenID             uint                                    `json:"penID" validate:"required"`             // 猪栏ID
 | 
			
		||||
	Quantity          int                                     `json:"quantity" validate:"required,min=1"`    // 康复猪数量
 | 
			
		||||
	TreatmentLocation models.PigBatchSickPigTreatmentLocation `json:"treatmentLocation" validate:"required"` // 治疗地点
 | 
			
		||||
	HappenedAt        time.Time                               `json:"happenedAt" validate:"required"`        // 发生时间
 | 
			
		||||
	Remarks           string                                  `json:"remarks"`                               // 备注
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RecordSickPigDeathRequest 用于记录病猪死亡事件的请求体
 | 
			
		||||
type RecordSickPigDeathRequest struct {
 | 
			
		||||
	PenID             uint                                    `json:"penID" binding:"required"`             // 猪栏ID
 | 
			
		||||
	Quantity          int                                     `json:"quantity" binding:"required,min=1"`    // 死亡猪数量
 | 
			
		||||
	TreatmentLocation models.PigBatchSickPigTreatmentLocation `json:"treatmentLocation" binding:"required"` // 治疗地点
 | 
			
		||||
	HappenedAt        time.Time                               `json:"happenedAt" binding:"required"`        // 发生时间
 | 
			
		||||
	PenID             uint                                    `json:"penID" validate:"required"`             // 猪栏ID
 | 
			
		||||
	Quantity          int                                     `json:"quantity" validate:"required,min=1"`    // 死亡猪数量
 | 
			
		||||
	TreatmentLocation models.PigBatchSickPigTreatmentLocation `json:"treatmentLocation" validate:"required"` // 治疗地点
 | 
			
		||||
	HappenedAt        time.Time                               `json:"happenedAt" validate:"required"`        // 发生时间
 | 
			
		||||
	Remarks           string                                  `json:"remarks"`                               // 备注
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RecordSickPigCullRequest 用于记录病猪淘汰事件的请求体
 | 
			
		||||
type RecordSickPigCullRequest struct {
 | 
			
		||||
	PenID             uint                                    `json:"penID" binding:"required"`             // 猪栏ID
 | 
			
		||||
	Quantity          int                                     `json:"quantity" binding:"required,min=1"`    // 淘汰猪数量
 | 
			
		||||
	TreatmentLocation models.PigBatchSickPigTreatmentLocation `json:"treatmentLocation" binding:"required"` // 治疗地点
 | 
			
		||||
	HappenedAt        time.Time                               `json:"happenedAt" binding:"required"`        // 发生时间
 | 
			
		||||
	PenID             uint                                    `json:"penID" validate:"required"`             // 猪栏ID
 | 
			
		||||
	Quantity          int                                     `json:"quantity" validate:"required,min=1"`    // 淘汰猪数量
 | 
			
		||||
	TreatmentLocation models.PigBatchSickPigTreatmentLocation `json:"treatmentLocation" validate:"required"` // 治疗地点
 | 
			
		||||
	HappenedAt        time.Time                               `json:"happenedAt" validate:"required"`        // 发生时间
 | 
			
		||||
	Remarks           string                                  `json:"remarks"`                               // 备注
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RecordDeathRequest 用于记录正常猪只死亡事件的请求体
 | 
			
		||||
type RecordDeathRequest struct {
 | 
			
		||||
	PenID      uint      `json:"penID" binding:"required"`          // 猪栏ID
 | 
			
		||||
	Quantity   int       `json:"quantity" binding:"required,min=1"` // 死亡猪数量
 | 
			
		||||
	HappenedAt time.Time `json:"happenedAt" binding:"required"`     // 发生时间
 | 
			
		||||
	PenID      uint      `json:"penID" validate:"required"`          // 猪栏ID
 | 
			
		||||
	Quantity   int       `json:"quantity" validate:"required,min=1"` // 死亡猪数量
 | 
			
		||||
	HappenedAt time.Time `json:"happenedAt" validate:"required"`     // 发生时间
 | 
			
		||||
	Remarks    string    `json:"remarks"`                            // 备注
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RecordCullRequest 用于记录正常猪只淘汰事件的请求体
 | 
			
		||||
type RecordCullRequest struct {
 | 
			
		||||
	PenID      uint      `json:"penID" binding:"required"`          // 猪栏ID
 | 
			
		||||
	Quantity   int       `json:"quantity" binding:"required,min=1"` // 淘汰猪数量
 | 
			
		||||
	HappenedAt time.Time `json:"happenedAt" binding:"required"`     // 发生时间
 | 
			
		||||
	PenID      uint      `json:"penID" validate:"required"`          // 猪栏ID
 | 
			
		||||
	Quantity   int       `json:"quantity" validate:"required,min=1"` // 淘汰猪数量
 | 
			
		||||
	HappenedAt time.Time `json:"happenedAt" validate:"required"`     // 发生时间
 | 
			
		||||
	Remarks    string    `json:"remarks"`                            // 备注
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -22,32 +22,32 @@ type PenResponse struct {
 | 
			
		||||
 | 
			
		||||
// CreatePigHouseRequest 定义了创建猪舍的请求结构
 | 
			
		||||
type CreatePigHouseRequest struct {
 | 
			
		||||
	Name        string `json:"name" binding:"required"`
 | 
			
		||||
	Name        string `json:"name" validate:"required"`
 | 
			
		||||
	Description string `json:"description"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UpdatePigHouseRequest 定义了更新猪舍的请求结构
 | 
			
		||||
type UpdatePigHouseRequest struct {
 | 
			
		||||
	Name        string `json:"name" binding:"required"`
 | 
			
		||||
	Name        string `json:"name" validate:"required"`
 | 
			
		||||
	Description string `json:"description"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CreatePenRequest 定义了创建猪栏的请求结构
 | 
			
		||||
type CreatePenRequest struct {
 | 
			
		||||
	PenNumber string `json:"pen_number" binding:"required"`
 | 
			
		||||
	HouseID   uint   `json:"house_id" binding:"required"`
 | 
			
		||||
	Capacity  int    `json:"capacity" binding:"required"`
 | 
			
		||||
	PenNumber string `json:"pen_number" validate:"required"`
 | 
			
		||||
	HouseID   uint   `json:"house_id" validate:"required"`
 | 
			
		||||
	Capacity  int    `json:"capacity" validate:"required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UpdatePenRequest 定义了更新猪栏的请求结构
 | 
			
		||||
type UpdatePenRequest struct {
 | 
			
		||||
	PenNumber string           `json:"pen_number" binding:"required"`
 | 
			
		||||
	HouseID   uint             `json:"house_id" binding:"required"`
 | 
			
		||||
	Capacity  int              `json:"capacity" binding:"required"`
 | 
			
		||||
	Status    models.PenStatus `json:"status" binding:"required,oneof=空闲 使用中 病猪栏 康复栏 清洗消毒 维修中"` // 添加oneof校验
 | 
			
		||||
	PenNumber string           `json:"pen_number" validate:"required"`
 | 
			
		||||
	HouseID   uint             `json:"house_id" validate:"required"`
 | 
			
		||||
	Capacity  int              `json:"capacity" validate:"required"`
 | 
			
		||||
	Status    models.PenStatus `json:"status" validate:"required,oneof=空闲 使用中 病猪栏 康复栏 清洗消毒 维修中"` // 添加oneof校验
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UpdatePenStatusRequest 定义了更新猪栏状态的请求结构
 | 
			
		||||
type UpdatePenStatusRequest struct {
 | 
			
		||||
	Status models.PenStatus `json:"status" binding:"required,oneof=空闲 使用中 病猪栏 康复栏 清洗消毒 维修中" example:"病猪栏"`
 | 
			
		||||
	Status models.PenStatus `json:"status" validate:"required,oneof=空闲 使用中 病猪栏 康复栏 清洗消毒 维修中" example:"病猪栏"`
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,20 +7,20 @@ import (
 | 
			
		||||
 | 
			
		||||
// ListPlansQuery 定义了获取计划列表时的查询参数
 | 
			
		||||
type ListPlansQuery struct {
 | 
			
		||||
	PlanType repository.PlanTypeFilter `form:"planType,default=自定义任务"` // 计划类型
 | 
			
		||||
	Page     int                       `form:"page,default=1"`         // 页码
 | 
			
		||||
	PageSize int                       `form:"pageSize,default=10"`    // 每页大小
 | 
			
		||||
	PlanType repository.PlanTypeFilter `query:"planType"` // 计划类型
 | 
			
		||||
	Page     int                       `query:"page"`     // 页码
 | 
			
		||||
	PageSize int                       `query:"pageSize"` // 每页大小
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CreatePlanRequest 定义创建计划请求的结构体
 | 
			
		||||
type CreatePlanRequest struct {
 | 
			
		||||
	Name           string                   `json:"name" binding:"required" example:"猪舍温度控制计划"`
 | 
			
		||||
	Name           string                   `json:"name" validate:"required" example:"猪舍温度控制计划"`
 | 
			
		||||
	Description    string                   `json:"description" example:"根据温度自动调节风扇和加热器"`
 | 
			
		||||
	ExecutionType  models.PlanExecutionType `json:"execution_type" binding:"required" example:"自动"`
 | 
			
		||||
	ExecuteNum     uint                     `json:"execute_num,omitempty" example:"10"`
 | 
			
		||||
	CronExpression string                   `json:"cron_expression" example:"0 0 6 * * *"`
 | 
			
		||||
	SubPlanIDs     []uint                   `json:"sub_plan_ids,omitempty"`
 | 
			
		||||
	Tasks          []TaskRequest            `json:"tasks,omitempty"`
 | 
			
		||||
	ExecutionType  models.PlanExecutionType `json:"execution_type" validate:"required" example:"自动"`
 | 
			
		||||
	ExecuteNum     uint                     `json:"execute_num,omitempty" validate:"omitempty,min=0" example:"10"`
 | 
			
		||||
	CronExpression string                   `json:"cron_expression" validate:"omitempty,cron" example:"0 0 6 * * *"`
 | 
			
		||||
	SubPlanIDs     []uint                   `json:"sub_plan_ids,omitempty" validate:"omitempty,dive"`
 | 
			
		||||
	Tasks          []TaskRequest            `json:"tasks,omitempty" validate:"omitempty,dive"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PlanResponse 定义计划详情响应的结构体
 | 
			
		||||
@@ -49,11 +49,11 @@ type ListPlansResponse struct {
 | 
			
		||||
type UpdatePlanRequest struct {
 | 
			
		||||
	Name           string                   `json:"name" example:"猪舍温度控制计划V2"`
 | 
			
		||||
	Description    string                   `json:"description" example:"更新后的描述"`
 | 
			
		||||
	ExecutionType  models.PlanExecutionType `json:"execution_type" binding:"required" example:"自动"`
 | 
			
		||||
	ExecuteNum     uint                     `json:"execute_num,omitempty" example:"10"`
 | 
			
		||||
	CronExpression string                   `json:"cron_expression" example:"0 0 6 * * *"`
 | 
			
		||||
	SubPlanIDs     []uint                   `json:"sub_plan_ids,omitempty"`
 | 
			
		||||
	Tasks          []TaskRequest            `json:"tasks,omitempty"`
 | 
			
		||||
	ExecutionType  models.PlanExecutionType `json:"execution_type" validate:"required" example:"自动"`
 | 
			
		||||
	ExecuteNum     uint                     `json:"execute_num,omitempty" validate:"omitempty,min=0" example:"10"`
 | 
			
		||||
	CronExpression string                   `json:"cron_expression" validate:"omitempty,cron" example:"0 0 6 * * *"`
 | 
			
		||||
	SubPlanIDs     []uint                   `json:"sub_plan_ids,omitempty" validate:"omitempty,dive"`
 | 
			
		||||
	Tasks          []TaskRequest            `json:"tasks,omitempty" validate:"omitempty,dive"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SubPlanResponse 定义子计划响应结构体
 | 
			
		||||
 
 | 
			
		||||
@@ -2,15 +2,15 @@ package dto
 | 
			
		||||
 | 
			
		||||
// CreateUserRequest 定义创建用户请求的结构体
 | 
			
		||||
type CreateUserRequest struct {
 | 
			
		||||
	Username string `json:"username" binding:"required" example:"newuser"`
 | 
			
		||||
	Password string `json:"password" binding:"required" example:"password123"`
 | 
			
		||||
	Username string `json:"username" validate:"required" example:"newuser"`
 | 
			
		||||
	Password string `json:"password" validate:"required" example:"password123"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LoginRequest 定义登录请求的结构体
 | 
			
		||||
type LoginRequest struct {
 | 
			
		||||
	// Identifier 可以是用户名、邮箱、手机号、微信号或飞书账号
 | 
			
		||||
	Identifier string `json:"identifier" binding:"required" example:"testuser"`
 | 
			
		||||
	Password   string `json:"password" binding:"required" example:"password123"`
 | 
			
		||||
	Identifier string `json:"identifier" validate:"required" example:"testuser"`
 | 
			
		||||
	Password   string `json:"password" validate:"required" example:"password123"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CreateUserResponse 定义创建用户成功响应的结构体
 | 
			
		||||
 
 | 
			
		||||
@@ -48,285 +48,285 @@
 | 
			
		||||
        - [x] `internal/app/controller/plan/plan_controller.go`
 | 
			
		||||
        - [x] `internal/app/controller/user/user_controller.go`
 | 
			
		||||
 | 
			
		||||
- [ ] **5. DTO 结构体注解**
 | 
			
		||||
    - [ ] **通用修改规则**:
 | 
			
		||||
        - [ ] `json:"..."` 标签保持不变。
 | 
			
		||||
        - [ ] `example:"..."` 标签保持不变。
 | 
			
		||||
        - [ ] 将 `binding:"required"` 替换为 `validate:"required"`。
 | 
			
		||||
        - [ ] 将 `form:"field,default=value"` 替换为 `query:"field"`。`default` 行为需在代码中手动实现(如在 DTO 构造函数中设置默认值),标签中不再需要。
 | 
			
		||||
        - [ ] 将 `form:"field"` 替换为 `query:"field"`。
 | 
			
		||||
        - [ ] 对于 `json:"...,omitempty"` 的字段,在 `validate` 标签中也添加 `omitempty`。
 | 
			
		||||
        - [ ] 对于结构体切片或数组字段,在 `validate` 标签中添加 `dive` 以递归验证切片元素。
 | 
			
		||||
        - [ ] 根据字段的业务含义,添加更具体的 `validate` 规则(例如 `min=0`, `cron` 等)。
 | 
			
		||||
- [x] **5. DTO 结构体注解**
 | 
			
		||||
    - [x] **通用修改规则**:
 | 
			
		||||
        - [x] `json:"..."` 标签保持不变。
 | 
			
		||||
        - [x] `example:"..."` 标签保持不变。
 | 
			
		||||
        - [x] 将 `binding:"required"` 替换为 `validate:"required"`。
 | 
			
		||||
        - [x] 将 `form:"field,default=value"` 替换为 `query:"field"`。`default` 行为需在代码中手动实现(如在 DTO 构造函数中设置默认值),标签中不再需要。
 | 
			
		||||
        - [x] 将 `form:"field"` 替换为 `query:"field"`。
 | 
			
		||||
        - [x] 对于 `json:"...,omitempty"` 的字段,在 `validate` 标签中也添加 `omitempty`。
 | 
			
		||||
        - [x] 对于结构体切片或数组字段,在 `validate` 标签中添加 `dive` 以递归验证切片元素。
 | 
			
		||||
        - [x] 根据字段的业务含义,添加更具体的 `validate` 规则(例如 `min=0`, `cron` 等)。
 | 
			
		||||
 | 
			
		||||
    - [ ] **文件清单** (按 `internal/app/dto` 目录下的文件顺序):
 | 
			
		||||
        - [ ] `internal/app/dto/plan_dto.go`
 | 
			
		||||
            - [ ] `ListPlansQuery.PlanType`: `form:"planType,default=自定义任务"` -> `query:"planType"`
 | 
			
		||||
            - [ ] `ListPlansQuery.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListPlansQuery.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `CreatePlanRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `CreatePlanRequest.ExecutionType`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `CreatePlanRequest.ExecuteNum`: 添加 `validate:"omitempty,min=0"`
 | 
			
		||||
            - [ ] `CreatePlanRequest.CronExpression`: 添加 `validate:"omitempty,cron"`
 | 
			
		||||
            - [ ] `CreatePlanRequest.SubPlanIDs`: 添加 `validate:"omitempty,dive"`
 | 
			
		||||
            - [ ] `CreatePlanRequest.Tasks`: 添加 `validate:"omitempty,dive"`
 | 
			
		||||
            - [ ] `UpdatePlanRequest.ExecutionType`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `UpdatePlanRequest.ExecuteNum`: 添加 `validate:"omitempty,min=0"`
 | 
			
		||||
            - [ ] `UpdatePlanRequest.CronExpression`: 添加 `validate:"omitempty,cron"`
 | 
			
		||||
            - [ ] `UpdatePlanRequest.SubPlanIDs`: 添加 `validate:"omitempty,dive"`
 | 
			
		||||
            - [ ] `UpdatePlanRequest.Tasks`: 添加 `validate:"omitempty,dive"`
 | 
			
		||||
        - [ ] `internal/app/dto/user_dto.go`
 | 
			
		||||
            - [ ] `CreateUserRequest.Username`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `CreateUserRequest.Password`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `LoginRequest.Identifier`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `LoginRequest.Password`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
        - [ ] `internal/app/dto/device_dto.go`
 | 
			
		||||
            - [ ] `CreateDeviceRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `CreateDeviceRequest.DeviceTemplateID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `CreateDeviceRequest.AreaControllerID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `CreateDeviceRequest.Location`: `json:"location,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [ ] `CreateDeviceRequest.Properties`: `json:"properties,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [ ] `UpdateDeviceRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `UpdateDeviceRequest.DeviceTemplateID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `UpdateDeviceRequest.AreaControllerID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `UpdateDeviceRequest.Location`: `json:"location,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [ ] `UpdateDeviceRequest.Properties`: `json:"properties,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [ ] `CreateAreaControllerRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `CreateAreaControllerRequest.NetworkID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `CreateAreaControllerRequest.Location`: `json:"location,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [ ] `CreateAreaControllerRequest.Properties`: `json:"properties,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [ ] `UpdateAreaControllerRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `UpdateAreaControllerRequest.NetworkID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `UpdateAreaControllerRequest.Location`: `json:"location,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [ ] `UpdateAreaControllerRequest.Properties`: `json:"properties,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [ ] `CreateDeviceTemplateRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `CreateDeviceTemplateRequest.Manufacturer`: `json:"manufacturer,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [ ] `CreateDeviceTemplateRequest.Description`: `json:"description,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [ ] `CreateDeviceTemplateRequest.Category`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `CreateDeviceTemplateRequest.Commands`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `CreateDeviceTemplateRequest.Values`: `json:"values,omitempty"` -> `validate:"omitempty,dive"`
 | 
			
		||||
            - [ ] `UpdateDeviceTemplateRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `UpdateDeviceTemplateRequest.Manufacturer`: `json:"manufacturer,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [ ] `UpdateDeviceTemplateRequest.Description`: `json:"description,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [ ] `UpdateDeviceTemplateRequest.Category`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `UpdateDeviceTemplateRequest.Commands`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `UpdateDeviceTemplateRequest.Values`: `json:"values,omitempty"` -> `validate:"omitempty,dive"`
 | 
			
		||||
        - [ ] `internal/app/dto/monitor_dto.go`
 | 
			
		||||
            - [ ] `ListSensorDataRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListSensorDataRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListSensorDataRequest.DeviceID`: `form:"device_id"` -> `query:"device_id"`
 | 
			
		||||
            - [ ] `ListSensorDataRequest.SensorType`: `form:"sensor_type"` -> `query:"sensor_type"`
 | 
			
		||||
            - [ ] `ListSensorDataRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListSensorDataRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListSensorDataRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListDeviceCommandLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListDeviceCommandLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListDeviceCommandLogRequest.DeviceID`: `form:"device_id"` -> `query:"device_id"`
 | 
			
		||||
            - [ ] `ListDeviceCommandLogRequest.ReceivedSuccess`: `form:"received_success"` -> `query:"received_success"`
 | 
			
		||||
            - [ ] `ListDeviceCommandLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListDeviceCommandLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListDeviceCommandLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListPlanExecutionLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListPlanExecutionLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListPlanExecutionLogRequest.PlanID`: `form:"plan_id"` -> `query:"plan_id"`
 | 
			
		||||
            - [ ] `ListPlanExecutionLogRequest.Status`: `form:"status"` -> `query:"status"`
 | 
			
		||||
            - [ ] `ListPlanExecutionLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListPlanExecutionLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListPlanExecutionLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListTaskExecutionLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListTaskExecutionLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListTaskExecutionLogRequest.PlanExecutionLogID`: `form:"plan_execution_log_id"` -> `query:"plan_execution_log_id"`
 | 
			
		||||
            - [ ] `ListTaskExecutionLogRequest.TaskID`: `form:"task_id"` -> `query:"task_id"`
 | 
			
		||||
            - [ ] `ListTaskExecutionLogRequest.Status`: `form:"status"` -> `query:"status"`
 | 
			
		||||
            - [ ] `ListTaskExecutionLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListTaskExecutionLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListTaskExecutionLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListPendingCollectionRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListPendingCollectionRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListPendingCollectionRequest.DeviceID`: `form:"device_id"` -> `query:"device_id"`
 | 
			
		||||
            - [ ] `ListPendingCollectionRequest.Status`: `form:"status"` -> `query:"status"`
 | 
			
		||||
            - [ ] `ListPendingCollectionRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListPendingCollectionRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListPendingCollectionRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListUserActionLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListUserActionLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListUserActionLogRequest.UserID`: `form:"user_id"` -> `query:"user_id"`
 | 
			
		||||
            - [ ] `ListUserActionLogRequest.Username`: `form:"username"` -> `query:"username"`
 | 
			
		||||
            - [ ] `ListUserActionLogRequest.ActionType`: `form:"action_type"` -> `query:"action_type"`
 | 
			
		||||
            - [ ] `ListUserActionLogRequest.Status`: `form:"status"` -> `query:"status"`
 | 
			
		||||
            - [ ] `ListUserActionLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListUserActionLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListUserActionLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListRawMaterialPurchaseRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListRawMaterialPurchaseRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListRawMaterialPurchaseRequest.RawMaterialID`: `form:"raw_material_id"` -> `query:"raw_material_id"`
 | 
			
		||||
            - [ ] `ListRawMaterialPurchaseRequest.Supplier`: `form:"supplier"` -> `query:"supplier"`
 | 
			
		||||
            - [ ] `ListRawMaterialPurchaseRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListRawMaterialPurchaseRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListRawMaterialPurchaseRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListRawMaterialStockLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListRawMaterialStockLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListRawMaterialStockLogRequest.RawMaterialID`: `form:"raw_material_id"` -> `query:"raw_material_id"`
 | 
			
		||||
            - [ ] `ListRawMaterialStockLogRequest.SourceType`: `form:"source_type"` -> `query:"source_type"`
 | 
			
		||||
            - [ ] `ListRawMaterialStockLogRequest.SourceID`: `form:"source_id"` -> `query:"source_id"`
 | 
			
		||||
            - [ ] `ListRawMaterialStockLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListRawMaterialStockLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListRawMaterialStockLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListFeedUsageRecordRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListFeedUsageRecordRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListFeedUsageRecordRequest.PenID`: `form:"pen_id"` -> `query:"pen_id"`
 | 
			
		||||
            - [ ] `ListFeedUsageRecordRequest.FeedFormulaID`: `form:"feed_formula_id"` -> `query:"feed_formula_id"`
 | 
			
		||||
            - [ ] `ListFeedUsageRecordRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [ ] `ListFeedUsageRecordRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListFeedUsageRecordRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListFeedUsageRecordRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListMedicationLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListMedicationLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListMedicationLogRequest.PigBatchID`: `form:"pig_batch_id"` -> `query:"pig_batch_id"`
 | 
			
		||||
            - [ ] `ListMedicationLogRequest.MedicationID`: `form:"medication_id"` -> `query:"medication_id"`
 | 
			
		||||
            - [ ] `ListMedicationLogRequest.Reason`: `form:"reason"` -> `query:"reason"`
 | 
			
		||||
            - [ ] `ListMedicationLogRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [ ] `ListMedicationLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListMedicationLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListMedicationLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListPigBatchLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListPigBatchLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListPigBatchLogRequest.PigBatchID`: `form:"pig_batch_id"` -> `query:"pig_batch_id"`
 | 
			
		||||
            - [ ] `ListPigBatchLogRequest.ChangeType`: `form:"change_type"` -> `query:"change_type"`
 | 
			
		||||
            - [ ] `ListPigBatchLogRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [ ] `ListPigBatchLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListPigBatchLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListPigBatchLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListWeighingBatchRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListWeighingBatchRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListWeighingBatchRequest.PigBatchID`: `form:"pig_batch_id"` -> `query:"pig_batch_id"`
 | 
			
		||||
            - [ ] `ListWeighingBatchRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListWeighingBatchRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListWeighingBatchRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListWeighingRecordRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListWeighingRecordRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListWeighingRecordRequest.WeighingBatchID`: `form:"weighing_batch_id"` -> `query:"weighing_batch_id"`
 | 
			
		||||
            - [ ] `ListWeighingRecordRequest.PenID`: `form:"pen_id"` -> `query:"pen_id"`
 | 
			
		||||
            - [ ] `ListWeighingRecordRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [ ] `ListWeighingRecordRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListWeighingRecordRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListWeighingRecordRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListPigTransferLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListPigTransferLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListPigTransferLogRequest.PigBatchID`: `form:"pig_batch_id"` -> `query:"pig_batch_id"`
 | 
			
		||||
            - [ ] `ListPigTransferLogRequest.PenID`: `form:"pen_id"` -> `query:"pen_id"`
 | 
			
		||||
            - [ ] `ListPigTransferLogRequest.TransferType`: `form:"transfer_type"` -> `query:"transfer_type"`
 | 
			
		||||
            - [ ] `ListPigTransferLogRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [ ] `ListPigTransferLogRequest.CorrelationID`: `form:"correlation_id"` -> `query:"correlation_id"`
 | 
			
		||||
            - [ ] `ListPigTransferLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListPigTransferLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListPigTransferLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListPigSickLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListPigSickLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListPigSickLogRequest.PigBatchID`: `form:"pig_batch_id"` -> `query:"pig_batch_id"`
 | 
			
		||||
            - [ ] `ListPigSickLogRequest.PenID`: `form:"pen_id"` -> `query:"pen_id"`
 | 
			
		||||
            - [ ] `ListPigSickLogRequest.Reason`: `form:"reason"` -> `query:"reason"`
 | 
			
		||||
            - [ ] `ListPigSickLogRequest.TreatmentLocation`: `form:"treatment_location"` -> `query:"treatment_location"`
 | 
			
		||||
            - [ ] `ListPigSickLogRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [ ] `ListPigSickLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListPigSickLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListPigSickLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListPigPurchaseRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListPigPurchaseRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListPigPurchaseRequest.PigBatchID`: `form:"pig_batch_id"` -> `query:"pig_batch_id"`
 | 
			
		||||
            - [ ] `ListPigPurchaseRequest.Supplier`: `form:"supplier"` -> `query:"supplier"`
 | 
			
		||||
            - [ ] `ListPigPurchaseRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [ ] `ListPigPurchaseRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListPigPurchaseRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListPigPurchaseRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [ ] `ListPigSaleRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListPigSaleRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListPigSaleRequest.PigBatchID`: `form:"pig_batch_id"` -> `query:"pig_batch_id"`
 | 
			
		||||
            - [ ] `ListPigSaleRequest.Buyer`: `form:"buyer"` -> `query:"buyer"`
 | 
			
		||||
            - [ ] `ListPigSaleRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [ ] `ListPigSaleRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListPigSaleRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListPigSaleRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
        - [ ] `internal/app/dto/pig_farm_dto.go`
 | 
			
		||||
            - [ ] `CreatePigHouseRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `UpdatePigHouseRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `CreatePenRequest.PenNumber`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `CreatePenRequest.HouseID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `CreatePenRequest.Capacity`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `UpdatePenRequest.PenNumber`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `UpdatePenRequest.HouseID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `UpdatePenRequest.Capacity`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `UpdatePenRequest.Status`: `binding:"required,oneof=空闲 使用中 病猪栏 康复栏 清洗消毒 维修中"` -> `validate:"required,oneof=空闲 使用中 病猪栏 康复栏 清洗消毒 维修中"`
 | 
			
		||||
            - [ ] `UpdatePenStatusRequest.Status`: `binding:"required,oneof=空闲 使用中 病猪栏 康复栏 清洗消毒 维修中"` -> `validate:"required,oneof=空闲 使用中 病猪栏 康复栏 清洗消毒 维修中"`
 | 
			
		||||
        - [ ] `internal/app/dto/pig_batch_dto.go`
 | 
			
		||||
            - [ ] `PigBatchCreateDTO.BatchNumber`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `PigBatchCreateDTO.OriginType`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `PigBatchCreateDTO.StartDate`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `PigBatchCreateDTO.InitialCount`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [ ] `PigBatchCreateDTO.Status`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `PigBatchQueryDTO.IsActive`: `form:"is_active"` -> `query:"is_active"`
 | 
			
		||||
            - [ ] `AssignEmptyPensToBatchRequest.PenIDs`: `binding:"required,min=1"` -> `validate:"required,min=1,dive"`
 | 
			
		||||
            - [ ] `ReclassifyPenToNewBatchRequest.ToBatchID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `ReclassifyPenToNewBatchRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RemoveEmptyPenFromBatchRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `MovePigsIntoPenRequest.ToPenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `MovePigsIntoPenRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [ ] `SellPigsRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `SellPigsRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [ ] `SellPigsRequest.UnitPrice`: `binding:"required,min=0"` -> `validate:"required,min=0"`
 | 
			
		||||
            - [ ] `SellPigsRequest.TotalPrice`: `binding:"required,min=0"` -> `validate:"required,min=0"`
 | 
			
		||||
            - [ ] `SellPigsRequest.TraderName`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `SellPigsRequest.TradeDate`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `BuyPigsRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `BuyPigsRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [ ] `BuyPigsRequest.UnitPrice`: `binding:"required,min=0"` -> `validate:"required,min=0"`
 | 
			
		||||
            - [ ] `BuyPigsRequest.TotalPrice`: `binding:"required,min=0"` -> `validate:"required,min=0"`
 | 
			
		||||
            - [ ] `BuyPigsRequest.TraderName`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `BuyPigsRequest.TradeDate`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `TransferPigsAcrossBatchesRequest.DestBatchID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `TransferPigsAcrossBatchesRequest.FromPenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `TransferPigsAcrossBatchesRequest.ToPenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `TransferPigsAcrossBatchesRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [ ] `TransferPigsWithinBatchRequest.FromPenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `TransferPigsWithinBatchRequest.ToPenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `TransferPigsWithinBatchRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [ ] `RecordSickPigsRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordSickPigsRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [ ] `RecordSickPigsRequest.TreatmentLocation`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordSickPigsRequest.HappenedAt`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordSickPigRecoveryRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordSickPigRecoveryRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [ ] `RecordSickPigRecoveryRequest.TreatmentLocation`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordSickPigRecoveryRequest.HappenedAt`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordSickPigDeathRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordSickPigDeathRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [ ] `RecordSickPigDeathRequest.TreatmentLocation`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordSickPigDeathRequest.HappenedAt`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordSickPigCullRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordSickPigCullRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [ ] `RecordSickPigCullRequest.TreatmentLocation`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordSickPigCullRequest.HappenedAt`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordDeathRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordDeathRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [ ] `RecordDeathRequest.HappenedAt`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordCullRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `RecordCullRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [ ] `RecordCullRequest.HappenedAt`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
        - [ ] `internal/app/dto/notification_dto.go`
 | 
			
		||||
            - [ ] `SendTestNotificationRequest.Type`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [ ] `ListNotificationRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [ ] `ListNotificationRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [ ] `ListNotificationRequest.UserID`: `form:"user_id"` -> `query:"user_id"`
 | 
			
		||||
            - [ ] `ListNotificationRequest.NotifierType`: `form:"notifier_type"` -> `query:"notifier_type"`
 | 
			
		||||
            - [ ] `ListNotificationRequest.Status`: `form:"status"` -> `query:"status"`
 | 
			
		||||
            - [ ] `ListNotificationRequest.Level`: `form:"level"` -> `query:"level"`
 | 
			
		||||
            - [ ] `ListNotificationRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [ ] `ListNotificationRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [ ] `ListNotificationRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
        - [ ] `internal/app/dto/plan_converter.go` (跳过,非 DTO 结构体)
 | 
			
		||||
        - [ ] `internal/app/dto/device_converter.go` (跳过,非 DTO 结构体)
 | 
			
		||||
        - [ ] `internal/app/dto/monitor_converter.go` (跳过,非 DTO 结构体)
 | 
			
		||||
        - [ ] `internal/app/dto/notification_converter.go` (跳过,非 DTO 结构体)
 | 
			
		||||
    - [x] **文件清单** (按 `internal/app/dto` 目录下的文件顺序):
 | 
			
		||||
        - [x] `internal/app/dto/plan_dto.go`
 | 
			
		||||
            - [x] `ListPlansQuery.PlanType`: `form:"planType,default=自定义任务"` -> `query:"planType"`
 | 
			
		||||
            - [x] `ListPlansQuery.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListPlansQuery.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `CreatePlanRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `CreatePlanRequest.ExecutionType`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `CreatePlanRequest.ExecuteNum`: 添加 `validate:"omitempty,min=0"`
 | 
			
		||||
            - [x] `CreatePlanRequest.CronExpression`: 添加 `validate:"omitempty,cron"`
 | 
			
		||||
            - [x] `CreatePlanRequest.SubPlanIDs`: 添加 `validate:"omitempty,dive"`
 | 
			
		||||
            - [x] `CreatePlanRequest.Tasks`: 添加 `validate:"omitempty,dive"`
 | 
			
		||||
            - [x] `UpdatePlanRequest.ExecutionType`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `UpdatePlanRequest.ExecuteNum`: 添加 `validate:"omitempty,min=0"`
 | 
			
		||||
            - [x] `UpdatePlanRequest.CronExpression`: 添加 `validate:"omitempty,cron"`
 | 
			
		||||
            - [x] `UpdatePlanRequest.SubPlanIDs`: 添加 `validate:"omitempty,dive"`
 | 
			
		||||
            - [x] `UpdatePlanRequest.Tasks`: 添加 `validate:"omitempty,dive"`
 | 
			
		||||
        - [x] `internal/app/dto/user_dto.go`
 | 
			
		||||
            - [x] `CreateUserRequest.Username`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `CreateUserRequest.Password`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `LoginRequest.Identifier`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `LoginRequest.Password`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
        - [x] `internal/app/dto/device_dto.go`
 | 
			
		||||
            - [x] `CreateDeviceRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `CreateDeviceRequest.DeviceTemplateID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `CreateDeviceRequest.AreaControllerID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `CreateDeviceRequest.Location`: `json:"location,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [x] `CreateDeviceRequest.Properties`: `json:"properties,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [x] `UpdateDeviceRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `UpdateDeviceRequest.DeviceTemplateID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `UpdateDeviceRequest.AreaControllerID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `UpdateDeviceRequest.Location`: `json:"location,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [x] `UpdateDeviceRequest.Properties`: `json:"properties,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [x] `CreateAreaControllerRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `CreateAreaControllerRequest.NetworkID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `CreateAreaControllerRequest.Location`: `json:"location,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [x] `CreateAreaControllerRequest.Properties`: `json:"properties,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [x] `UpdateAreaControllerRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `UpdateAreaControllerRequest.NetworkID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `UpdateAreaControllerRequest.Location`: `json:"location,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [x] `UpdateAreaControllerRequest.Properties`: `json:"properties,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [x] `CreateDeviceTemplateRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `CreateDeviceTemplateRequest.Manufacturer`: `json:"manufacturer,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [x] `CreateDeviceTemplateRequest.Description`: `json:"description,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [x] `CreateDeviceTemplateRequest.Category`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `CreateDeviceTemplateRequest.Commands`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `CreateDeviceTemplateRequest.Values`: `json:"values,omitempty"` -> `validate:"omitempty,dive"`
 | 
			
		||||
            - [x] `UpdateDeviceTemplateRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `UpdateDeviceTemplateRequest.Manufacturer`: `json:"manufacturer,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [x] `UpdateDeviceTemplateRequest.Description`: `json:"description,omitempty"` -> `validate:"omitempty"`
 | 
			
		||||
            - [x] `UpdateDeviceTemplateRequest.Category`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `UpdateDeviceTemplateRequest.Commands`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `UpdateDeviceTemplateRequest.Values`: `json:"values,omitempty"` -> `validate:"omitempty,dive"`
 | 
			
		||||
        - [x] `internal/app/dto/monitor_dto.go`
 | 
			
		||||
            - [x] `ListSensorDataRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListSensorDataRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListSensorDataRequest.DeviceID`: `form:"device_id"` -> `query:"device_id"`
 | 
			
		||||
            - [x] `ListSensorDataRequest.SensorType`: `form:"sensor_type"` -> `query:"sensor_type"`
 | 
			
		||||
            - [x] `ListSensorDataRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListSensorDataRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListSensorDataRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListDeviceCommandLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListDeviceCommandLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListDeviceCommandLogRequest.DeviceID`: `form:"device_id"` -> `query:"device_id"`
 | 
			
		||||
            - [x] `ListDeviceCommandLogRequest.ReceivedSuccess`: `form:"received_success"` -> `query:"received_success"`
 | 
			
		||||
            - [x] `ListDeviceCommandLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListDeviceCommandLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListDeviceCommandLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListPlanExecutionLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListPlanExecutionLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListPlanExecutionLogRequest.PlanID`: `form:"plan_id"` -> `query:"plan_id"`
 | 
			
		||||
            - [x] `ListPlanExecutionLogRequest.Status`: `form:"status"` -> `query:"status"`
 | 
			
		||||
            - [x] `ListPlanExecutionLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListPlanExecutionLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListPlanExecutionLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListTaskExecutionLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListTaskExecutionLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListTaskExecutionLogRequest.PlanExecutionLogID`: `form:"plan_execution_log_id"` -> `query:"plan_execution_log_id"`
 | 
			
		||||
            - [x] `ListTaskExecutionLogRequest.TaskID`: `form:"task_id"` -> `query:"task_id"`
 | 
			
		||||
            - [x] `ListTaskExecutionLogRequest.Status`: `form:"status"` -> `query:"status"`
 | 
			
		||||
            - [x] `ListTaskExecutionLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListTaskExecutionLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListTaskExecutionLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListPendingCollectionRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListPendingCollectionRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListPendingCollectionRequest.DeviceID`: `form:"device_id"` -> `query:"device_id"`
 | 
			
		||||
            - [x] `ListPendingCollectionRequest.Status`: `form:"status"` -> `query:"status"`
 | 
			
		||||
            - [x] `ListPendingCollectionRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListPendingCollectionRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListPendingCollectionRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListUserActionLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListUserActionLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListUserActionLogRequest.UserID`: `form:"user_id"` -> `query:"user_id"`
 | 
			
		||||
            - [x] `ListUserActionLogRequest.Username`: `form:"username"` -> `query:"username"`
 | 
			
		||||
            - [x] `ListUserActionLogRequest.ActionType`: `form:"action_type"` -> `query:"action_type"`
 | 
			
		||||
            - [x] `ListUserActionLogRequest.Status`: `form:"status"` -> `query:"status"`
 | 
			
		||||
            - [x] `ListUserActionLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListUserActionLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListUserActionLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListRawMaterialPurchaseRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListRawMaterialPurchaseRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListRawMaterialPurchaseRequest.RawMaterialID`: `form:"raw_material_id"` -> `query:"raw_material_id"`
 | 
			
		||||
            - [x] `ListRawMaterialPurchaseRequest.Supplier`: `form:"supplier"` -> `query:"supplier"`
 | 
			
		||||
            - [x] `ListRawMaterialPurchaseRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListRawMaterialPurchaseRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListRawMaterialPurchaseRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListRawMaterialStockLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListRawMaterialStockLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListRawMaterialStockLogRequest.RawMaterialID`: `form:"raw_material_id"` -> `query:"raw_material_id"`
 | 
			
		||||
            - [x] `ListRawMaterialStockLogRequest.SourceType`: `form:"source_type"` -> `query:"source_type"`
 | 
			
		||||
            - [x] `ListRawMaterialStockLogRequest.SourceID`: `form:"source_id"` -> `query:"source_id"`
 | 
			
		||||
            - [x] `ListRawMaterialStockLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListRawMaterialStockLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListRawMaterialStockLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListFeedUsageRecordRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListFeedUsageRecordRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListFeedUsageRecordRequest.PenID`: `form:"pen_id"` -> `query:"pen_id"`
 | 
			
		||||
            - [x] `ListFeedUsageRecordRequest.FeedFormulaID`: `form:"feed_formula_id"` -> `query:"feed_formula_id"`
 | 
			
		||||
            - [x] `ListFeedUsageRecordRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [x] `ListFeedUsageRecordRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListFeedUsageRecordRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListFeedUsageRecordRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListMedicationLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListMedicationLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListMedicationLogRequest.PigBatchID`: `form:"pig_batch_id"` -> `query:"pig_batch_id"`
 | 
			
		||||
            - [x] `ListMedicationLogRequest.MedicationID`: `form:"medication_id"` -> `query:"medication_id"`
 | 
			
		||||
            - [x] `ListMedicationLogRequest.Reason`: `form:"reason"` -> `query:"reason"`
 | 
			
		||||
            - [x] `ListMedicationLogRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [x] `ListMedicationLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListMedicationLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListMedicationLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListPigBatchLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListPigBatchLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListPigBatchLogRequest.PigBatchID`: `form:"pig_batch_id"` -> `query:"pig_batch_id"`
 | 
			
		||||
            - [x] `ListPigBatchLogRequest.ChangeType`: `form:"change_type"` -> `query:"change_type"`
 | 
			
		||||
            - [x] `ListPigBatchLogRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [x] `ListPigBatchLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListPigBatchLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListPigBatchLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListWeighingBatchRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListWeighingBatchRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListWeighingBatchRequest.PigBatchID`: `form:"pig_batch_id"` -> `query:"pig_batch_id"`
 | 
			
		||||
            - [x] `ListWeighingBatchRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListWeighingBatchRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListWeighingBatchRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListWeighingRecordRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListWeighingRecordRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListWeighingRecordRequest.WeighingBatchID`: `form:"weighing_batch_id"` -> `query:"weighing_batch_id"`
 | 
			
		||||
            - [x] `ListWeighingRecordRequest.PenID`: `form:"pen_id"` -> `query:"pen_id"`
 | 
			
		||||
            - [x] `ListWeighingRecordRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [x] `ListWeighingRecordRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListWeighingRecordRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListWeighingRecordRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListPigTransferLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListPigTransferLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListPigTransferLogRequest.PigBatchID`: `form:"pig_batch_id"` -> `query:"pig_batch_id"`
 | 
			
		||||
            - [x] `ListPigTransferLogRequest.PenID`: `form:"pen_id"` -> `query:"pen_id"`
 | 
			
		||||
            - [x] `ListPigTransferLogRequest.TransferType`: `form:"transfer_type"` -> `query:"transfer_type"`
 | 
			
		||||
            - [x] `ListPigTransferLogRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [x] `ListPigTransferLogRequest.CorrelationID`: `form:"correlation_id"` -> `query:"correlation_id"`
 | 
			
		||||
            - [x] `ListPigTransferLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListPigTransferLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListPigTransferLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListPigSickLogRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListPigSickLogRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListPigSickLogRequest.PigBatchID`: `form:"pig_batch_id"` -> `query:"pig_batch_id"`
 | 
			
		||||
            - [x] `ListPigSickLogRequest.PenID`: `form:"pen_id"` -> `query:"pen_id"`
 | 
			
		||||
            - [x] `ListPigSickLogRequest.Reason`: `form:"reason"` -> `query:"reason"`
 | 
			
		||||
            - [x] `ListPigSickLogRequest.TreatmentLocation`: `form:"treatment_location"` -> `query:"treatment_location"`
 | 
			
		||||
            - [x] `ListPigSickLogRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [x] `ListPigSickLogRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListPigSickLogRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListPigSickLogRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListPigPurchaseRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListPigPurchaseRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListPigPurchaseRequest.PigBatchID`: `form:"pig_batch_id"` -> `query:"pig_batch_id"`
 | 
			
		||||
            - [x] `ListPigPurchaseRequest.Supplier`: `form:"supplier"` -> `query:"supplier"`
 | 
			
		||||
            - [x] `ListPigPurchaseRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [x] `ListPigPurchaseRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListPigPurchaseRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListPigPurchaseRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
            - [x] `ListPigSaleRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListPigSaleRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListPigSaleRequest.PigBatchID`: `form:"pig_batch_id"` -> `query:"pig_batch_id"`
 | 
			
		||||
            - [x] `ListPigSaleRequest.Buyer`: `form:"buyer"` -> `query:"buyer"`
 | 
			
		||||
            - [x] `ListPigSaleRequest.OperatorID`: `form:"operator_id"` -> `query:"operator_id"`
 | 
			
		||||
            - [x] `ListPigSaleRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListPigSaleRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListPigSaleRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
        - [x] `internal/app/dto/pig_farm_dto.go`
 | 
			
		||||
            - [x] `CreatePigHouseRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `UpdatePigHouseRequest.Name`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `CreatePenRequest.PenNumber`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `CreatePenRequest.HouseID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `CreatePenRequest.Capacity`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `UpdatePenRequest.PenNumber`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `UpdatePenRequest.HouseID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `UpdatePenRequest.Capacity`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `UpdatePenRequest.Status`: `binding:"required,oneof=空闲 使用中 病猪栏 康复栏 清洗消毒 维修中"` -> `validate:"required,oneof=空闲 使用中 病猪栏 康复栏 清洗消毒 维修中"`
 | 
			
		||||
            - [x] `UpdatePenStatusRequest.Status`: `binding:"required,oneof=空闲 使用中 病猪栏 康复栏 清洗消毒 维修中"` -> `validate:"required,oneof=空闲 使用中 病猪栏 康复栏 清洗消毒 维修中"`
 | 
			
		||||
        - [x] `internal/app/dto/pig_batch_dto.go`
 | 
			
		||||
            - [x] `PigBatchCreateDTO.BatchNumber`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `PigBatchCreateDTO.OriginType`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `PigBatchCreateDTO.StartDate`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `PigBatchCreateDTO.InitialCount`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [x] `PigBatchCreateDTO.Status`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `PigBatchQueryDTO.IsActive`: `form:"is_active"` -> `query:"is_active"`
 | 
			
		||||
            - [x] `AssignEmptyPensToBatchRequest.PenIDs`: `binding:"required,min=1"` -> `validate:"required,min=1,dive"`
 | 
			
		||||
            - [x] `ReclassifyPenToNewBatchRequest.ToBatchID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `ReclassifyPenToNewBatchRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RemoveEmptyPenFromBatchRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `MovePigsIntoPenRequest.ToPenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `MovePigsIntoPenRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [x] `SellPigsRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `SellPigsRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [x] `SellPigsRequest.UnitPrice`: `binding:"required,min=0"` -> `validate:"required,min=0"`
 | 
			
		||||
            - [x] `SellPigsRequest.TotalPrice`: `binding:"required,min=0"` -> `validate:"required,min=0"`
 | 
			
		||||
            - [x] `SellPigsRequest.TraderName`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `SellPigsRequest.TradeDate`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `BuyPigsRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `BuyPigsRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [x] `BuyPigsRequest.UnitPrice`: `binding:"required,min=0"` -> `validate:"required,min=0"`
 | 
			
		||||
            - [x] `BuyPigsRequest.TotalPrice`: `binding:"required,min=0"` -> `validate:"required,min=0"`
 | 
			
		||||
            - [x] `BuyPigsRequest.TraderName`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `BuyPigsRequest.TradeDate`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `TransferPigsAcrossBatchesRequest.DestBatchID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `TransferPigsAcrossBatchesRequest.FromPenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `TransferPigsAcrossBatchesRequest.ToPenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `TransferPigsAcrossBatchesRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [x] `TransferPigsWithinBatchRequest.FromPenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `TransferPigsWithinBatchRequest.ToPenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `TransferPigsWithinBatchRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [x] `RecordSickPigsRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordSickPigsRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [x] `RecordSickPigsRequest.TreatmentLocation`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordSickPigsRequest.HappenedAt`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordSickPigRecoveryRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordSickPigRecoveryRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [x] `RecordSickPigRecoveryRequest.TreatmentLocation`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordSickPigRecoveryRequest.HappenedAt`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordSickPigDeathRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordSickPigDeathRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [x] `RecordSickPigDeathRequest.TreatmentLocation`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordSickPigDeathRequest.HappenedAt`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordSickPigCullRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordSickPigCullRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [x] `RecordSickPigCullRequest.TreatmentLocation`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordSickPigCullRequest.HappenedAt`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordDeathRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordDeathRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [x] `RecordDeathRequest.HappenedAt`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordCullRequest.PenID`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `RecordCullRequest.Quantity`: `binding:"required,min=1"` -> `validate:"required,min=1"`
 | 
			
		||||
            - [x] `RecordCullRequest.HappenedAt`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
        - [x] `internal/app/dto/notification_dto.go`
 | 
			
		||||
            - [x] `SendTestNotificationRequest.Type`: `binding:"required"` -> `validate:"required"`
 | 
			
		||||
            - [x] `ListNotificationRequest.Page`: `form:"page,default=1"` -> `query:"page"`
 | 
			
		||||
            - [x] `ListNotificationRequest.PageSize`: `form:"pageSize,default=10"` -> `query:"pageSize"`
 | 
			
		||||
            - [x] `ListNotificationRequest.UserID`: `form:"user_id"` -> `query:"user_id"`
 | 
			
		||||
            - [x] `ListNotificationRequest.NotifierType`: `form:"notifier_type"` -> `query:"notifier_type"`
 | 
			
		||||
            - [x] `ListNotificationRequest.Status`: `form:"status"` -> `query:"status"`
 | 
			
		||||
            - [x] `ListNotificationRequest.Level`: `form:"level"` -> `query:"level"`
 | 
			
		||||
            - [x] `ListNotificationRequest.StartTime`: `form:"start_time"` -> `query:"start_time"`
 | 
			
		||||
            - [x] `ListNotificationRequest.EndTime`: `form:"end_time"` -> `query:"end_time"`
 | 
			
		||||
            - [x] `ListNotificationRequest.OrderBy`: `form:"order_by"` -> `query:"order_by"`
 | 
			
		||||
        - [x] `internal/app/dto/plan_converter.go` (跳过,非 DTO 结构体)
 | 
			
		||||
        - [x] `internal/app/dto/device_converter.go` (跳过,非 DTO 结构体)
 | 
			
		||||
        - [x] `internal/app/dto/monitor_converter.go` (跳过,非 DTO 结构体)
 | 
			
		||||
        - [x] `internal/app/dto/notification_converter.go` (跳过,非 DTO 结构体)
 | 
			
		||||
 | 
			
		||||
- [ ] **6. 核心 API 层 (`internal/app/api`)**
 | 
			
		||||
    - [ ] **`router.go`**
 | 
			
		||||
@@ -339,7 +339,7 @@
 | 
			
		||||
        - [ ] 更新 `NewAPI` 函数:
 | 
			
		||||
            - [ ] 将 `gin.SetMode(cfg.Mode)` 替换为 `e.Debug = (cfg.Mode == "debug")`。
 | 
			
		||||
            - [ ] 将 `gin.New()` 替换为 `echo.New()`。
 | 
			
		||||
            - [ ] 将 `engine.Use(gin.Recovery())` 替换为 `e.Use(middleware.Recover())`。
 | 
			
		||||
            - [ ] 将 `engine.Use(middleware.Recover())` 替换为 `e.Use(middleware.Recover())`。
 | 
			
		||||
 | 
			
		||||
- [ ] **7. 依赖管理**
 | 
			
		||||
    - [ ] 在 `go.mod` 中移除 `github.com/gin-gonic/gin`。
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user