chore: 同步本地 v9 整改与运营能力

This commit is contained in:
weijuesen
2026-08-17 21:43:26 +08:00
parent 9a426039b7
commit d205d4845b
58 changed files with 4042 additions and 115 deletions
+53
View File
@@ -0,0 +1,53 @@
package service
// ProductionLossRow 产量损失统计原始行。
type ProductionLossRow struct {
BatchID string `gorm:"column:batch_id"`
RoomID string `gorm:"column:room_id"`
DeathCount int64 `gorm:"column:death_count"`
CulledCount int64 `gorm:"column:culled_count"`
YieldKg float64 `gorm:"column:yield_kg"`
LossKg float64 `gorm:"column:loss_kg"`
CostAmount float64 `gorm:"column:cost_amount"`
RecordCount int64 `gorm:"column:record_count"`
}
// ProductionLossStat 按房间/批次聚合后的产量损失统计。
type ProductionLossStat struct {
BatchID string `json:"batchId"`
RoomID string `json:"roomId"`
RoomName string `json:"roomName,omitempty"`
BatchName string `json:"batchName,omitempty"`
DeathCount int64 `json:"deathCount"`
CulledCount int64 `json:"culledCount"`
YieldKg float64 `json:"yieldKg"`
LossKg float64 `json:"lossKg"`
CostAmount float64 `json:"costAmount"`
RecordCount int64 `json:"recordCount"`
}
// AggregateProductionLoss 聚合产量损失记录;空输入返回空数组。
func AggregateProductionLoss(rows []ProductionLossRow) []ProductionLossStat {
byKey := make(map[string]*ProductionLossStat)
var order []string
for _, r := range rows {
key := r.RoomID + "|" + r.BatchID
stat, ok := byKey[key]
if !ok {
stat = &ProductionLossStat{RoomID: r.RoomID, BatchID: r.BatchID}
byKey[key] = stat
order = append(order, key)
}
stat.DeathCount += r.DeathCount
stat.CulledCount += r.CulledCount
stat.YieldKg += r.YieldKg
stat.LossKg += r.LossKg
stat.CostAmount += r.CostAmount
stat.RecordCount += r.RecordCount
}
result := make([]ProductionLossStat, 0, len(order))
for _, key := range order {
result = append(result, *byKey[key])
}
return result
}