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