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