yinbentan
2024-07-08 f4508a84236a4aff1c7b5bfa17a14a8ff95728ba
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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
}