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
|
}
|