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
97
98
99
100
101
102
package service
 
import (
    "errors"
    "fmt"
    "github.com/spf13/cast"
    "gorm.io/gorm"
    "strings"
    "time"
    "wms/constvar"
    "wms/models"
)
 
type SystemConfigService struct {
}
 
func NewSystemConfigService() *SystemConfigService {
    return &SystemConfigService{}
}
 
func (slf SystemConfigService) ParamsCheck(params models.SystemConfig) (err error) {
    var oldRecord *models.SystemConfig
    if params.Id != 0 {
        oldRecord, err = models.NewSystemConfigSearch().SetID(params.ID).First()
        if err == gorm.ErrRecordNotFound {
            return errors.New("配置不存在")
        }
    }
    if oldRecord == nil || params.ConfigType != oldRecord.ConfigType {
        _, err = models.NewSystemConfigSearch().SetConfigType(params.ConfigType).First()
        if err != gorm.ErrRecordNotFound {
            return errors.New("配置项重复")
        }
    }
 
    switch params.ConfigType {
    case constvar.SystemConfigTypeInventoryCutOffPoint:
        _, _, err = slf.CheckInventoryCutOffPoint(params.Val)
        if err != nil {
            return err
        }
    }
 
    return nil
}
 
func (slf SystemConfigService) CheckInventoryCutOffPoint(val string) (day int, timeStr string, err error) {
    if !strings.Contains(val, "-") {
        err = errors.New("库存结算时间点应该用分隔符'-'分隔日期和时间")
        return
    }
    arr := strings.Split(val, "-")
    if len(arr) != 2 {
        err = errors.New("库存结算时间点应该用分隔符'-'分隔日期和时间,且只能有一个分隔符")
        return
    }
    day = cast.ToInt(arr[0])
    if day < 0 || day > 28 {
        err = errors.New("库存结算时间点日期不正确,应在1~28之间")
        return
    }
    timeStr = arr[1]
    _, err = time.ParseInLocation("15:04", arr[1], time.Local)
    return
}
 
func (slf SystemConfigService) GetInventoryCutOffPoint() (day int, timeStr string, err error) {
    config, err := models.NewSystemConfigSearch().SetConfigType(constvar.SystemConfigTypeInventoryCutOffPoint).First()
    if err == gorm.ErrRecordNotFound {
        config = &models.SystemConfig{
            Val: "01-00:01",
        }
    }
    if err != nil && err != gorm.ErrRecordNotFound {
        return
    }
    return slf.CheckInventoryCutOffPoint(config.Val)
}
 
func (slf SystemConfigService) GetInventoryCutOffTime() (beginTime, endTime time.Time, err error) {
    day, timeStr, err := slf.GetInventoryCutOffPoint()
    // 假设当前时间
    currentTime := time.Now()
    // 解析给定的时间字符串为 time 对象
    parsedTime, err := time.Parse("15:04", timeStr)
    if err != nil {
        fmt.Println("时间解析错误:", err)
        return
    }
 
    // 创建一个日期时间对象,假设在当前月的给定日和时间
    endTime = time.Date(currentTime.Year(), currentTime.Month(), day, parsedTime.Hour(), parsedTime.Minute(), 0, 0, currentTime.Location())
 
    // 如果给定的日期时间在当前时间之后,我们需要回到上个月
    if endTime.After(currentTime) {
        lastMonth := currentTime.AddDate(0, -1, 0)
        endTime = time.Date(lastMonth.Year(), lastMonth.Month(), day, parsedTime.Hour(), parsedTime.Minute(), 0, 0, currentTime.Location())
    }
    lastMonth := endTime.AddDate(0, -1, 0)
    beginTime = time.Date(lastMonth.Year(), lastMonth.Month(), day, parsedTime.Hour(), parsedTime.Minute(), 0, 0, currentTime.Location())
    return beginTime, endTime, nil
}