package task import ( "fmt" "gorm.io/gorm" "time" "wms/constvar" "wms/models" "wms/pkg/logx" "wms/service" ) func WarehouseMonthStats() (err error) { //加锁,只需要一个进程运行此任务 var ( lockName = "WarehouseMonthStats" serviceID = "wms" ) err = models.NewLockSearch().AcquireLock(lockName, serviceID) if err != nil { logx.Errorf("WarehouseMonthStats AcquireLock err:%v", err) return } defer func() { if err != nil { service.SendAlarm("月度统计执行失败", "报错: "+err.Error()) } err = models.NewLockSearch().ReleaseLock(lockName, serviceID) if err != nil { logx.Errorf("WarehouseMonthStats ReleaseLock err:%v", err) service.SendAlarm("月度统计执行成功解锁失败", err.Error()) } }() date := time.Now().Format("2006-01") lastDate := time.Now().AddDate(0, -1, 0).Format("2006-01") warehouses, err := models.NewWarehouseSearch().SetOpenMonthStats(constvar.BoolTypeTrue).FindNotTotal() if len(warehouses) == 0 { return } for _, warehouse := range warehouses { warehouseId := warehouse.Id oldRecords, err := models.NewWarehouseMonthStatsSearch(). SetDate(lastDate).SetWarehouseId(warehouseId).SetFields("id, product_id").FindNotTotal() if err != nil { logx.Errorf("WarehouseMonthStats get last date record err:%v", err) continue } oldRecordsMap := models.WarehouseMonthStatsMap(oldRecords) //本月期初数量/上月结余数量 statsRecords, err := service.GetCurrentWarehouseStats(date, warehouseId, nil) if err != nil { continue } err = models.NewWarehouseMonthStatsSearch().SetDate(date).Delete() if err != nil { continue } for _, record := range statsRecords { record.BeginAmount = record.EndAmount err = models.WithTransaction(func(db *gorm.DB) error { err = models.NewWarehouseMonthStatsSearch().SetOrm(db).Create(record) if err != nil { logx.Errorf("NewWarehouseMonthStatsSearch Create err:%v, record: %+v", err, record) service.SendAlarm("按仓库月度统计创建本月失败", fmt.Sprintf("NewWarehouseMonthStatsSearch Create err:%v, record: %+v", err, record)) } if oldRecordsMap[record.ProductId] != nil && oldRecordsMap[record.ProductId].Id != 0 { oldRecordsMap[record.ProductId].EndAmount = record.EndAmount if !record.InputAmount.IsZero() || !record.InputAmount.IsZero() { oldRecordsMap[record.ProductId].InputAmount = record.InputAmount oldRecordsMap[record.ProductId].InputItems = record.InputItems oldRecordsMap[record.ProductId].OutputAmount = record.OutputAmount oldRecordsMap[record.ProductId].OutputItems = record.OutputItems } err = models.NewWarehouseMonthStatsSearch().SetOrm(db).SetID(oldRecordsMap[record.ProductId].Id).Save(record) if err != nil { logx.Errorf("NewWarehouseMonthStatsSearch Save err:%v, record:%v", err, oldRecordsMap[record.ProductId]) service.SendAlarm("月度统计更改上月失败", fmt.Sprintf("NewWarehouseMonthStatsSearch Create err:%v, record: %+v", err, record)) } } return nil }) } } if err == nil { service.SendAlarm("按仓库月度统计执行成功", "") } return }