product_code.go 1.4 KB
package redis

import (
	"fmt"
	"github.com/go-redis/redis"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant"
	"time"
)

func GenCode(ca CacheCode) (string, error) {
	key := ca.CacheKey()
	client := GetRedis()
	result := client.Get(key)
	index, err := result.Int()
	if err == redis.Nil {
		index = 1
		err = nil
		if ret := client.Set(key, index, ca.Expire()); ret.Err() != nil {
			return "", ret.Err()
		}
		return ca.Format(index), nil
	}
	if err != nil {
		return "", err
	}
	if ret := client.Incr(key); ret.Err() != nil {
		return "", ret.Err()
	} else {
		index = int(ret.Val())
	}
	return ca.Format(index), nil
}

type CacheCode interface {
	CacheKey() string
	Expire() time.Duration
	Format(index int) string
}

type ProductCodeCache struct {
	CompanyId int
	Time      time.Time
}

func (ca ProductCodeCache) CacheKey() string {
	str := fmt.Sprintf("%v:product-code:%v:%v", constant.CACHE_PREFIX, ca.CompanyId, ca.Time.Format("20060102"))
	return str
}
func (ca ProductCodeCache) Format(index int) string {
	if index <= 999 {
		return fmt.Sprintf("CP%v%03d", ca.Time.Format("060102"), index)
	}
	return fmt.Sprintf("CP%v%d", ca.Time.Format("060102"), index)
}
func (ca ProductCodeCache) Expire() time.Duration {
	return time.Hour * 24
}
func NewProductCodeCache(id int) ProductCodeCache {
	return ProductCodeCache{
		CompanyId: id,
		Time:      time.Now(),
	}
}