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 }