package task import ( "fmt" "gorm.io/gorm" "time" "wms/models" "wms/pkg/logx" "wms/service" ) func MonthStats() (err error) { //加锁,只需要一个进程运行此任务 var ( lockName = "monthStats" serviceID = "wms" ) err = models.NewLockSearch().AcquireLock(lockName, serviceID) if err != nil { logx.Errorf("MonthStats 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("MonthStats ReleaseLock err:%v", err) service.SendAlarm("月度统计执行成功解锁失败", err.Error()) } }() date := time.Now().Format("2006-01") lastDate := time.Now().AddDate(0, -1, 0).Format("2006-01") oldRecords, err := models.NewMonthStatsSearch().SetDate(lastDate).SetFields("id, product_id").FindNotTotal() if err != nil { logx.Errorf("MonthStats get last date record err:%v", err) return } oldRecordsMap := models.MonthStatsMap(oldRecords) //本月期初数量/上月结余数量 statsRecords, err := service.GetCurrentStats(date, nil) if err != nil { return err } err = models.NewMonthStatsSearch().SetDate(date).Delete() if err != nil { return } for _, record := range statsRecords { record.BeginAmount = record.EndAmount record.BeginMoreUnits = record.EndMoreUnits err = models.WithTransaction(func(db *gorm.DB) error { err = models.NewMonthStatsSearch().SetOrm(db).Create(record) if err != nil { logx.Errorf("NewMonthStatsSearch Create err:%v, record: %+v", err, record) service.SendAlarm("月度统计创建本月失败", fmt.Sprintf("NewMonthStatsSearch Create err:%v, record: %+v", err, record)) } if oldRecordsMap[record.ProductId] != nil && oldRecordsMap[record.ProductId].Id != 0 { m := map[string]interface{}{ "end_more_units": record.BeginMoreUnits, "end_amount": record.BeginAmount, } if !record.InputAmount.IsZero() || !record.InputAmount.IsZero() { m["input_amount"] = record.InputAmount m["input_more_units"] = record.InputMoreUnits m["output_amount"] = record.InputAmount m["output_more_units"] = record.OutputMoreUnits } err = models.NewMonthStatsSearch().SetOrm(db).SetID(oldRecordsMap[record.ProductId].Id).UpdateByMap(m) if err != nil { logx.Errorf("NewMonthStatsSearch UpdateByMap err:%v, id:%v, m:%+v", err, oldRecordsMap[record.ProductId].Id, m) service.SendAlarm("月度统计更改上月失败", fmt.Sprintf("NewMonthStatsSearch Create err:%v, record: %+v", err, record)) } } return nil }) } if err == nil { service.SendAlarm("月度统计执行成功", "") } return }