zhangqian
2024-08-01 fc3313955a083c9480e4ea74398f72f9ba6addcd
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
90
91
92
93
94
95
96
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, false)
        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
}