From 3e711551e7e7383cc96fef92759f458cca93e47c Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Mon, 10 Nov 2025 21:42:46 +0800 Subject: [PATCH] =?UTF-8?q?float64=E5=85=A8=E9=83=A8=E6=94=B9float32?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/exceeding-threshold-alarm/index.md | 3 ++- internal/app/dto/alarm_dto.go | 12 +++++----- internal/app/dto/monitor_dto.go | 22 +++++++++---------- internal/app/dto/pig_batch_dto.go | 8 +++---- internal/app/service/pig_batch_service.go | 8 +++---- internal/app/webhook/chirp_stack.go | 4 ++-- internal/app/webhook/chirp_stack_types.go | 14 ++++++------ internal/domain/pig/pig_batch_service.go | 4 ++-- .../domain/pig/pig_batch_service_pig_trade.go | 4 ++-- .../domain/task/area_threshold_check_task.go | 2 +- internal/domain/task/delay_task.go | 2 +- .../task/device_threshold_check_task.go | 6 ++--- .../domain/task/release_feed_weight_task.go | 6 ++--- internal/infra/logs/logs.go | 2 +- internal/infra/models/device_template.go | 4 ++-- internal/infra/models/feed.go | 14 ++++++------ internal/infra/models/medication.go | 10 ++++----- internal/infra/models/pig_batch.go | 2 +- internal/infra/models/pig_trade.go | 8 +++---- internal/infra/models/sensor_data.go | 8 +++---- .../lora_mesh_uart_passthrough_transport.go | 4 ++-- 21 files changed, 74 insertions(+), 73 deletions(-) diff --git a/design/exceeding-threshold-alarm/index.md b/design/exceeding-threshold-alarm/index.md index a3fdc40..3bd49d3 100644 --- a/design/exceeding-threshold-alarm/index.md +++ b/design/exceeding-threshold-alarm/index.md @@ -144,4 +144,5 @@ 12. 实现任务11应的八个web接口 13. 实现根据区域ID或设备ID清空对应阈值告警任务 14. 设备和区域主控删除时清除对应区域阈值告警或设备阈值告警任务 -15. 将所有Regional更改为Area \ No newline at end of file +15. 将所有Regional更改为Area +16. float64全部改float32 \ No newline at end of file diff --git a/internal/app/dto/alarm_dto.go b/internal/app/dto/alarm_dto.go index bf55fb9..2fc48ea 100644 --- a/internal/app/dto/alarm_dto.go +++ b/internal/app/dto/alarm_dto.go @@ -86,14 +86,14 @@ type ListHistoricalAlarmResponse struct { type CreateDeviceThresholdAlarmDTO struct { DeviceID uint `json:"device_id" binding:"required"` // 设备ID SensorType models.SensorType `json:"sensor_type" binding:"required"` // 传感器类型 - Thresholds float64 `json:"thresholds" binding:"required"` // 阈值 + Thresholds float32 `json:"thresholds" binding:"required"` // 阈值 Operator models.Operator `json:"operator" binding:"required"` // 操作符 (使用string类型,与前端交互更通用) Level models.SeverityLevel `json:"level,omitempty"` // 告警等级,可选,如果未提供则使用默认值 } // UpdateDeviceThresholdAlarmDTO 更新设备阈值告警的请求DTO type UpdateDeviceThresholdAlarmDTO struct { - Thresholds float64 `json:"thresholds" binding:"required"` // 新的阈值 + Thresholds float32 `json:"thresholds" binding:"required"` // 新的阈值 Operator models.Operator `json:"operator" binding:"required"` // 新的操作符 Level models.SeverityLevel `json:"level,omitempty"` // 新的告警等级,可选 } @@ -102,14 +102,14 @@ type UpdateDeviceThresholdAlarmDTO struct { type CreateAreaThresholdAlarmDTO struct { AreaControllerID uint `json:"area_controller_id" binding:"required"` // 区域主控ID SensorType models.SensorType `json:"sensor_type" binding:"required"` // 传感器类型 - Thresholds float64 `json:"thresholds" binding:"required"` // 阈值 + Thresholds float32 `json:"thresholds" binding:"required"` // 阈值 Operator models.Operator `json:"operator" binding:"required"` // 操作符 Level models.SeverityLevel `json:"level,omitempty"` // 告警等级,可选 } // UpdateAreaThresholdAlarmDTO 更新区域阈值告警的请求DTO type UpdateAreaThresholdAlarmDTO struct { - Thresholds float64 `json:"thresholds" binding:"required"` // 新的阈值 + Thresholds float32 `json:"thresholds" binding:"required"` // 新的阈值 Operator models.Operator `json:"operator" binding:"required"` // 新的操作符 Level models.SeverityLevel `json:"level,omitempty"` // 新的告警等级,可选 } @@ -124,7 +124,7 @@ type AreaThresholdAlarmDTO struct { ID int `json:"id"` AreaControllerID uint `json:"area_controller_id"` SensorType models.SensorType `json:"sensor_type"` - Thresholds float64 `json:"thresholds"` + Thresholds float32 `json:"thresholds"` Operator models.Operator `json:"operator"` Level models.SeverityLevel `json:"level"` } @@ -134,7 +134,7 @@ type DeviceThresholdAlarmDTO struct { ID int `json:"id"` DeviceID uint `json:"device_id"` SensorType models.SensorType `json:"sensor_type"` - Thresholds float64 `json:"thresholds"` + Thresholds float32 `json:"thresholds"` Operator models.Operator `json:"operator"` Level models.SeverityLevel `json:"level"` } diff --git a/internal/app/dto/monitor_dto.go b/internal/app/dto/monitor_dto.go index 7129998..406883e 100644 --- a/internal/app/dto/monitor_dto.go +++ b/internal/app/dto/monitor_dto.go @@ -227,9 +227,9 @@ type RawMaterialPurchaseDTO struct { RawMaterialID uint `json:"raw_material_id"` RawMaterial RawMaterialDTO `json:"raw_material"` Supplier string `json:"supplier"` - Amount float64 `json:"amount"` - UnitPrice float64 `json:"unit_price"` - TotalPrice float64 `json:"total_price"` + Amount float32 `json:"amount"` + UnitPrice float32 `json:"unit_price"` + TotalPrice float32 `json:"total_price"` PurchaseDate time.Time `json:"purchase_date"` CreatedAt time.Time `json:"created_at"` } @@ -258,7 +258,7 @@ type ListRawMaterialStockLogRequest struct { type RawMaterialStockLogDTO struct { ID uint `json:"id"` RawMaterialID uint `json:"raw_material_id"` - ChangeAmount float64 `json:"change_amount"` + ChangeAmount float32 `json:"change_amount"` SourceType models.StockLogSourceType `json:"source_type"` SourceID uint `json:"source_id"` HappenedAt time.Time `json:"happened_at"` @@ -304,7 +304,7 @@ type FeedUsageRecordDTO struct { Pen PenDTO `json:"pen"` FeedFormulaID uint `json:"feed_formula_id"` FeedFormula FeedFormulaDTO `json:"feed_formula"` - Amount float64 `json:"amount"` + Amount float32 `json:"amount"` RecordedAt time.Time `json:"recorded_at"` OperatorID uint `json:"operator_id"` Remarks string `json:"remarks"` @@ -343,7 +343,7 @@ type MedicationLogDTO struct { PigBatchID uint `json:"pig_batch_id"` MedicationID uint `json:"medication_id"` Medication MedicationDTO `json:"medication"` - DosageUsed float64 `json:"dosage_used"` + DosageUsed float32 `json:"dosage_used"` TargetCount int `json:"target_count"` Reason models.MedicationReasonType `json:"reason"` Description string `json:"description"` @@ -439,7 +439,7 @@ type WeighingRecordDTO struct { ID uint `json:"id"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` - Weight float64 `json:"weight"` + Weight float32 `json:"weight"` WeighingBatchID uint `json:"weighing_batch_id"` PenID uint `json:"pen_id"` OperatorID uint `json:"operator_id"` @@ -552,8 +552,8 @@ type PigPurchaseDTO struct { PurchaseDate time.Time `json:"purchase_date"` Supplier string `json:"supplier"` Quantity int `json:"quantity"` - UnitPrice float64 `json:"unit_price"` - TotalPrice float64 `json:"total_price"` + UnitPrice float32 `json:"unit_price"` + TotalPrice float32 `json:"total_price"` Remarks string `json:"remarks"` OperatorID uint `json:"operator_id"` } @@ -587,8 +587,8 @@ type PigSaleDTO struct { SaleDate time.Time `json:"sale_date"` Buyer string `json:"buyer"` Quantity int `json:"quantity"` - UnitPrice float64 `json:"unit_price"` - TotalPrice float64 `json:"total_price"` + UnitPrice float32 `json:"unit_price"` + TotalPrice float32 `json:"total_price"` Remarks string `json:"remarks"` OperatorID uint `json:"operator_id"` } diff --git a/internal/app/dto/pig_batch_dto.go b/internal/app/dto/pig_batch_dto.go index 1cdfc3c..0b23c92 100644 --- a/internal/app/dto/pig_batch_dto.go +++ b/internal/app/dto/pig_batch_dto.go @@ -74,8 +74,8 @@ type MovePigsIntoPenRequest struct { type SellPigsRequest struct { PenID uint `json:"pen_id" validate:"required"` // 猪栏ID Quantity int `json:"quantity" validate:"required,min=1"` // 卖出猪只数量 - UnitPrice float64 `json:"unit_price" validate:"required,min=0"` // 单价 - TotalPrice float64 `json:"total_price" validate:"required,min=0"` // 总价 + UnitPrice float32 `json:"unit_price" validate:"required,min=0"` // 单价 + TotalPrice float32 `json:"total_price" validate:"required,min=0"` // 总价 TraderName string `json:"trader_name" validate:"required"` // 交易方名称 TradeDate time.Time `json:"trade_date" validate:"required"` // 交易日期 Remarks string `json:"remarks"` // 备注 @@ -85,8 +85,8 @@ type SellPigsRequest struct { type BuyPigsRequest struct { PenID uint `json:"pen_id" validate:"required"` // 猪栏ID Quantity int `json:"quantity" validate:"required,min=1"` // 买入猪只数量 - UnitPrice float64 `json:"unit_price" validate:"required,min=0"` // 单价 - TotalPrice float64 `json:"total_price" validate:"required,min=0"` // 总价 + UnitPrice float32 `json:"unit_price" validate:"required,min=0"` // 单价 + TotalPrice float32 `json:"total_price" validate:"required,min=0"` // 总价 TraderName string `json:"trader_name" validate:"required"` // 交易方名称 TradeDate time.Time `json:"trade_date" validate:"required"` // 交易日期 Remarks string `json:"remarks"` // 备注 diff --git a/internal/app/service/pig_batch_service.go b/internal/app/service/pig_batch_service.go index 4ee78ac..b0ca12c 100644 --- a/internal/app/service/pig_batch_service.go +++ b/internal/app/service/pig_batch_service.go @@ -25,8 +25,8 @@ type PigBatchService interface { MovePigsIntoPen(ctx context.Context, batchID uint, toPenID uint, quantity int, operatorID uint, remarks string) error // Trade Sub-service - SellPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float64, tatalPrice float64, traderName string, tradeDate time.Time, remarks string, operatorID uint) error - BuyPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float64, tatalPrice float64, traderName string, tradeDate time.Time, remarks string, operatorID uint) error + SellPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float32, tatalPrice float32, traderName string, tradeDate time.Time, remarks string, operatorID uint) error + BuyPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float32, tatalPrice float32, traderName string, tradeDate time.Time, remarks string, operatorID uint) error // Transfer Sub-service TransferPigsAcrossBatches(ctx context.Context, sourceBatchID uint, destBatchID uint, fromPenID uint, toPenID uint, quantity uint, operatorID uint, remarks string) error @@ -258,7 +258,7 @@ func (s *pigBatchService) MovePigsIntoPen(ctx context.Context, batchID uint, toP } // SellPigs 委托给领域服务 -func (s *pigBatchService) SellPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float64, tatalPrice float64, traderName string, tradeDate time.Time, remarks string, operatorID uint) error { +func (s *pigBatchService) SellPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float32, tatalPrice float32, traderName string, tradeDate time.Time, remarks string, operatorID uint) error { serviceCtx, logger := logs.Trace(ctx, s.ctx, "SellPigs") err := s.domainService.SellPigs(serviceCtx, batchID, penID, quantity, unitPrice, tatalPrice, traderName, tradeDate, remarks, operatorID) if err != nil { @@ -269,7 +269,7 @@ func (s *pigBatchService) SellPigs(ctx context.Context, batchID uint, penID uint } // BuyPigs 委托给领域服务 -func (s *pigBatchService) BuyPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float64, tatalPrice float64, traderName string, tradeDate time.Time, remarks string, operatorID uint) error { +func (s *pigBatchService) BuyPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float32, tatalPrice float32, traderName string, tradeDate time.Time, remarks string, operatorID uint) error { serviceCtx, logger := logs.Trace(ctx, s.ctx, "BuyPigs") err := s.domainService.BuyPigs(serviceCtx, batchID, penID, quantity, unitPrice, tatalPrice, traderName, tradeDate, remarks, operatorID) if err != nil { diff --git a/internal/app/webhook/chirp_stack.go b/internal/app/webhook/chirp_stack.go index 60e6fe4..8714d47 100644 --- a/internal/app/webhook/chirp_stack.go +++ b/internal/app/webhook/chirp_stack.go @@ -298,7 +298,7 @@ func (c *ChirpStackListener) handleUpEvent(ctx context.Context, event *UpEvent) valueDescriptor := valueDescriptors[0] // 5.3 应用乘数和偏移量计算最终值 - parsedValue := float64(rawSensorValue)*valueDescriptor.Multiplier + valueDescriptor.Offset + parsedValue := rawSensorValue*valueDescriptor.Multiplier + valueDescriptor.Offset // 5.4 根据传感器类型构建具体的数据结构 var dataToRecord interface{} @@ -312,7 +312,7 @@ func (c *ChirpStackListener) handleUpEvent(ctx context.Context, event *UpEvent) default: // TODO 未知传感器的数据需要记录吗 logger.Warnf("未知的传感器类型 '%s',将使用通用格式记录", valueDescriptor.Type) - dataToRecord = map[string]float64{"value": parsedValue} + dataToRecord = map[string]float32{"value": parsedValue} } // 5.5 记录传感器数据 diff --git a/internal/app/webhook/chirp_stack_types.go b/internal/app/webhook/chirp_stack_types.go index 55d7de5..05247d2 100644 --- a/internal/app/webhook/chirp_stack_types.go +++ b/internal/app/webhook/chirp_stack_types.go @@ -24,9 +24,9 @@ type DeviceInfo struct { // Location 包含了地理位置信息。 type Location struct { - Latitude float64 `json:"latitude"` // 纬度 - Longitude float64 `json:"longitude"` // 经度 - Altitude float64 `json:"altitude"` // 海拔 + Latitude float32 `json:"latitude"` // 纬度 + Longitude float32 `json:"longitude"` // 经度 + Altitude float32 `json:"altitude"` // 海拔 } // --- 可复用的子结构体 --- @@ -61,7 +61,7 @@ type UplinkRxInfo struct { UplinkID uint32 `json:"uplink_id"` // 上行ID Time time.Time `json:"time"` // 接收时间 Rssi int `json:"rssi"` // 接收信号强度指示 - Snr float64 `json:"snr"` // 信噪比 + Snr float32 `json:"snr"` // 信噪比 Channel int `json:"channel"` // 接收通道 Location *Location `json:"location"` // 网关位置 Context string `json:"context"` // 上下文信息 @@ -96,9 +96,9 @@ type DownlinkTxInfo struct { // ResolvedLocation 包含了地理位置解析结果。 type ResolvedLocation struct { - Latitude float64 `json:"latitude"` // 纬度 - Longitude float64 `json:"longitude"` // 经度 - Altitude float64 `json:"altitude"` // 海拔 + Latitude float32 `json:"latitude"` // 纬度 + Longitude float32 `json:"longitude"` // 经度 + Altitude float32 `json:"altitude"` // 海拔 Source string `json:"source"` // 位置来源 Accuracy int `json:"accuracy"` // 精度 } diff --git a/internal/domain/pig/pig_batch_service.go b/internal/domain/pig/pig_batch_service.go index a3d5ea2..f103efc 100644 --- a/internal/domain/pig/pig_batch_service.go +++ b/internal/domain/pig/pig_batch_service.go @@ -67,9 +67,9 @@ type PigBatchService interface { // ---交易子服务--- // SellPigs 处理卖猪的业务逻辑。 - SellPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float64, tatalPrice float64, traderName string, tradeDate time.Time, remarks string, operatorID uint) error + SellPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float32, tatalPrice float32, traderName string, tradeDate time.Time, remarks string, operatorID uint) error // BuyPigs 处理买猪的业务逻辑。 - BuyPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float64, tatalPrice float64, traderName string, tradeDate time.Time, remarks string, operatorID uint) error + BuyPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float32, tatalPrice float32, traderName string, tradeDate time.Time, remarks string, operatorID uint) error // ---调栏子服务 --- TransferPigsAcrossBatches(ctx context.Context, sourceBatchID uint, destBatchID uint, fromPenID uint, toPenID uint, quantity uint, operatorID uint, remarks string) error diff --git a/internal/domain/pig/pig_batch_service_pig_trade.go b/internal/domain/pig/pig_batch_service_pig_trade.go index 9335795..c6a14b2 100644 --- a/internal/domain/pig/pig_batch_service_pig_trade.go +++ b/internal/domain/pig/pig_batch_service_pig_trade.go @@ -13,7 +13,7 @@ import ( ) // SellPigs 处理批量销售猪的业务逻辑。 -func (s *pigBatchService) SellPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float64, tatalPrice float64, traderName string, tradeDate time.Time, remarks string, operatorID uint) error { +func (s *pigBatchService) SellPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float32, tatalPrice float32, traderName string, tradeDate time.Time, remarks string, operatorID uint) error { serviceCtx := logs.AddFuncName(ctx, s.ctx, "SellPigs") return s.uow.ExecuteInTransaction(serviceCtx, func(tx *gorm.DB) error { if quantity <= 0 { @@ -85,7 +85,7 @@ func (s *pigBatchService) SellPigs(ctx context.Context, batchID uint, penID uint } // BuyPigs 处理批量购买猪的业务逻辑。 -func (s *pigBatchService) BuyPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float64, totalPrice float64, traderName string, tradeDate time.Time, remarks string, operatorID uint) error { +func (s *pigBatchService) BuyPigs(ctx context.Context, batchID uint, penID uint, quantity int, unitPrice float32, totalPrice float32, traderName string, tradeDate time.Time, remarks string, operatorID uint) error { serviceCtx := logs.AddFuncName(ctx, s.ctx, "BuyPigs") return s.uow.ExecuteInTransaction(serviceCtx, func(tx *gorm.DB) error { if quantity <= 0 { diff --git a/internal/domain/task/area_threshold_check_task.go b/internal/domain/task/area_threshold_check_task.go index f7ba56e..2a2362d 100644 --- a/internal/domain/task/area_threshold_check_task.go +++ b/internal/domain/task/area_threshold_check_task.go @@ -16,7 +16,7 @@ import ( type AreaThresholdCheckParams struct { AreaControllerID uint `json:"area_controller_id"` // 区域主控ID SensorType models.SensorType `json:"sensor_type"` // 传感器类型 - Thresholds float64 `json:"thresholds"` // 阈值 + Thresholds float32 `json:"thresholds"` // 阈值 Operator models.Operator `json:"operator"` // 操作符 Level models.SeverityLevel `json:"level"` // 告警级别 ExcludeDeviceIDs []uint `json:"exclude_device_ids"` // 排除的传感器ID diff --git a/internal/domain/task/delay_task.go b/internal/domain/task/delay_task.go index f801ce4..916fb77 100644 --- a/internal/domain/task/delay_task.go +++ b/internal/domain/task/delay_task.go @@ -11,7 +11,7 @@ import ( ) type DelayTaskParams struct { - DelayDuration float64 `json:"delay_duration"` + DelayDuration float32 `json:"delay_duration"` } // DelayTask 是一个用于模拟延迟的 Task 实现 diff --git a/internal/domain/task/device_threshold_check_task.go b/internal/domain/task/device_threshold_check_task.go index 3fbace1..3616118 100644 --- a/internal/domain/task/device_threshold_check_task.go +++ b/internal/domain/task/device_threshold_check_task.go @@ -16,7 +16,7 @@ import ( type DeviceThresholdCheckParams struct { DeviceID uint `json:"device_id"` // 设备ID SensorType models.SensorType `json:"sensor_type"` // 传感器类型 - Thresholds float64 `json:"thresholds"` // 阈值 + Thresholds float32 `json:"thresholds"` // 阈值 Operator models.Operator `json:"operator"` // 操作符 Level models.SeverityLevel `json:"level"` // 告警等级 } @@ -55,7 +55,7 @@ func (d *DeviceThresholdCheckTask) Execute(ctx context.Context) error { return fmt.Errorf("任务 %v: 获取最新传感器数据失败: %v", d.taskLog.TaskID, err) } - var currentValue float64 + var currentValue float32 var alarmCode models.AlarmCode switch d.params.SensorType { @@ -123,7 +123,7 @@ func (d *DeviceThresholdCheckTask) Execute(ctx context.Context) error { } // checkThreshold 校验当前值是否满足阈值条件 -func (d *DeviceThresholdCheckTask) checkThreshold(currentValue float64, operator models.Operator, threshold float64) bool { +func (d *DeviceThresholdCheckTask) checkThreshold(currentValue float32, operator models.Operator, threshold float32) bool { switch operator { case models.OperatorLessThan: return currentValue < threshold diff --git a/internal/domain/task/release_feed_weight_task.go b/internal/domain/task/release_feed_weight_task.go index 5e2b30c..7b90038 100644 --- a/internal/domain/task/release_feed_weight_task.go +++ b/internal/domain/task/release_feed_weight_task.go @@ -15,7 +15,7 @@ import ( // ReleaseFeedWeightTaskParams 定义了 ReleaseFeedWeightTask 的参数结构 type ReleaseFeedWeightTaskParams struct { - ReleaseWeight float64 `json:"release_weight"` // 需要释放的重量 + ReleaseWeight float32 `json:"release_weight"` // 需要释放的重量 FeedPortDeviceID uint `json:"feed_port_device_id"` // 下料口ID MixingTankDeviceID uint `json:"mixing_tank_device_id"` // 称重传感器ID } @@ -29,7 +29,7 @@ type ReleaseFeedWeightTask struct { claimedLog *models.TaskExecutionLog feedPortDevice *models.Device - releaseWeight float64 + releaseWeight float32 mixingTankDeviceID uint feedPort device.Service @@ -100,7 +100,7 @@ func (r *ReleaseFeedWeightTask) Execute(ctx context.Context) error { } // 获取当前搅拌罐重量 -func (r *ReleaseFeedWeightTask) getNowWeight(ctx context.Context) (float64, error) { +func (r *ReleaseFeedWeightTask) getNowWeight(ctx context.Context) (float32, error) { taskCtx, logger := logs.Trace(ctx, r.ctx, "getNowWeight") sensorData, err := r.sensorDataRepo.GetLatestSensorDataByDeviceIDAndSensorType(taskCtx, r.mixingTankDeviceID, models.SensorTypeWeight) if err != nil { diff --git a/internal/infra/logs/logs.go b/internal/infra/logs/logs.go index 13e8c4d..d44cf9d 100644 --- a/internal/infra/logs/logs.go +++ b/internal/infra/logs/logs.go @@ -208,7 +208,7 @@ func (g *GormLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql fields := []interface{}{ "sql", sql, "rows", rows, - "elapsed", fmt.Sprintf("%.3fms", float64(elapsed.Nanoseconds())/1e6), + "elapsed", fmt.Sprintf("%.3fms", float32(elapsed.Nanoseconds())/1e6), } // 附加调用链信息 diff --git a/internal/infra/models/device_template.go b/internal/infra/models/device_template.go index 8960046..a8f2c7e 100644 --- a/internal/infra/models/device_template.go +++ b/internal/infra/models/device_template.go @@ -54,8 +54,8 @@ const ( // 它提供了必要的元数据,以便应用程序能够正确解释从设备读取的原始数据。 type ValueDescriptor struct { Type SensorType `json:"type"` - Multiplier float64 `json:"multiplier"` // 乘数,用于原始数据转换 - Offset float64 `json:"offset"` // 偏移量,用于原始数据转换 + Multiplier float32 `json:"multiplier"` // 乘数,用于原始数据转换 + Offset float32 `json:"offset"` // 偏移量,用于原始数据转换 } // --- 指令结构体 (Command Structs) --- diff --git a/internal/infra/models/feed.go b/internal/infra/models/feed.go index a16378f..b1414dc 100644 --- a/internal/infra/models/feed.go +++ b/internal/infra/models/feed.go @@ -16,7 +16,7 @@ type RawMaterial struct { gorm.Model Name string `gorm:"size:100;unique;not null;comment:原料名称"` Description string `gorm:"size:255;comment:描述"` - Quantity float64 `gorm:"not null;comment:库存总量, 单位: g"` + Quantity float32 `gorm:"not null;comment:库存总量, 单位: g"` } func (RawMaterial) TableName() string { @@ -29,9 +29,9 @@ type RawMaterialPurchase struct { RawMaterialID uint `gorm:"not null;index;comment:关联的原料ID"` RawMaterial RawMaterial `gorm:"foreignKey:RawMaterialID"` Supplier string `gorm:"size:100;comment:供应商"` - Amount float64 `gorm:"not null;comment:采购数量, 单位: g"` - UnitPrice float64 `gorm:"comment:单价"` - TotalPrice float64 `gorm:"comment:总价"` + Amount float32 `gorm:"not null;comment:采购数量, 单位: g"` + UnitPrice float32 `gorm:"comment:单价"` + TotalPrice float32 `gorm:"comment:总价"` PurchaseDate time.Time `gorm:"primaryKey;comment:采购日期"` CreatedAt time.Time } @@ -56,7 +56,7 @@ const ( type RawMaterialStockLog struct { gorm.Model RawMaterialID uint `gorm:"not null;index;comment:关联的原料ID"` - ChangeAmount float64 `gorm:"not null;comment:变动数量, 正数为入库, 负数为出库"` + ChangeAmount float32 `gorm:"not null;comment:变动数量, 正数为入库, 负数为出库"` SourceType StockLogSourceType `gorm:"size:50;not null;index;comment:库存变动来源类型"` SourceID uint `gorm:"not null;index;comment:来源记录的ID (如 RawMaterialPurchase.ID 或 FeedUsageRecord.ID)"` HappenedAt time.Time `gorm:"primaryKey;comment:业务发生时间"` @@ -86,7 +86,7 @@ type FeedFormulaComponent struct { FeedFormulaID uint `gorm:"not null;index;comment:外键到 FeedFormula"` RawMaterialID uint `gorm:"not null;index;comment:外键到 RawMaterial"` RawMaterial RawMaterial `gorm:"foreignKey:RawMaterialID"` - Percentage float64 `gorm:"not null;comment:该原料在配方中的百分比 (0-1.0)"` + Percentage float32 `gorm:"not null;comment:该原料在配方中的百分比 (0-1.0)"` } func (FeedFormulaComponent) TableName() string { @@ -102,7 +102,7 @@ type FeedUsageRecord struct { Pen Pen `gorm:"foreignKey:PenID"` FeedFormulaID uint `gorm:"not null;index;comment:使用的饲料配方ID"` FeedFormula FeedFormula `gorm:"foreignKey:FeedFormulaID"` - Amount float64 `gorm:"not null;comment:使用数量, 单位: g"` + Amount float32 `gorm:"not null;comment:使用数量, 单位: g"` RecordedAt time.Time `gorm:"primaryKey;comment:记录时间"` OperatorID uint `gorm:"not null;comment:操作员"` Remarks string `gorm:"comment:备注, 如 '例行喂料, 弱猪补料' 等"` diff --git a/internal/infra/models/medication.go b/internal/infra/models/medication.go index bd60718..c1bd710 100644 --- a/internal/infra/models/medication.go +++ b/internal/infra/models/medication.go @@ -48,9 +48,9 @@ type PowderInstructions struct { // 出栏前停药期 WithdrawalPeriod time.Duration `json:"withdrawal_period"` // 拌料使用计量, 每千克体重用多少克药, 单位: g/kg - BodyWeightDosageUsed float64 `json:"body_weight_dosage_used"` + BodyWeightDosageUsed float32 `json:"body_weight_dosage_used"` // 拌料使用剂量, 每升水加多少克药或每千克饲料干重加多少克药, 单位: g/kg(L) - MixDosageUsed float64 `json:"mix_dosage_used"` + MixDosageUsed float32 `json:"mix_dosage_used"` // 拌料使用方式, 兑水/拌料 MixType MixType `json:"mix_type"` } @@ -61,8 +61,8 @@ type Medication struct { Name string `gorm:"size:100;not null;comment:药品名称" json:"name"` Type MedicationType `gorm:"size:20;not null;comment:兽药类型 (粉剂, 针剂, 疫苗)" json:"type"` Category MedicationCategory `gorm:"size:30;not null;comment:兽药种类 (四环素类, 磺胺类等)" json:"category"` - DosagePerUnit float64 `gorm:"size:50;comment:一份药物的计量 (针剂计量单位为毫升, 粉剂为克)" json:"dosage_per_unit"` - ActiveIngredientConcentration float64 `gorm:"size:50;comment:有效成分含量百分比" json:"active_ingredient_concentration"` + DosagePerUnit float32 `gorm:"size:50;comment:一份药物的计量 (针剂计量单位为毫升, 粉剂为克)" json:"dosage_per_unit"` + ActiveIngredientConcentration float32 `gorm:"size:50;comment:有效成分含量百分比" json:"active_ingredient_concentration"` Manufacturer string `gorm:"size:100;comment:生产厂家" json:"manufacturer"` Instructions datatypes.JSON `gorm:"type:jsonb;comment:使用说明" json:"instructions"` } @@ -86,7 +86,7 @@ type MedicationLog struct { PigBatchID uint `gorm:"not null;index;comment:关联的猪批次ID"` MedicationID uint `gorm:"not null;index;comment:关联的药品ID"` Medication Medication `gorm:"foreignKey:MedicationID"` // 预加载药品信息 - DosageUsed float64 `gorm:"not null;comment:使用的总剂量 (单位由药品决定,如g或ml)"` + DosageUsed float32 `gorm:"not null;comment:使用的总剂量 (单位由药品决定,如g或ml)"` TargetCount int `gorm:"not null;comment:用药对象数量"` Reason MedicationReasonType `gorm:"size:20;not null;comment:用药原因"` Description string `gorm:"size:255;comment:具体描述,如'治疗呼吸道病'"` diff --git a/internal/infra/models/pig_batch.go b/internal/infra/models/pig_batch.go index 658c31b..37187c9 100644 --- a/internal/infra/models/pig_batch.go +++ b/internal/infra/models/pig_batch.go @@ -95,7 +95,7 @@ func (WeighingBatch) TableName() string { // WeighingRecord 记录了单次称重信息 type WeighingRecord struct { gorm.Model - Weight float64 `gorm:"not null;comment:单只猪重量 (kg)"` + Weight float32 `gorm:"not null;comment:单只猪重量 (kg)"` WeighingBatchID uint `gorm:"not null;index;comment:关联的批次称重ID"` PenID uint `gorm:"not null;index;comment:所在猪圈ID"` OperatorID uint `gorm:"not null;comment:操作员ID"` diff --git a/internal/infra/models/pig_trade.go b/internal/infra/models/pig_trade.go index 4d4e835..e46a716 100644 --- a/internal/infra/models/pig_trade.go +++ b/internal/infra/models/pig_trade.go @@ -13,8 +13,8 @@ type PigPurchase struct { PurchaseDate time.Time `gorm:"primaryKey;comment:采购日期"` Supplier string `gorm:"comment:供应商"` Quantity int `gorm:"not null;comment:采购数量"` - UnitPrice float64 `gorm:"not null;comment:单价"` - TotalPrice float64 `gorm:"not null;comment:总价"` + UnitPrice float32 `gorm:"not null;comment:单价"` + TotalPrice float32 `gorm:"not null;comment:总价"` Remarks string `gorm:"size:255;comment:备注"` OperatorID uint `gorm:"comment:操作员ID"` } @@ -30,8 +30,8 @@ type PigSale struct { SaleDate time.Time `gorm:"primaryKey;comment:销售日期"` Buyer string `gorm:"comment:购买方"` Quantity int `gorm:"not null;comment:销售数量"` - UnitPrice float64 `gorm:"not null;comment:单价"` - TotalPrice float64 `gorm:"not null;comment:总价"` + UnitPrice float32 `gorm:"not null;comment:单价"` + TotalPrice float32 `gorm:"not null;comment:总价"` Remarks string `gorm:"size:255;comment:备注"` OperatorID uint `gorm:"comment:操作员ID"` } diff --git a/internal/infra/models/sensor_data.go b/internal/infra/models/sensor_data.go index 804b164..a04481a 100644 --- a/internal/infra/models/sensor_data.go +++ b/internal/infra/models/sensor_data.go @@ -22,7 +22,7 @@ const ( // SignalMetrics 存储信号强度数据 type SignalMetrics struct { RssiDbm int `json:"rssi_dbm"` // 绝对信号强度(dBm),受距离、障碍物影响 - SnrDb float64 `json:"snr_db"` // 信号与噪声的相对比率(dB),由 RSSI 减去噪声地板(Noise Floor) + SnrDb float32 `json:"snr_db"` // 信号与噪声的相对比率(dB),由 RSSI 减去噪声地板(Noise Floor) SensitivityDbm int `json:"sensitivity_dbm"` // 网关的最低检测阈值(dBm) MarginDb int `json:"margin_db"` // SNR 相对于接收器灵敏度的余量, Margin = SNR - Sensitivity } @@ -36,17 +36,17 @@ type BatteryLevel struct { // TemperatureData 存储温度数据 type TemperatureData struct { - TemperatureCelsius float64 `json:"temperature_celsius"` // 温度值 (摄氏度) + TemperatureCelsius float32 `json:"temperature_celsius"` // 温度值 (摄氏度) } // HumidityData 存储湿度数据 type HumidityData struct { - HumidityPercent float64 `json:"humidity_percent"` // 湿度值 (%) + HumidityPercent float32 `json:"humidity_percent"` // 湿度值 (%) } // WeightData 存储重量数据 type WeightData struct { - WeightKilograms float64 `json:"weight_kilograms"` // 重量值 (公斤) + WeightKilograms float32 `json:"weight_kilograms"` // 重量值 (公斤) } // SensorData 存储所有类型的传感器数据,对应数据库中的 'sensor_data' 表。 diff --git a/internal/infra/transport/lora/lora_mesh_uart_passthrough_transport.go b/internal/infra/transport/lora/lora_mesh_uart_passthrough_transport.go index acebfcf..c719246 100644 --- a/internal/infra/transport/lora/lora_mesh_uart_passthrough_transport.go +++ b/internal/infra/transport/lora/lora_mesh_uart_passthrough_transport.go @@ -474,7 +474,7 @@ func (t *LoRaMeshUartPassthroughTransport) handleUpstreamMessage(ctx context.Con } valueDescriptor := valueDescriptors[0] - parsedValue := float64(rawSensorValue)*valueDescriptor.Multiplier + valueDescriptor.Offset + parsedValue := rawSensorValue*valueDescriptor.Multiplier + valueDescriptor.Offset var dataToRecord interface{} switch valueDescriptor.Type { @@ -486,7 +486,7 @@ func (t *LoRaMeshUartPassthroughTransport) handleUpstreamMessage(ctx context.Con dataToRecord = models.WeightData{WeightKilograms: parsedValue} default: logger.Warnf("未知的传感器类型 '%s',将使用通用格式记录", valueDescriptor.Type) - dataToRecord = map[string]float64{"value": parsedValue} + dataToRecord = map[string]float32{"value": parsedValue} } t.recordSensorData(loraCtx, areaController.ID, dev.ID, time.Now(), valueDescriptor.Type, dataToRecord)